mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-03-04 02:23:48 +00:00
This moves call and create to the specified environments. Vms are no longer re-used. Vm uses environment's Call(Code) and Create in order to execute new contracts or transfer value between accounts. State transition now uses the same mechanism described above.
63 lines
2.1 KiB
Go
63 lines
2.1 KiB
Go
package chain
|
|
|
|
import (
|
|
"math/big"
|
|
|
|
"github.com/ethereum/go-ethereum/chain/types"
|
|
"github.com/ethereum/go-ethereum/state"
|
|
"github.com/ethereum/go-ethereum/vm"
|
|
)
|
|
|
|
type VMEnv struct {
|
|
state *state.State
|
|
block *types.Block
|
|
tx *types.Transaction
|
|
depth int
|
|
}
|
|
|
|
func NewEnv(state *state.State, tx *types.Transaction, block *types.Block) *VMEnv {
|
|
return &VMEnv{
|
|
state: state,
|
|
block: block,
|
|
tx: tx,
|
|
}
|
|
}
|
|
|
|
func (self *VMEnv) Origin() []byte { return self.tx.Sender() }
|
|
func (self *VMEnv) BlockNumber() *big.Int { return self.block.Number }
|
|
func (self *VMEnv) PrevHash() []byte { return self.block.PrevHash }
|
|
func (self *VMEnv) Coinbase() []byte { return self.block.Coinbase }
|
|
func (self *VMEnv) Time() int64 { return self.block.Time }
|
|
func (self *VMEnv) Difficulty() *big.Int { return self.block.Difficulty }
|
|
func (self *VMEnv) BlockHash() []byte { return self.block.Hash() }
|
|
func (self *VMEnv) Value() *big.Int { return self.tx.Value }
|
|
func (self *VMEnv) State() *state.State { return self.state }
|
|
func (self *VMEnv) GasLimit() *big.Int { return self.block.GasLimit }
|
|
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) *Execution {
|
|
evm := vm.New(self, vm.DebugVmTy)
|
|
|
|
return NewExecution(evm, addr, data, gas, price, value)
|
|
}
|
|
|
|
func (self *VMEnv) Call(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
|
|
exe := self.vm(addr, data, gas, price, value)
|
|
return exe.Call(addr, me)
|
|
}
|
|
func (self *VMEnv) CallCode(me vm.ClosureRef, addr, data []byte, gas, price, value *big.Int) ([]byte, error) {
|
|
exe := self.vm(me.Address(), data, gas, price, value)
|
|
return exe.Call(addr, me)
|
|
}
|
|
|
|
func (self *VMEnv) Create(me 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(me)
|
|
}
|