reth_provider

Trait StateProviderFactory

pub trait StateProviderFactory:
    BlockIdReader
    + Send
    + Sync {
    // Required methods
    fn latest(&self) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn state_by_block_number_or_tag(
        &self,
        number_or_tag: BlockNumberOrTag,
    ) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn history_by_block_number(
        &self,
        block: u64,
    ) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn history_by_block_hash(
        &self,
        block: FixedBytes<32>,
    ) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn state_by_block_hash(
        &self,
        block: FixedBytes<32>,
    ) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn pending(&self) -> Result<Box<dyn StateProvider>, ProviderError>;
    fn pending_state_by_hash(
        &self,
        block_hash: FixedBytes<32>,
    ) -> Result<Option<Box<dyn StateProvider>>, ProviderError>;

    // Provided method
    fn state_by_block_id(
        &self,
        block_id: BlockId,
    ) -> Result<Box<dyn StateProvider>, ProviderError> { ... }
}
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§

fn latest(&self) -> Result<Box<dyn StateProvider>, ProviderError>

Storage provider for latest block.

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> Result<Box<dyn StateProvider>, ProviderError>

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.

fn history_by_block_number( &self, block: u64, ) -> Result<Box<dyn StateProvider>, ProviderError>

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

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

fn history_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

Returns a historical StateProvider indexed by the given block hash.

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

fn state_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

Returns any StateProvider with matching block hash.

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

fn pending(&self) -> Result<Box<dyn StateProvider>, ProviderError>

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

fn pending_state_by_hash( &self, block_hash: FixedBytes<32>, ) -> Result<Option<Box<dyn StateProvider>>, ProviderError>

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§

fn state_by_block_id( &self, block_id: BlockId, ) -> Result<Box<dyn StateProvider>, ProviderError>

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§

§

impl<'a, T> StateProviderFactory for &'a T

§

fn latest(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_id( &self, block_id: BlockId, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_number( &self, block: u64, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending_state_by_hash( &self, block_hash: FixedBytes<32>, ) -> Result<Option<Box<dyn StateProvider>>, ProviderError>

§

impl<T> StateProviderFactory for Box<T>

§

fn latest(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_id( &self, block_id: BlockId, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_number( &self, block: u64, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending_state_by_hash( &self, block_hash: FixedBytes<32>, ) -> Result<Option<Box<dyn StateProvider>>, ProviderError>

§

impl<T> StateProviderFactory for Arc<T>

§

fn latest(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_id( &self, block_id: BlockId, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_number_or_tag( &self, number_or_tag: BlockNumberOrTag, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_number( &self, block: u64, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn history_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn state_by_block_hash( &self, block: FixedBytes<32>, ) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending(&self) -> Result<Box<dyn StateProvider>, ProviderError>

§

fn pending_state_by_hash( &self, block_hash: FixedBytes<32>, ) -> Result<Option<Box<dyn StateProvider>>, ProviderError>

Implementors§

Source§

impl StateProviderFactory for MockEthProvider

Available on crate feature test-utils only.
Source§

impl StateProviderFactory for NoopProvider

Available on crate feature test-utils only.
Source§

impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider2<N>

Source§

impl<N: ProviderNodeTypes> StateProviderFactory for BlockchainProvider<N>