Documentation
¶
Overview ¶
Package tracing defines hooks for 'live tracing' of block processing and transaction execution. Here we define the low-level Hooks object that carries hooks which are invoked by the go-ethereum core at various points in the state transition.
To create a tracer that can be invoked with Geth, you need to register it using github.com/ethereum/go-ethereum/eth/tracers.LiveDirectory.Register.
See https://geth.ethereum.org/docs/developers/evm-tracing/live-tracing for a tutorial.
Index ¶
- type AccountChange
- type BalanceChangeHook
- type BalanceChangeReason
- type BlockEndHook
- type BlockEvent
- type BlockHashReadHook
- type BlockStartHook
- type BlockchainInitHook
- type CloseHook
- type CodeChange
- type CodeChangeHook
- type CodeChangeHookV2
- type CodeChangeReason
- type ContractCode
- type EnterHook
- type ExitHook
- type FaultHook
- type Gas
- type GasChangeHook
- type GasChangeHookV2
- type GasChangeReason
- type GenesisBlockHook
- type Hooks
- type LogHook
- type NonceChangeHook
- type NonceChangeHookV2
- type NonceChangeReason
- type OnSystemCallEndHook
- type OnSystemCallStartHook
- type OnSystemCallStartHookV2
- type OpContext
- type OpcodeHook
- type SkippedBlockHook
- type StateDB
- type StateUpdate
- type StateUpdateHook
- type StorageChange
- type StorageChangeHook
- type TrieNodeChange
- type TxEndHook
- type TxStartHook
- type VMContext
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AccountChange ¶ added in v1.17.0
type AccountChange struct {
Prev *types.StateAccount // nil if account was created
New *types.StateAccount // nil if account was deleted
}
AccountChange represents a change to an account's state.
type BalanceChangeHook ¶
type BalanceChangeHook = func(addr common.Address, prev, new *big.Int, reason BalanceChangeReason)
BalanceChangeHook is called when the balance of an account changes.
type BalanceChangeReason ¶
type BalanceChangeReason byte
BalanceChangeReason is used to indicate the reason for a balance change, useful for tracing and reporting.
const ( BalanceChangeUnspecified BalanceChangeReason = 0 // Issuance // BalanceIncreaseRewardMineUncle is a reward for mining an uncle block. BalanceIncreaseRewardMineUncle BalanceChangeReason = 1 // BalanceIncreaseRewardMineBlock is a reward for mining a block. BalanceIncreaseRewardMineBlock BalanceChangeReason = 2 // BalanceIncreaseWithdrawal is ether withdrawn from the beacon chain. BalanceIncreaseWithdrawal BalanceChangeReason = 3 // BalanceIncreaseGenesisBalance is ether allocated at the genesis block. BalanceIncreaseGenesisBalance BalanceChangeReason = 4 // Transaction fees // BalanceIncreaseRewardTransactionFee is the transaction tip increasing block builder's balance. BalanceIncreaseRewardTransactionFee BalanceChangeReason = 5 // BalanceDecreaseGasBuy is spent to purchase gas for execution a transaction. // Part of this gas will be burnt as per EIP-1559 rules. BalanceDecreaseGasBuy BalanceChangeReason = 6 // BalanceIncreaseGasReturn is ether returned for unused gas at the end of execution. BalanceIncreaseGasReturn BalanceChangeReason = 7 // DAO fork // BalanceIncreaseDaoContract is ether sent to the DAO refund contract. BalanceIncreaseDaoContract BalanceChangeReason = 8 // BalanceDecreaseDaoAccount is ether taken from a DAO account to be moved to the refund contract. BalanceDecreaseDaoAccount BalanceChangeReason = 9 // BalanceChangeTransfer is ether transferred via a call. // it is a decrease for the sender and an increase for the recipient. BalanceChangeTransfer BalanceChangeReason = 10 // BalanceChangeTouchAccount is a transfer of zero value. It is only there to // touch-create an account. BalanceChangeTouchAccount BalanceChangeReason = 11 // BalanceIncreaseSelfdestruct is added to the recipient as indicated by a selfdestructing account. BalanceIncreaseSelfdestruct BalanceChangeReason = 12 // BalanceDecreaseSelfdestruct is deducted from a contract due to self-destruct. BalanceDecreaseSelfdestruct BalanceChangeReason = 13 // BalanceDecreaseSelfdestructBurn is ether that is sent to an already self-destructed // account within the same tx (captured at end of tx). // Note it doesn't account for a self-destruct which appoints itself as recipient. BalanceDecreaseSelfdestructBurn BalanceChangeReason = 14 // BalanceChangeRevert is emitted when the balance is reverted back to a previous value due to call failure. // It is only emitted when the tracer has opted in to use the journaling wrapper (WrapWithJournal). BalanceChangeRevert BalanceChangeReason = 15 )
func (BalanceChangeReason) String ¶ added in v1.14.4
func (i BalanceChangeReason) String() string
type BlockEndHook ¶
type BlockEndHook = func(err error)
BlockEndHook is called after executing a block.
type BlockEvent ¶
BlockEvent is emitted upon tracing an incoming block. It contains the block as well as consensus related information.
type BlockHashReadHook ¶ added in v1.15.0
BlockHashReadHook is called when EVM reads the blockhash of a block.
type BlockStartHook ¶
type BlockStartHook = func(event BlockEvent)
BlockStartHook is called before executing `block`. `td` is the total difficulty prior to `block`.
type BlockchainInitHook ¶
type BlockchainInitHook = func(chainConfig *params.ChainConfig)
BlockchainInitHook is called when the blockchain is initialized.
type CodeChange ¶ added in v1.17.0
type CodeChange struct {
Prev *ContractCode // nil if no code existed before
New *ContractCode
}
CodeChange represents a change in contract code of an account.
type CodeChangeHook ¶
type CodeChangeHook = func(addr common.Address, prevCodeHash common.Hash, prevCode []byte, codeHash common.Hash, code []byte)
CodeChangeHook is called when the code of an account changes.
type CodeChangeHookV2 ¶ added in v1.16.4
type CodeChangeHookV2 = func(addr common.Address, prevCodeHash common.Hash, prevCode []byte, codeHash common.Hash, code []byte, reason CodeChangeReason)
CodeChangeHookV2 is called when the code of an account changes.
type CodeChangeReason ¶ added in v1.16.4
type CodeChangeReason byte
CodeChangeReason is used to indicate the reason for a code change.
const ( CodeChangeUnspecified CodeChangeReason = 0 // CodeChangeContractCreation is when a new contract is deployed via CREATE/CREATE2 operations. CodeChangeContractCreation CodeChangeReason = 1 // CodeChangeGenesis is when contract code is set during blockchain genesis or initial setup. CodeChangeGenesis CodeChangeReason = 2 // CodeChangeAuthorization is when code is set via EIP-7702 Set Code Authorization. CodeChangeAuthorization CodeChangeReason = 3 // CodeChangeAuthorizationClear is when EIP-7702 delegation is cleared by setting to zero address. CodeChangeAuthorizationClear CodeChangeReason = 4 // CodeChangeSelfDestruct is when contract code is cleared due to self-destruct. CodeChangeSelfDestruct CodeChangeReason = 5 // CodeChangeRevert is emitted when the code is reverted back to a previous value due to call failure. // It is only emitted when the tracer has opted in to use the journaling wrapper (WrapWithJournal). CodeChangeRevert CodeChangeReason = 6 )
func (CodeChangeReason) String ¶ added in v1.16.4
func (i CodeChangeReason) String() string
type ContractCode ¶ added in v1.17.0
type EnterHook ¶
type EnterHook = func(depth int, typ byte, from common.Address, to common.Address, input []byte, gas uint64, value *big.Int)
EnterHook is invoked when the processing of a message starts.
Take note that EnterHook, when in the context of a live tracer, can be invoked outside of the `OnTxStart` and `OnTxEnd` hooks when dealing with system calls, see OnSystemCallStartHook and OnSystemCallEndHook for more information.
type ExitHook ¶
ExitHook is invoked when the processing of a message ends. `revert` is true when there was an error during the execution. Exceptionally, before the homestead hardfork a contract creation that ran out of gas when attempting to persist the code to database did not count as a call failure and did not cause a revert of the call. This will be indicated by `reverted == false` and `err == ErrCodeStoreOutOfGas`.
Take note that ExitHook, when in the context of a live tracer, can be invoked outside of the `OnTxStart` and `OnTxEnd` hooks when dealing with system calls, see OnSystemCallStartHook and OnSystemCallEndHook for more information.
type Gas ¶ added in v1.17.4
type Gas struct {
Regular uint64 // Regular is the budget for ordinary execution gas.
State uint64 // State is the budget dedicated to state-access gas (zero pre-Amsterdam).
}
Gas represents a multi-dimensional gas budget introduced by EIP-8037. It carries the regular execution gas and the state-access gas, which are metered independently from the Amsterdam fork onwards.
Before Amsterdam, gas metering is single-dimensional and only the Regular field is meaningful; State is always zero. The struct is shaped so that pre-Amsterdam call sites can populate it as Gas{Regular: g} without loss of fidelity relative to the legacy single-uint64 hook.
type GasChangeHook ¶
type GasChangeHook = func(old, new uint64, reason GasChangeReason)
GasChangeHook reports changes to the regular execution gas. Tracers that don't need visibility into the state-access gas dimension introduced by EIP-8037 (Amsterdam) can implement only this hook; it will continue to fire across the Amsterdam fork unchanged.
If both this hook and GasChangeHookV2 are implemented on the same tracer, only V2 will be invoked. Implement exactly one to avoid double-counting.
type GasChangeHookV2 ¶ added in v1.17.4
type GasChangeHookV2 = func(old, new Gas, reason GasChangeReason)
GasChangeHookV2 is invoked when any gas dimension changes. It is the multi-dimensional successor to GasChangeHook, exposing the state-access gas dimension introduced by EIP-8037 (Amsterdam) alongside the regular dimension.
Compatibility:
- Post-Amsterdam: fires for changes to either the regular or the state-access dimension. The non-changing dimension is passed through unchanged in both `old` and `new` so consumers always observe the complete gas vector.
- Pre-Amsterdam: no state-access gas events occur, so the State field of both `old` and `new` is always zero. Tracers that register only V2 still receive every regular-gas change as Gas{State: 0} and behave identically to a V1 tracer; there is no pre-Amsterdam event a V2-only tracer misses.
V1 and V2 coexist: when both are registered on a tracer, only V2 is invoked. Tracers SHOULD register at most one of the two to avoid double-counting.
type GasChangeReason ¶
type GasChangeReason byte
GasChangeReason is used to indicate the reason for a gas change, useful for tracing and reporting.
There is essentially two types of gas changes, those that can be emitted once per transaction and those that can be emitted on a call basis, so possibly multiple times per transaction.
They can be recognized easily by their name, those that start with `GasChangeTx` are emitted once per transaction, while those that start with `GasChangeCall` are emitted on a call basis.
const ( GasChangeUnspecified GasChangeReason = 0 // GasChangeTxInitialBalance is the initial balance for the call which will be equal to the gasLimit of the call. There is only // one such gas change per transaction. GasChangeTxInitialBalance GasChangeReason = 1 // GasChangeTxIntrinsicGas is the amount of gas that will be charged for the intrinsic cost of the transaction, there is // always exactly one of those per transaction. GasChangeTxIntrinsicGas GasChangeReason = 2 // GasChangeTxRefunds is the sum of all refunds which happened during the tx execution (e.g. storage slot being cleared) // this generates an increase in gas. There is at most one of such gas change per transaction. GasChangeTxRefunds GasChangeReason = 3 // GasChangeTxLeftOverReturned is the amount of gas left over at the end of transaction's execution that will be returned // to the account. This change will always be a negative change as we "drain" left over gas towards 0. If there was no gas // left at the end of execution, no such even will be emitted. The returned gas's value in Wei is returned to caller. // There is at most one of such gas change per transaction. GasChangeTxLeftOverReturned GasChangeReason = 4 // GasChangeCallInitialBalance is the initial balance for the call which will be equal to the gasLimit of the call. There is only // one such gas change per call. GasChangeCallInitialBalance GasChangeReason = 5 // GasChangeCallLeftOverReturned is the amount of gas left over that will be returned to the caller, this change will always // be a negative change as we "drain" left over gas towards 0. If there was no gas left at the end of execution, no such even // will be emitted. GasChangeCallLeftOverReturned GasChangeReason = 6 // GasChangeCallLeftOverRefunded is the amount of gas that will be refunded to the call after the child call execution it // executed completed. This value is always positive as we are giving gas back to the you, the left over gas of the child. // If there was no gas left to be refunded, no such even will be emitted. GasChangeCallLeftOverRefunded GasChangeReason = 7 // GasChangeCallContractCreation is the amount of gas that will be burned for a CREATE. GasChangeCallContractCreation GasChangeReason = 8 // GasChangeCallContractCreation2 is the amount of gas that will be burned for a CREATE2. GasChangeCallContractCreation2 GasChangeReason = 9 // GasChangeCallCodeStorage is the amount of gas that will be charged for code storage. GasChangeCallCodeStorage GasChangeReason = 10 // GasChangeCallOpCode is the amount of gas that will be charged for an opcode executed by the EVM, exact opcode that was // performed can be check by `OnOpcode` handling. GasChangeCallOpCode GasChangeReason = 11 // GasChangeCallPrecompiledContract is the amount of gas that will be charged for a precompiled contract execution. GasChangeCallPrecompiledContract GasChangeReason = 12 // GasChangeCallStorageColdAccess is the amount of gas that will be charged for a cold storage access as controlled by EIP2929 rules. GasChangeCallStorageColdAccess GasChangeReason = 13 // GasChangeCallFailedExecution is the burning of the remaining gas when the execution failed without a revert. GasChangeCallFailedExecution GasChangeReason = 14 // GasChangeWitnessContractInit flags the event of adding to the witness during the contract creation initialization step. GasChangeWitnessContractInit GasChangeReason = 15 // GasChangeWitnessContractCreation flags the event of adding to the witness during the contract creation finalization step. GasChangeWitnessContractCreation GasChangeReason = 16 // GasChangeWitnessCodeChunk flags the event of adding one or more contract code chunks to the witness. GasChangeWitnessCodeChunk GasChangeReason = 17 // GasChangeWitnessContractCollisionCheck flags the event of adding to the witness when checking for contract address collision. GasChangeWitnessContractCollisionCheck GasChangeReason = 18 // GasChangeTxDataFloor is the amount of extra gas the transaction has to pay to reach the minimum gas requirement for the // transaction data. This change will always be a negative change. GasChangeTxDataFloor GasChangeReason = 19 // GasChangeAccountCreation represents the state gas charging for account // creation inside the call/create frame. GasChangeAccountCreation GasChangeReason = 20 // GasChangeIgnored is a special value that can be used to indicate that the gas change should be ignored as // it will be "manually" tracked by a direct emit of the gas change event. GasChangeIgnored GasChangeReason = 0xFF )
func (GasChangeReason) String ¶ added in v1.15.4
func (i GasChangeReason) String() string
type GenesisBlockHook ¶
type GenesisBlockHook = func(genesis *types.Block, alloc types.GenesisAlloc)
GenesisBlockHook is called when the genesis block is being processed.
type Hooks ¶
type Hooks struct {
// VM events
OnTxStart TxStartHook
OnTxEnd TxEndHook
OnEnter EnterHook
OnExit ExitHook
OnOpcode OpcodeHook
OnFault FaultHook
OnGasChange GasChangeHook
OnGasChangeV2 GasChangeHookV2
// Chain events
OnBlockchainInit BlockchainInitHook
OnClose CloseHook
OnBlockStart BlockStartHook
OnBlockEnd BlockEndHook
OnSkippedBlock SkippedBlockHook
OnGenesisBlock GenesisBlockHook
OnSystemCallStart OnSystemCallStartHook
OnSystemCallStartV2 OnSystemCallStartHookV2
OnSystemCallEnd OnSystemCallEndHook
OnStateUpdate StateUpdateHook
// State events
OnBalanceChange BalanceChangeHook
OnNonceChange NonceChangeHook
OnNonceChangeV2 NonceChangeHookV2
OnCodeChange CodeChangeHook
OnCodeChangeV2 CodeChangeHookV2
OnStorageChange StorageChangeHook
OnLog LogHook
// Block hash read
OnBlockHashRead BlockHashReadHook
}
func WrapWithJournal ¶ added in v1.15.0
WrapWithJournal wraps the given tracer with a journaling layer.
func (*Hooks) EmitGasChange ¶ added in v1.17.4
func (h *Hooks) EmitGasChange(old, new Gas, reason GasChangeReason)
EmitGasChange dispatches a gas change event to the registered hooks. If the multi-dimensional OnGasChangeV2 hook is set it is invoked with the full Gas vectors; otherwise the single-dimensional OnGasChange hook is invoked with the regular-gas dimension only. The call is a no-op when the receiver is nil, when neither hook is registered, or when the reason is GasChangeIgnored.
Call sites SHOULD use this helper instead of invoking the hooks directly so that both variants stay consistent across the Amsterdam fork boundary.
func (*Hooks) HasGasHook ¶ added in v1.17.4
HasGasHook reports whether any gas-change hook is registered. Call sites should use this to short-circuit before constructing the Gas / GasBudget arguments to EmitGasChange when tracing is off — the dispatch is otherwise always paid the cost of evaluating those args.
type NonceChangeHook ¶
NonceChangeHook is called when the nonce of an account changes.
type NonceChangeHookV2 ¶ added in v1.15.0
type NonceChangeHookV2 = func(addr common.Address, prev, new uint64, reason NonceChangeReason)
NonceChangeHookV2 is called when the nonce of an account changes.
type NonceChangeReason ¶ added in v1.15.0
type NonceChangeReason byte
NonceChangeReason is used to indicate the reason for a nonce change.
const ( NonceChangeUnspecified NonceChangeReason = 0 // NonceChangeGenesis is the nonce allocated to accounts at genesis. NonceChangeGenesis NonceChangeReason = 1 // NonceChangeEoACall is the nonce change due to an EoA call. NonceChangeEoACall NonceChangeReason = 2 // NonceChangeContractCreator is the nonce change of an account creating a contract. NonceChangeContractCreator NonceChangeReason = 3 // NonceChangeNewContract is the nonce change of a newly created contract. NonceChangeNewContract NonceChangeReason = 4 // NonceChangeAuthorization is the nonce change due to a EIP-7702 authorization. NonceChangeAuthorization NonceChangeReason = 5 // NonceChangeRevert is emitted when the nonce is reverted back to a previous value due to call failure. // It is only emitted when the tracer has opted in to use the journaling wrapper (WrapWithJournal). NonceChangeRevert NonceChangeReason = 6 // NonceChangeSelfdestruct is emitted when the nonce is reset to zero due to a self-destruct NonceChangeSelfdestruct NonceChangeReason = 7 )
func (NonceChangeReason) String ¶ added in v1.15.4
func (i NonceChangeReason) String() string
type OnSystemCallEndHook ¶ added in v1.14.2
type OnSystemCallEndHook = func()
OnSystemCallEndHook is called when a system call has finished executing. Today, this hook is invoked when the EIP-4788 system call is about to be executed to set the beacon block root.
type OnSystemCallStartHook ¶ added in v1.14.2
type OnSystemCallStartHook = func()
OnSystemCallStartHook is called when a system call is about to be executed. Today, this hook is invoked when the EIP-4788 system call is about to be executed to set the beacon block root.
After this hook, the EVM call tracing will happened as usual so you will receive a `OnEnter/OnExit` as well as state hooks between this hook and the `OnSystemCallEndHook`.
Note that system call happens outside normal transaction execution, so the `OnTxStart/OnTxEnd` hooks will not be invoked.
type OnSystemCallStartHookV2 ¶ added in v1.15.0
type OnSystemCallStartHookV2 = func(vm *VMContext)
OnSystemCallStartHookV2 is called when a system call is about to be executed. Refer to `OnSystemCallStartHook` for more information.
type OpContext ¶
type OpContext interface {
MemoryData() []byte
StackData() []uint256.Int
Caller() common.Address
Address() common.Address
CallValue() *uint256.Int
CallInput() []byte
ContractCode() []byte
}
OpContext provides the context at which the opcode is being executed in, including the memory, stack and various contract-level information.
type OpcodeHook ¶
type OpcodeHook = func(pc uint64, op byte, gas, cost uint64, scope OpContext, rData []byte, depth int, err error)
OpcodeHook is invoked just prior to the execution of an opcode.
type SkippedBlockHook ¶
type SkippedBlockHook = func(event BlockEvent)
SkippedBlockHook indicates a block was skipped during processing due to it being known previously. This can happen e.g. when recovering from a crash.
type StateDB ¶
type StateDB interface {
GetBalance(common.Address) *uint256.Int
GetNonce(common.Address) uint64
GetCode(common.Address) []byte
GetCodeHash(common.Address) common.Hash
GetState(common.Address, common.Hash) common.Hash
GetTransientState(common.Address, common.Hash) common.Hash
Exist(common.Address) bool
GetRefund() uint64
}
StateDB gives tracers access to the whole state.
type StateUpdate ¶ added in v1.17.0
type StateUpdate struct {
OriginRoot common.Hash // State root before the update
Root common.Hash // State root after the update
BlockNumber uint64
// AccountChanges contains all account state changes keyed by address.
AccountChanges map[common.Address]*AccountChange
// StorageChanges contains all storage slot changes keyed by address and storage slot key.
StorageChanges map[common.Address]map[common.Hash]*StorageChange
// CodeChanges contains all contract code changes keyed by address.
CodeChanges map[common.Address]*CodeChange
// TrieChanges contains trie node mutations keyed by address hash and trie node path.
TrieChanges map[common.Hash]map[string]*TrieNodeChange
}
StateUpdate represents the state mutations resulting from block execution. It provides access to account changes, storage changes, and contract code deployments with both previous and new values.
type StateUpdateHook ¶ added in v1.17.0
type StateUpdateHook = func(update *StateUpdate)
StateUpdateHook is called after state is committed for a block. It provides access to the complete state mutations including account changes, storage changes, trie node mutations, and contract code deployments.
type StorageChange ¶ added in v1.17.0
type StorageChange struct {
Prev common.Hash // previous value (zero if slot was created)
New common.Hash // new value (zero if slot was deleted)
}
StorageChange represents a change to a storage slot.
type StorageChangeHook ¶
StorageChangeHook is called when the storage of an account changes.
type TrieNodeChange ¶ added in v1.17.0
type TxStartHook ¶
type TxStartHook = func(vm *VMContext, tx *types.Transaction, from common.Address)
TxStartHook is called before the execution of a transaction starts. Call simulations don't come with a valid signature. `from` field to be used for address of the caller.