add block hash read hook

This commit is contained in:
Sina Mahmoodi 2024-10-03 14:07:30 +02:00
parent 702a42feea
commit c915bed5e8
3 changed files with 11 additions and 0 deletions

View File

@ -189,6 +189,9 @@ type (
// StorageReadHook is called when EVM reads a storage slot of an account. // StorageReadHook is called when EVM reads a storage slot of an account.
StorageReadHook = func(addr common.Address, slot, value common.Hash) StorageReadHook = func(addr common.Address, slot, value common.Hash)
// BlockHashReadHook is called when EVM reads the blockhash of a block.
BlockHashReadHook = func(blockNumber uint64, hash common.Hash)
) )
type Hooks struct { type Hooks struct {
@ -223,6 +226,8 @@ type Hooks struct {
OnCodeSizeRead CodeSizeReadHook OnCodeSizeRead CodeSizeReadHook
OnCodeHashRead CodeHashReadHook OnCodeHashRead CodeHashReadHook
OnStorageRead StorageReadHook OnStorageRead StorageReadHook
// Block hash read
OnBlockHashRead BlockHashReadHook
} }
// BalanceChangeReason is used to indicate the reason for a balance change, useful // BalanceChangeReason is used to indicate the reason for a balance change, useful

View File

@ -455,6 +455,9 @@ func opBlockhash(pc *uint64, interpreter *EVMInterpreter, scope *ScopeContext) (
if witness := interpreter.evm.StateDB.Witness(); witness != nil { if witness := interpreter.evm.StateDB.Witness(); witness != nil {
witness.AddBlockHash(num64) witness.AddBlockHash(num64)
} }
if tracer := interpreter.evm.Config.Tracer; tracer != nil && tracer.OnBlockHashRead != nil {
tracer.OnBlockHashRead(num64, res)
}
num.SetBytes(res[:]) num.SetBytes(res[:])
} else { } else {
num.Clear() num.Clear()

View File

@ -48,6 +48,7 @@ func newNoopTracer(_ json.RawMessage) (*tracing.Hooks, error) {
OnCodeSizeRead: t.OnCodeSizeRead, OnCodeSizeRead: t.OnCodeSizeRead,
OnCodeHashRead: t.OnCodeHashRead, OnCodeHashRead: t.OnCodeHashRead,
OnStorageRead: t.OnStorageRead, OnStorageRead: t.OnStorageRead,
OnBlockHashRead: t.OnBlockHashRead,
}, nil }, nil
} }
@ -113,5 +114,7 @@ func (t *noop) OnCodeHashRead(addr common.Address, hash common.Hash) {}
func (t *noop) OnStorageRead(addr common.Address, slot, val common.Hash) {} func (t *noop) OnStorageRead(addr common.Address, slot, val common.Hash) {}
func (t *noop) OnBlockHashRead(number uint64, hash common.Hash) {}
func (t *noop) OnGasChange(old, new uint64, reason tracing.GasChangeReason) { func (t *noop) OnGasChange(old, new uint64, reason tracing.GasChangeReason) {
} }