reth_storage_api

Trait StateProviderFactory

Source
pub trait StateProviderFactory:
    BlockIdReader
    + Send
    + Sync {
    // Required methods
    fn latest(&self) -> ProviderResult<StateProviderBox>;
    fn state_by_block_number_or_tag(
        &self,
        number_or_tag: BlockNumberOrTag,
    ) -> ProviderResult<StateProviderBox>;
    fn history_by_block_number(
        &self,
        block: BlockNumber,
    ) -> ProviderResult<StateProviderBox>;
    fn history_by_block_hash(
        &self,
        block: BlockHash,
    ) -> ProviderResult<StateProviderBox>;
    fn state_by_block_hash(
        &self,
        block: BlockHash,
    ) -> ProviderResult<StateProviderBox>;
    fn pending(&self) -> ProviderResult<StateProviderBox>;
    fn pending_state_by_hash(
        &self,
        block_hash: B256,
    ) -> ProviderResult<Option<StateProviderBox>>;

    // Provided method
    fn state_by_block_id(
        &self,
        block_id: BlockId,
    ) -> ProviderResult<StateProviderBox> { ... }
}
Expand description

Light wrapper that returns StateProvider implementations that correspond to the given BlockNumber, the latest state, or the pending state.

This type differentiates states into historical, latest and pending, where the latest block determines what is historical or pending: [historical..latest..pending].

The latest state represents the state after the most recent block has been committed to the database, historical states are states that have been committed to the database before the latest state, and pending states are states that have not yet been committed to the database which may or may not become the latest state, depending on consensus.

Note: the pending block is considered the block that extends the canonical chain but one and has the latest block as its parent.

All states are inclusive, meaning they include all all changes made (executed transactions) in their respective blocks. For example StateProviderFactory::history_by_block_number for block number n will return the state after block n was executed (transactions, withdrawals). In other words, all states point to the end of the state’s respective block, which is equivalent to state at the beginning of the child block.

This affects tracing, or replaying blocks, which will need to be executed on top of the state of the parent block. For example, in order to trace block n, the state after block n - 1 needs to be used, since block n was executed on its parent block’s state.

Required Methods§

Source

fn latest(&self) -> ProviderResult<StateProviderBox>

Storage provider for latest block.

Source

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> ProviderResult<StateProviderBox>

Returns a StateProvider indexed by the given block number or tag.

Note: if a number is provided this will only look at historical(canonical) state.

Source

fn history_by_block_number( &self, block: BlockNumber, ) -> ProviderResult<StateProviderBox>

Returns a historical StateProvider indexed by the given historic block number.

Note: this only looks at historical blocks, not pending blocks.

Source

fn history_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Returns a historical StateProvider indexed by the given block hash.

Note: this only looks at historical blocks, not pending blocks.

Source

fn state_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Returns any StateProvider with matching block hash.

This will return a StateProvider for either a historical or pending block.

Source

fn pending(&self) -> ProviderResult<StateProviderBox>

Storage provider for pending state.

Represents the state at the block that extends the canonical chain by one. If there’s no pending block, then this is equal to StateProviderFactory::latest

Source

fn pending_state_by_hash( &self, block_hash: B256, ) -> ProviderResult<Option<StateProviderBox>>

Storage provider for pending state for the given block hash.

Represents the state at the block that extends the canonical chain.

If the block couldn’t be found, returns None.

Provided Methods§

Source

fn state_by_block_id( &self, block_id: BlockId, ) -> ProviderResult<StateProviderBox>

Returns a StateProvider indexed by the given [BlockId].

Note: if a number or hash is provided this will only look at historical(canonical) state.

Implementations on Foreign Types§

Source§

impl<'a, T: 'a + StateProviderFactory + ?Sized> StateProviderFactory for &'a T

Source§

fn latest(&self) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_id( &self, block_id: BlockId, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_number( &self, block: BlockNumber, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn pending(&self) -> ProviderResult<StateProviderBox>

Source§

fn pending_state_by_hash( &self, block_hash: B256, ) -> ProviderResult<Option<StateProviderBox>>

Source§

impl<T: StateProviderFactory + ?Sized> StateProviderFactory for Box<T>
where Box<T>: BlockIdReader + Send + Sync,

Source§

fn latest(&self) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_id( &self, block_id: BlockId, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_number( &self, block: BlockNumber, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn pending(&self) -> ProviderResult<StateProviderBox>

Source§

fn pending_state_by_hash( &self, block_hash: B256, ) -> ProviderResult<Option<StateProviderBox>>

Source§

impl<T: StateProviderFactory + ?Sized> StateProviderFactory for Arc<T>
where Arc<T>: BlockIdReader + Send + Sync,

Source§

fn latest(&self) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_id( &self, block_id: BlockId, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_number( &self, block: BlockNumber, ) -> ProviderResult<StateProviderBox>

Source§

fn history_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn state_by_block_hash( &self, block: BlockHash, ) -> ProviderResult<StateProviderBox>

Source§

fn pending(&self) -> ProviderResult<StateProviderBox>

Source§

fn pending_state_by_hash( &self, block_hash: B256, ) -> ProviderResult<Option<StateProviderBox>>

Implementors§

Source§

impl<C: Send + Sync + 'static, N: NodePrimitives> StateProviderFactory for NoopProvider<C, N>