mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2024-12-25 13:07:17 +00:00
99853ac3ce
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.
64 lines
2.1 KiB
Go
64 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)
|
|
}
|