aboutsummaryrefslogtreecommitdiffstats
path: root/core/vm/evm.go
diff options
context:
space:
mode:
authorPaweł Bylica <chfast@gmail.com>2018-09-08 00:13:25 +0800
committerGuillaume Ballet <gballet@gmail.com>2018-09-08 00:13:25 +0800
commitae992a5d73311742389fce3f855575be98fc6972 (patch)
tree3ec8d1c90aea8f5b90e8866ac67052cb83f0ad1b /core/vm/evm.go
parent8b9b149d5412dd3c775caf4fc3df39ebad90184f (diff)
downloaddexon-ae992a5d73311742389fce3f855575be98fc6972.tar
dexon-ae992a5d73311742389fce3f855575be98fc6972.tar.gz
dexon-ae992a5d73311742389fce3f855575be98fc6972.tar.bz2
dexon-ae992a5d73311742389fce3f855575be98fc6972.tar.lz
dexon-ae992a5d73311742389fce3f855575be98fc6972.tar.xz
dexon-ae992a5d73311742389fce3f855575be98fc6972.tar.zst
dexon-ae992a5d73311742389fce3f855575be98fc6972.zip
core/vm: Hide read only flag from Interpreter interface (#17461)
Makes Interface interface a bit more stateless and abstract. Obviously this change is dictated by EVMC design. The EVMC tries to keep the responsibility for EVM features totally inside the VMs, if feasible. This makes VM "stateless" because VM does not need to pass any information between executions, all information is included in parameters of the execute function.
Diffstat (limited to 'core/vm/evm.go')
-rw-r--r--core/vm/evm.go21
1 files changed, 7 insertions, 14 deletions
diff --git a/core/vm/evm.go b/core/vm/evm.go
index a24f6f386..58618f811 100644
--- a/core/vm/evm.go
+++ b/core/vm/evm.go
@@ -41,7 +41,7 @@ type (
)
// run runs the given contract and takes care of running precompiles with a fallback to the byte code interpreter.
-func run(evm *EVM, contract *Contract, input []byte) ([]byte, error) {
+func run(evm *EVM, contract *Contract, input []byte, readOnly bool) ([]byte, error) {
if contract.CodeAddr != nil {
precompiles := PrecompiledContractsHomestead
if evm.ChainConfig().IsByzantium(evm.BlockNumber) {
@@ -61,7 +61,7 @@ func run(evm *EVM, contract *Contract, input []byte) ([]byte, error) {
}(evm.interpreter)
evm.interpreter = interpreter
}
- return interpreter.Run(contract, input)
+ return interpreter.Run(contract, input, readOnly)
}
}
return nil, ErrNoCompatibleInterpreter
@@ -210,7 +210,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas
evm.vmConfig.Tracer.CaptureEnd(ret, gas-contract.Gas, time.Since(start), err)
}()
}
- ret, err = run(evm, contract, input)
+ ret, err = run(evm, contract, input, false)
// When an error was returned by the EVM or when setting the creation code
// above we revert to the snapshot and consume any gas remaining. Additionally
@@ -255,7 +255,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte,
contract := NewContract(caller, to, value, gas)
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
- ret, err = run(evm, contract, input)
+ ret, err = run(evm, contract, input, false)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -288,7 +288,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by
contract := NewContract(caller, to, nil, gas).AsDelegate()
contract.SetCallCode(&addr, evm.StateDB.GetCodeHash(addr), evm.StateDB.GetCode(addr))
- ret, err = run(evm, contract, input)
+ ret, err = run(evm, contract, input, false)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -310,13 +310,6 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte
if evm.depth > int(params.CallCreateDepth) {
return nil, gas, ErrDepth
}
- // Make sure the readonly is only set if we aren't in readonly yet
- // this makes also sure that the readonly flag isn't removed for
- // child calls.
- if !evm.interpreter.IsReadOnly() {
- evm.interpreter.SetReadOnly(true)
- defer func() { evm.interpreter.SetReadOnly(false) }()
- }
var (
to = AccountRef(addr)
@@ -331,7 +324,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte
// When an error was returned by the EVM or when setting the creation code
// above we revert to the snapshot and consume any gas remaining. Additionally
// when we're in Homestead this also counts for code storage gas errors.
- ret, err = run(evm, contract, input)
+ ret, err = run(evm, contract, input, true)
if err != nil {
evm.StateDB.RevertToSnapshot(snapshot)
if err != errExecutionReverted {
@@ -382,7 +375,7 @@ func (evm *EVM) create(caller ContractRef, code []byte, gas uint64, value *big.I
}
start := time.Now()
- ret, err := run(evm, contract, nil)
+ ret, err := run(evm, contract, nil, false)
// check whether the max code size has been exceeded
maxCodeSizeExceeded := evm.ChainConfig().IsEIP158(evm.BlockNumber) && len(ret) > params.MaxCodeSize