core/state: prevent SetCode hook if contract code is not changed

This commit is contained in:
Gary Rong 2025-10-21 15:35:05 +08:00
parent 69df6bb8d5
commit 31c9d1186e

View file

@ -191,19 +191,20 @@ func (s *hookedStateDB) SetNonce(address common.Address, nonce uint64, reason tr
func (s *hookedStateDB) SetCode(address common.Address, code []byte, reason tracing.CodeChangeReason) []byte { func (s *hookedStateDB) SetCode(address common.Address, code []byte, reason tracing.CodeChangeReason) []byte {
prev := s.inner.SetCode(address, code, reason) prev := s.inner.SetCode(address, code, reason)
if s.hooks.OnCodeChangeV2 != nil || s.hooks.OnCodeChange != nil { if s.hooks.OnCodeChangeV2 != nil || s.hooks.OnCodeChange != nil {
prevHash := types.EmptyCodeHash prevHash := crypto.Keccak256Hash(prev)
if len(prev) != 0 {
prevHash = crypto.Keccak256Hash(prev)
}
codeHash := crypto.Keccak256Hash(code) codeHash := crypto.Keccak256Hash(code)
// Invoke the hooks only if the contract code is changed
if prevHash != codeHash {
if s.hooks.OnCodeChangeV2 != nil { if s.hooks.OnCodeChangeV2 != nil {
s.hooks.OnCodeChangeV2(address, prevHash, prev, codeHash, code, reason) s.hooks.OnCodeChangeV2(address, prevHash, prev, codeHash, code, reason)
} else if s.hooks.OnCodeChange != nil { } else if s.hooks.OnCodeChange != nil {
s.hooks.OnCodeChange(address, prevHash, prev, codeHash, code) s.hooks.OnCodeChange(address, prevHash, prev, codeHash, code)
} }
} }
}
return prev return prev
} }