core/state: fix hooks to account for setcode on non-empty code

This commit is contained in:
Martin Holst Swende 2024-12-02 14:07:31 +01:00 committed by lightclient
parent bd36423319
commit 3764d420c2
No known key found for this signature in database
GPG key ID: 75C916AFEE20183E
4 changed files with 18 additions and 7 deletions

View file

@ -20,6 +20,7 @@ import (
"bytes"
"fmt"
"maps"
"slices"
"time"
"github.com/ethereum/go-ethereum/common"
@ -541,9 +542,11 @@ func (s *stateObject) CodeSize() int {
return size
}
func (s *stateObject) SetCode(codeHash common.Hash, code []byte) {
func (s *stateObject) SetCode(codeHash common.Hash, code []byte) (prev []byte) {
s.db.journal.setCode(s.address)
prev = slices.Clone(s.code)
s.setCode(codeHash, code)
return prev
}
func (s *stateObject) setCode(codeHash common.Hash, code []byte) {

View file

@ -439,11 +439,12 @@ func (s *StateDB) SetNonce(addr common.Address, nonce uint64) {
}
}
func (s *StateDB) SetCode(addr common.Address, code []byte) {
func (s *StateDB) SetCode(addr common.Address, code []byte) (prev []byte) {
stateObject := s.getOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetCode(crypto.Keccak256Hash(code), code)
return stateObject.SetCode(crypto.Keccak256Hash(code), code)
}
return nil
}
func (s *StateDB) SetState(addr common.Address, key, value common.Hash) common.Hash {

View file

@ -182,11 +182,16 @@ func (s *hookedStateDB) SetNonce(address common.Address, nonce uint64) {
}
}
func (s *hookedStateDB) SetCode(address common.Address, code []byte) {
s.inner.SetCode(address, code)
func (s *hookedStateDB) SetCode(address common.Address, code []byte) []byte {
prev := s.inner.SetCode(address, code)
if s.hooks.OnCodeChange != nil {
s.hooks.OnCodeChange(address, types.EmptyCodeHash, nil, crypto.Keccak256Hash(code), code)
prevHash := types.EmptyCodeHash
if len(prev) != 0 {
prevHash = crypto.Keccak256Hash(prev)
}
s.hooks.OnCodeChange(address, prevHash, prev, crypto.Keccak256Hash(code), code)
}
return prev
}
func (s *hookedStateDB) SetState(address common.Address, key common.Hash, value common.Hash) common.Hash {

View file

@ -42,7 +42,9 @@ type StateDB interface {
GetCodeHash(common.Address) common.Hash
GetCode(common.Address) []byte
SetCode(common.Address, []byte)
// SetCode sets the new code for the address, and returns the previous code, if any.
SetCode(common.Address, []byte) []byte
GetCodeSize(common.Address) int
AddRefund(uint64)