diff --git a/cmd/evm/blockrunner.go b/cmd/evm/blockrunner.go index d5cd8d8e3d..8cc715c5a3 100644 --- a/cmd/evm/blockrunner.go +++ b/cmd/evm/blockrunner.go @@ -86,7 +86,7 @@ func blockTestCmd(ctx *cli.Context) error { continue } test := tests[name] - if err := test.Run(false, rawdb.HashScheme, false, tracer, func(res error, chain *core.BlockChain) { + if err := test.Run(false, rawdb.HashScheme, true, tracer, func(res error, chain *core.BlockChain) { if ctx.Bool(DumpFlag.Name) { if state, _ := chain.State(); state != nil { fmt.Println(string(state.Dump(nil))) diff --git a/core/state_transition.go b/core/state_transition.go index 1cc2432928..e3c519e1f9 100644 --- a/core/state_transition.go +++ b/core/state_transition.go @@ -479,8 +479,11 @@ func (st *StateTransition) TransitionDb() (*ExecutionResult, error) { } // Check the authority account 1) doesn't have code or has exisiting // delegation 2) matches the auth's nonce - st.state.AddAddressToAccessList(authority) code := st.state.GetCode(authority) + st.state.AddAddressToAccessList(authority) + if witness := st.state.Witness(); witness != nil { + witness.AddCode(code) + } if _, ok := types.ParseDelegation(code); len(code) != 0 && !ok { continue } diff --git a/core/vm/evm.go b/core/vm/evm.go index 1c7efe5c85..164a3d91ea 100644 --- a/core/vm/evm.go +++ b/core/vm/evm.go @@ -232,6 +232,7 @@ func (evm *EVM) Call(caller ContractRef, addr common.Address, input []byte, gas // The contract is a scoped environment for this execution context only. code := evm.StateDB.ResolveCode(addr) if witness := evm.StateDB.Witness(); witness != nil { + witness.AddCode(evm.StateDB.GetCode(addr)) witness.AddCode(code) } if len(code) == 0 { @@ -302,6 +303,7 @@ func (evm *EVM) CallCode(caller ContractRef, addr common.Address, input []byte, // The contract is a scoped environment for this execution context only. contract := NewContract(caller, AccountRef(caller.Address()), value, gas) if witness := evm.StateDB.Witness(); witness != nil { + witness.AddCode(evm.StateDB.GetCode(addrCopy)) witness.AddCode(evm.StateDB.ResolveCode(addrCopy)) } contract.SetCallCode(&addrCopy, evm.StateDB.ResolveCodeHash(addrCopy), evm.StateDB.ResolveCode(addrCopy)) @@ -352,6 +354,7 @@ func (evm *EVM) DelegateCall(caller ContractRef, addr common.Address, input []by // Initialise a new contract and make initialise the delegate values contract := NewContract(caller, AccountRef(caller.Address()), nil, gas).AsDelegate() if witness := evm.StateDB.Witness(); witness != nil { + witness.AddCode(evm.StateDB.GetCode(addrCopy)) witness.AddCode(evm.StateDB.ResolveCode(addrCopy)) } contract.SetCallCode(&addrCopy, evm.StateDB.ResolveCodeHash(addrCopy), evm.StateDB.ResolveCode(addrCopy)) @@ -410,6 +413,7 @@ func (evm *EVM) StaticCall(caller ContractRef, addr common.Address, input []byte // The contract is a scoped environment for this execution context only. contract := NewContract(caller, AccountRef(addrCopy), new(uint256.Int), gas) if witness := evm.StateDB.Witness(); witness != nil { + witness.AddCode(evm.StateDB.GetCode(addrCopy)) witness.AddCode(evm.StateDB.ResolveCode(addrCopy)) } contract.SetCallCode(&addrCopy, evm.StateDB.ResolveCodeHash(addrCopy), evm.StateDB.ResolveCode(addrCopy)) diff --git a/core/vm/instructions.go b/core/vm/instructions.go index b3ddad97db..da312e8260 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -342,6 +342,7 @@ func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) slot := scope.Stack.peek() address := slot.Bytes20() if witness := interpreter.evm.StateDB.Witness(); witness != nil { + witness.AddCode(interpreter.evm.StateDB.GetCode(address)) witness.AddCode(interpreter.evm.StateDB.ResolveCode(address)) } slot.SetUint64(uint64(len(interpreter.evm.StateDB.ResolveCode(slot.Bytes20())))) @@ -384,6 +385,7 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) addr := common.Address(a.Bytes20()) code := interpreter.evm.StateDB.ResolveCode(addr) if witness := interpreter.evm.StateDB.Witness(); witness != nil { + witness.AddCode(interpreter.evm.StateDB.GetCode(addr)) witness.AddCode(code) } codeCopy := getData(code, uint64CodeOffset, length.Uint64())