|
|
|
@ -2,6 +2,8 @@ package utils |
|
|
|
|
|
|
|
|
|
import ( |
|
|
|
|
"math/big" |
|
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/chain" |
|
|
|
|
"github.com/ethereum/go-ethereum/chain/types" |
|
|
|
|
"github.com/ethereum/go-ethereum/state" |
|
|
|
|
"github.com/ethereum/go-ethereum/vm" |
|
|
|
@ -13,6 +15,9 @@ type VMEnv struct { |
|
|
|
|
|
|
|
|
|
transactor []byte |
|
|
|
|
value *big.Int |
|
|
|
|
|
|
|
|
|
depth int |
|
|
|
|
Gas *big.Int |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func NewEnv(state *state.State, block *types.Block, transactor []byte, value *big.Int) *VMEnv { |
|
|
|
@ -34,7 +39,34 @@ func (self *VMEnv) BlockHash() []byte { return self.block.Hash() } |
|
|
|
|
func (self *VMEnv) Value() *big.Int { return self.value } |
|
|
|
|
func (self *VMEnv) State() *state.State { return self.state } |
|
|
|
|
func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit } |
|
|
|
|
func (self *VMEnv) AddLog(*state.Log) {} |
|
|
|
|
func (self *VMEnv) Depth() int { return self.depth } |
|
|
|
|
func (self *VMEnv) SetDepth(i int) { self.depth = i } |
|
|
|
|
func (self *VMEnv) AddLog(log *state.Log) { |
|
|
|
|
self.state.AddLog(log) |
|
|
|
|
} |
|
|
|
|
func (self *VMEnv) Transfer(from, to vm.Account, amount *big.Int) error { |
|
|
|
|
return vm.Transfer(from, to, amount) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *VMEnv) vm(addr, data []byte, gas, price, value *big.Int) *chain.Execution { |
|
|
|
|
evm := vm.New(self, vm.DebugVmTy) |
|
|
|
|
|
|
|
|
|
return chain.NewExecution(evm, addr, data, gas, price, value) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *VMEnv) Call(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { |
|
|
|
|
exe := self.vm(addr, data, gas, price, value) |
|
|
|
|
ret, err := exe.Call(addr, caller) |
|
|
|
|
self.Gas = exe.Gas |
|
|
|
|
|
|
|
|
|
return ret, err |
|
|
|
|
} |
|
|
|
|
func (self *VMEnv) CallCode(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) { |
|
|
|
|
exe := self.vm(caller.Address(), data, gas, price, value) |
|
|
|
|
return exe.Call(addr, caller) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (self *VMEnv) Create(caller vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error, vm.ClosureRef) { |
|
|
|
|
exe := self.vm(addr, data, gas, price, value) |
|
|
|
|
return exe.Create(caller) |
|
|
|
|
} |
|
|
|
|