From 6c97819d94262eb2a581be84592555536b455602 Mon Sep 17 00:00:00 2001 From: Marius van der Wijden Date: Wed, 26 Jun 2024 11:32:57 +0200 Subject: [PATCH] core/vm: fix opExtCode{Size,Hash,Copy} --- core/state/statedb.go | 7 ------- core/vm/instructions.go | 22 ++++++++++++++++++---- core/vm/interface.go | 1 - 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/state/statedb.go b/core/state/statedb.go index 71e13fe7d1..dd88ba9799 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -473,13 +473,6 @@ func (s *StateDB) SetCode(addr common.Address, code []byte) { } } -func (s *StateDB) SetCodeEOF(addr common.Address, code []byte) { - stateObject := s.getOrNewStateObject(addr) - if stateObject != nil { - stateObject.SetCode(types.EmptyEOFCodeHash, code) - } -} - func (s *StateDB) SetState(addr common.Address, key, value common.Hash) { stateObject := s.getOrNewStateObject(addr) if stateObject != nil { diff --git a/core/vm/instructions.go b/core/vm/instructions.go index eb1c13a8be..a2eb9e9a95 100644 --- a/core/vm/instructions.go +++ b/core/vm/instructions.go @@ -357,7 +357,12 @@ func opExtCodeSize(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) witness.AddCode(interpreter.evm.StateDB.GetCode(address)) witness.AddCode(interpreter.evm.StateDB.ResolveCode(address)) } - slot.SetUint64(uint64(len(interpreter.evm.StateDB.ResolveCode(slot.Bytes20())))) + code := interpreter.evm.StateDB.GetCode(slot.Bytes20()) + if isEOFVersion1(code) { + slot.SetUint64(2) + } else { + slot.SetUint64(uint64(len(interpreter.evm.StateDB.ResolveCode(slot.Bytes20())))) + } return nil, nil } @@ -389,6 +394,7 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) memOffset = stack.pop() codeOffset = stack.pop() length = stack.pop() + lengthU64 = length.Uint64() ) uint64CodeOffset, overflow := codeOffset.Uint64WithOverflow() if overflow { @@ -400,8 +406,11 @@ func opExtCodeCopy(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) witness.AddCode(interpreter.evm.StateDB.GetCode(addr)) witness.AddCode(code) } - codeCopy := getData(code, uint64CodeOffset, length.Uint64()) - scope.Memory.Set(memOffset.Uint64(), length.Uint64(), codeCopy) + if isEOFVersion1(code) { + lengthU64 = 2 + } + codeCopy := getData(code, uint64CodeOffset, lengthU64) + scope.Memory.Set(memOffset.Uint64(), lengthU64, codeCopy) return nil, nil } @@ -441,7 +450,12 @@ func opExtCodeHash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) if interpreter.evm.StateDB.Empty(address) { slot.Clear() } else { - slot.SetBytes(interpreter.evm.StateDB.ResolveCodeHash(address).Bytes()) + code := interpreter.evm.StateDB.GetCode(address) + if HasEOFByte(code) { + slot.SetFromHex("0x9dbf3648db8210552e9c4f75c6a1c3057c0ca432043bd648be15fe7be05646f5") + } else { + slot.SetBytes(interpreter.evm.StateDB.ResolveCodeHash(address).Bytes()) + } } return nil, nil } diff --git a/core/vm/interface.go b/core/vm/interface.go index 74f9b2a5fa..6079ca7847 100644 --- a/core/vm/interface.go +++ b/core/vm/interface.go @@ -43,7 +43,6 @@ type StateDB interface { GetCodeHash(common.Address) common.Hash GetCode(common.Address) []byte SetCode(common.Address, []byte) - SetCodeEOF(common.Address, []byte) GetCodeSize(common.Address) int ResolveCodeHash(common.Address) common.Hash