Skip to main content

Trace

Trait Trace 

Source
pub trait Trace: LoadState<Error: FromEvmError<Self::Evm>> + Call {
    // Provided methods
    fn inspect<'a>(
        &self,
        db: &'a mut StateCacheDb,
        evm_env: EvmEnvFor<Self::Evm>,
        tx_env: impl IntoTxEnv<TxEnvFor<Self::Evm>>,
        inspector: impl InspectorFor<Self::Evm, &'a mut StateCacheDb>,
    ) -> Result<ResultAndState<HaltReasonFor<Self::Evm>>, Self::Error> { ... }
    fn spawn_trace_transaction_in_block<F, R>(
        &self,
        hash: B256,
        config: TracingInspectorConfig,
        f: F,
    ) -> impl Future<Output = Result<Option<R>, Self::Error>> + Send
       where Self: LoadTransaction,
             F: FnOnce(TransactionInfo, TracingInspector, ResultAndState<HaltReasonFor<Self::Evm>>, StateCacheDb) -> Result<R, Self::Error> + Send + 'static,
             R: Send + 'static { ... }
    fn spawn_trace_transaction_in_block_with_inspector<Insp, F, R>(
        &self,
        hash: B256,
        inspector: Insp,
        f: F,
    ) -> impl Future<Output = Result<Option<R>, Self::Error>> + Send
       where Self: LoadTransaction,
             F: FnOnce(TransactionInfo, Insp, ResultAndState<HaltReasonFor<Self::Evm>>, StateCacheDb) -> Result<R, Self::Error> + Send + 'static,
             Insp: for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb> + Send + 'static,
             R: Send + 'static { ... }
    fn replay_block_until(
        &self,
        db: &mut StateCacheDb,
        block: &RecoveredBlock<BlockTy<Self::Primitives>>,
        target_tx_index: usize,
    ) -> Result<(), Self::Error> { ... }
    fn inspect_transaction_in_block<'a>(
        &self,
        block: &RecoveredBlock<BlockTy<Self::Primitives>>,
        db: &'a mut StateCacheDb,
        inspector: impl InspectorFor<Self::Evm, &'a mut StateCacheDb>,
        target_tx_index: usize,
        target_tx_env: impl IntoTxEnv<TxEnvFor<Self::Evm>>,
    ) -> Result<(ResultAndState<HaltReasonFor<Self::Evm>>, EvmEnvFor<Self::Evm>), Self::Error> { ... }
    fn trace_block_until<F, R>(
        &self,
        block_id: BlockId,
        block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>,
        highest_index: Option<u64>,
        config: TracingInspectorConfig,
        f: F,
    ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
       where Self: LoadBlock,
             F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, TracingInspector>>) -> Result<R, Self::Error> + Send + 'static,
             R: Send + 'static { ... }
    fn trace_block_until_with_inspector<Setup, Insp, F, R>(
        &self,
        block_id: BlockId,
        block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>,
        highest_index: Option<u64>,
        inspector_setup: Setup,
        f: F,
    ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
       where Self: LoadBlock,
             F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, Insp>>) -> Result<R, Self::Error> + Send + 'static,
             Setup: FnMut() -> Insp + Send + 'static,
             Insp: Clone + for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb>,
             R: Send + 'static { ... }
    fn trace_block_with<F, R>(
        &self,
        block_id: BlockId,
        block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>,
        config: TracingInspectorConfig,
        f: F,
    ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
       where Self: LoadBlock,
             F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, TracingInspector>>) -> Result<R, Self::Error> + Send + 'static,
             R: Send + 'static { ... }
    fn trace_block_inspector<Setup, Insp, F, R>(
        &self,
        block_id: BlockId,
        block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>,
        insp_setup: Setup,
        f: F,
    ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
       where Self: LoadBlock,
             F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, Insp>>) -> Result<R, Self::Error> + Send + 'static,
             Setup: FnMut() -> Insp + Send + 'static,
             Insp: Clone + for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb>,
             R: Send + 'static { ... }
    fn apply_pre_execution_changes(
        &self,
        block: &RecoveredBlock<ProviderBlock<Self::Provider>>,
        db: &mut StateCacheDb,
    ) -> Result<(), Self::Error> { ... }
}
Expand description

Executes CPU heavy tasks.

Provided Methods§

Source

fn inspect<'a>( &self, db: &'a mut StateCacheDb, evm_env: EvmEnvFor<Self::Evm>, tx_env: impl IntoTxEnv<TxEnvFor<Self::Evm>>, inspector: impl InspectorFor<Self::Evm, &'a mut StateCacheDb>, ) -> Result<ResultAndState<HaltReasonFor<Self::Evm>>, Self::Error>

Executes the TxEnvFor with [reth_evm::EvmEnv] against the given StateCacheDb without committing state changes.

Source

fn spawn_trace_transaction_in_block<F, R>( &self, hash: B256, config: TracingInspectorConfig, f: F, ) -> impl Future<Output = Result<Option<R>, Self::Error>> + Send
where Self: LoadTransaction, F: FnOnce(TransactionInfo, TracingInspector, ResultAndState<HaltReasonFor<Self::Evm>>, StateCacheDb) -> Result<R, Self::Error> + Send + 'static, R: Send + 'static,

Retrieves the transaction if it exists and returns its trace.

Before the transaction is traced, all previous transaction in the block are applied to the state by executing them first. The callback f is invoked with the [ResultAndState] after the transaction was executed and the database that points to the beginning of the transaction.

Note: Implementers should use a threadpool where blocking is allowed, such as BlockingTaskPool.

Source

fn spawn_trace_transaction_in_block_with_inspector<Insp, F, R>( &self, hash: B256, inspector: Insp, f: F, ) -> impl Future<Output = Result<Option<R>, Self::Error>> + Send
where Self: LoadTransaction, F: FnOnce(TransactionInfo, Insp, ResultAndState<HaltReasonFor<Self::Evm>>, StateCacheDb) -> Result<R, Self::Error> + Send + 'static, Insp: for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb> + Send + 'static, R: Send + 'static,

Retrieves the transaction if it exists and returns its trace.

Before the transaction is traced, all previous transaction in the block are applied to the state by executing them first. The callback f is invoked with the [ResultAndState] after the transaction was executed and the database that points to the beginning of the transaction.

Note: Implementers should use a threadpool where blocking is allowed, such as BlockingTaskPool.

Source

fn replay_block_until( &self, db: &mut StateCacheDb, block: &RecoveredBlock<BlockTy<Self::Primitives>>, target_tx_index: usize, ) -> Result<(), Self::Error>

Replays all transactions before the target transaction index.

All transactions before the target transaction are executed and their changes are written to the runtime db (StateCacheDb).

If the target index is greater than or equal to the block’s transaction count, all transactions are replayed.

Source

fn inspect_transaction_in_block<'a>( &self, block: &RecoveredBlock<BlockTy<Self::Primitives>>, db: &'a mut StateCacheDb, inspector: impl InspectorFor<Self::Evm, &'a mut StateCacheDb>, target_tx_index: usize, target_tx_env: impl IntoTxEnv<TxEnvFor<Self::Evm>>, ) -> Result<(ResultAndState<HaltReasonFor<Self::Evm>>, EvmEnvFor<Self::Evm>), Self::Error>

Replays all transactions before the target transaction without inspection, then executes the target transaction with the configured inspector, all on the given EVM.

Source

fn trace_block_until<F, R>( &self, block_id: BlockId, block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>, highest_index: Option<u64>, config: TracingInspectorConfig, f: F, ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
where Self: LoadBlock, F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, TracingInspector>>) -> Result<R, Self::Error> + Send + 'static, R: Send + 'static,

Executes all transactions of a block up to a given index.

If a highest_index is given, this will only execute the first highest_index transactions, in other words, it will stop executing transactions after the highest_indexth transaction. If highest_index is None, all transactions are executed.

Source

fn trace_block_until_with_inspector<Setup, Insp, F, R>( &self, block_id: BlockId, block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>, highest_index: Option<u64>, inspector_setup: Setup, f: F, ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
where Self: LoadBlock, F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, Insp>>) -> Result<R, Self::Error> + Send + 'static, Setup: FnMut() -> Insp + Send + 'static, Insp: Clone + for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb>, R: Send + 'static,

Executes all transactions of a block.

If a highest_index is given, this will only execute the first highest_index transactions, in other words, it will stop executing transactions after the highest_indexth transaction.

Note: This expect tx index to be 0-indexed, so the first transaction is at index 0.

This accepts a inspector_setup closure that returns the inspector to be used for tracing the transactions.

Source

fn trace_block_with<F, R>( &self, block_id: BlockId, block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>, config: TracingInspectorConfig, f: F, ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
where Self: LoadBlock, F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, TracingInspector>>) -> Result<R, Self::Error> + Send + 'static, R: Send + 'static,

Executes all transactions of a block and returns a list of callback results invoked for each transaction in the block.

This

  1. fetches all transactions of the block
  2. configures the EVM env
  3. loops over all transactions and executes them
  4. calls the callback with the transaction info, the execution result, the changed state after the transaction StateCacheDb and the database that points to the state right before the transaction.
Source

fn trace_block_inspector<Setup, Insp, F, R>( &self, block_id: BlockId, block: Option<Arc<RecoveredBlock<ProviderBlock<Self::Provider>>>>, insp_setup: Setup, f: F, ) -> impl Future<Output = Result<Option<Vec<R>>, Self::Error>> + Send
where Self: LoadBlock, F: Fn(TransactionInfo, TracingCtx<'_, Recovered<&ProviderTx<Self::Provider>>, EvmFor<Self::Evm, &mut StateCacheDb, Insp>>) -> Result<R, Self::Error> + Send + 'static, Setup: FnMut() -> Insp + Send + 'static, Insp: Clone + for<'a> InspectorFor<Self::Evm, &'a mut StateCacheDb>, R: Send + 'static,

Executes all transactions of a block and returns a list of callback results invoked for each transaction in the block.

This

  1. fetches all transactions of the block
  2. configures the EVM env
  3. loops over all transactions and executes them
  4. calls the callback with the transaction info, the execution result, the changed state after the transaction EvmState and the database that points to the state right before the transaction, in other words the state the transaction was executed on: changed_state = tx(cached_state)

This accepts a inspector_setup closure that returns the inspector to be used for tracing a transaction. This is invoked for each transaction.

Source

fn apply_pre_execution_changes( &self, block: &RecoveredBlock<ProviderBlock<Self::Provider>>, db: &mut StateCacheDb, ) -> Result<(), Self::Error>

Applies chain-specific state transitions required before executing a block.

Note: This should only be called when tracing an entire block vs individual transactions. When tracing transactions on top of an already committed block state, those transitions are already applied.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§