reth_provider::providers

Struct DatabaseProvider

Source
pub struct DatabaseProvider<TX, N: NodeTypes> { /* private fields */ }
Expand description

A provider struct that fetches data from the database. Wrapper around [DbTx] and [DbTxMut]. Example: HeaderProvider BlockHashReader

Implementations§

Source§

impl<TX, N: NodeTypes> DatabaseProvider<TX, N>

Source

pub const fn prune_modes_ref(&self) -> &PruneModes

Returns reference to prune modes.

Source§

impl<TX: DbTx + 'static, N: NodeTypes> DatabaseProvider<TX, N>

Source

pub fn latest<'a>(&'a self) -> ProviderResult<Box<dyn StateProvider + 'a>>

State provider for latest block

Source

pub fn history_by_block_hash<'a>( &'a self, block_hash: BlockHash, ) -> ProviderResult<Box<dyn StateProvider + 'a>>

Storage provider for state at that given block hash

Source§

impl<TX: DbTxMut, N: NodeTypes> DatabaseProvider<TX, N>

Source

pub const fn new_rw( tx: TX, chain_spec: Arc<N::ChainSpec>, static_file_provider: StaticFileProvider<N::Primitives>, prune_modes: PruneModes, storage: Arc<N::Storage>, ) -> Self

Creates a provider with an inner read-write transaction.

Source§

impl<TX: DbTx + DbTxMut + 'static, N: ProviderNodeTypes> DatabaseProvider<TX, N>

Source

pub fn unwind_trie_state_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<()>

Unwinds trie state for the given range.

This includes calculating the resulted state root and comparing it with the parent block state root.

Source§

impl<Tx: DbTx + DbTxMut + 'static, N: ProviderNodeTypes + 'static> DatabaseProvider<Tx, N>

Source

pub fn insert_historical_block( &self, block: SealedBlockWithSenders<Header, <Self as BlockWriter>::Body>, ) -> ProviderResult<StoredBlockBodyIndices>

Inserts an historical block. Used for setting up test environments

Source§

impl<TX: DbTx + 'static, N: NodeTypes> DatabaseProvider<TX, N>

Source

pub const fn new( tx: TX, chain_spec: Arc<N::ChainSpec>, static_file_provider: StaticFileProvider<N::Primitives>, prune_modes: PruneModes, storage: Arc<N::Storage>, ) -> Self

Creates a provider with an inner read-only transaction.

Source

pub fn into_tx(self) -> TX

Consume DbTx or DbTxMut.

Source

pub fn tx_mut(&mut self) -> &mut TX

Pass DbTx or DbTxMut mutable reference.

Source

pub const fn tx_ref(&self) -> &TX

Pass DbTx or DbTxMut immutable reference.

Source

pub fn chain_spec(&self) -> &N::ChainSpec

Returns a reference to the chain specification.

Source

pub fn get_state( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<Option<ExecutionOutcome>>

Return the last N blocks of state, recreating the ExecutionOutcome.

  1. Iterate over the BlockBodyIndices table to get all the transaction ids.
  2. Iterate over the StorageChangeSets table and the AccountChangeSets tables in reverse order to reconstruct the changesets.
    • In order to have both the old and new values in the changesets, we also access the plain state tables.
  3. While iterating over the changeset tables, if we encounter a new account or storage slot, we:
    1. Take the old value from the changeset
    2. Take the new value from the plain state
    3. Save the old value to the local state
  4. While iterating over the changeset tables, if we encounter an account/storage slot we have seen before we:
    1. Take the old value from the changeset
    2. Take the new value from the local state
    3. Set the local state to the value in the changeset

If the range is empty, or there are no blocks for the given range, then this returns None.

Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> DatabaseProvider<TX, N>

Source

pub fn commit(self) -> ProviderResult<bool>

Commit database transaction.

Trait Implementations§

Source§

impl<TX: DbTx, N: NodeTypes> AccountExtReader for DatabaseProvider<TX, N>

Source§

fn changed_accounts_with_range( &self, range: impl RangeBounds<BlockNumber>, ) -> ProviderResult<BTreeSet<Address>>

Iterate over account changesets and return all account address that were changed.
Source§

fn basic_accounts( &self, iter: impl IntoIterator<Item = Address>, ) -> ProviderResult<Vec<(Address, Option<Account>)>>

Get basic account information for multiple accounts. A more efficient version than calling AccountReader::basic_account repeatedly. Read more
Source§

fn changed_accounts_and_blocks_with_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<BTreeMap<Address, Vec<u64>>>

Iterate over account changesets and return all account addresses that were changed alongside each specific set of blocks. Read more
Source§

impl<TX: DbTx, N: NodeTypes> AccountReader for DatabaseProvider<TX, N>

Source§

fn basic_account(&self, address: Address) -> ProviderResult<Option<Account>>

Get basic account information. Read more
Source§

impl<DB: Database, N: NodeTypes> AsRef<DatabaseProvider<<DB as Database>::TXMut, N>> for DatabaseProviderRW<DB, N>

Source§

fn as_ref(&self) -> &DatabaseProvider<<DB as Database>::TXMut, N>

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<TX, N: NodeTypes> AsRef<DatabaseProvider<TX, N>> for DatabaseProvider<TX, N>

Source§

fn as_ref(&self) -> &Self

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl<TX: DbTxMut + DbTx + 'static, N: ProviderNodeTypes + 'static> BlockExecutionWriter for DatabaseProvider<TX, N>

Source§

fn take_block_and_execution_above( &self, block: BlockNumber, remove_transactions_from: StorageLocation, ) -> ProviderResult<Chain>

Take all of the blocks above the provided number and their execution result Read more
Source§

fn remove_block_and_execution_above( &self, block: BlockNumber, remove_transactions_from: StorageLocation, ) -> ProviderResult<()>

Remove all of the blocks above the provided number and their execution result Read more
Source§

impl<TX: DbTx + 'static, N: NodeTypes> BlockHashReader for DatabaseProvider<TX, N>

Source§

fn block_hash(&self, number: u64) -> ProviderResult<Option<B256>>

Get the hash of the block with the given number. Returns None if no block with this number exists.
Source§

fn canonical_hashes_range( &self, start: BlockNumber, end: BlockNumber, ) -> ProviderResult<Vec<B256>>

Get headers in range of block hashes or numbers Read more
§

fn convert_block_hash( &self, hash_or_number: HashOrNumber, ) -> Result<Option<FixedBytes<32>>, ProviderError>

Get the hash of the block with the given number. Returns None if no block with this number exists.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> BlockNumReader for DatabaseProvider<TX, N>

Source§

fn chain_info(&self) -> ProviderResult<ChainInfo>

Returns the current info for the chain.
Source§

fn best_block_number(&self) -> ProviderResult<BlockNumber>

Returns the best block number in the chain.
Source§

fn last_block_number(&self) -> ProviderResult<BlockNumber>

Returns the last block number associated with the last canonical header in the database.
Source§

fn block_number(&self, hash: B256) -> ProviderResult<Option<BlockNumber>>

Gets the BlockNumber for the given hash. Returns None if no block with this hash exists.
§

fn convert_hash_or_number( &self, id: HashOrNumber, ) -> Result<Option<u64>, ProviderError>

Gets the block number for the given BlockHashOrNumber. Returns None if no block with this hash exists. If the BlockHashOrNumber is a Number, it is returned as is.
§

fn convert_number( &self, id: HashOrNumber, ) -> Result<Option<FixedBytes<32>>, ProviderError>

Gets the block hash for the given BlockHashOrNumber. Returns None if no block with this number exists. If the BlockHashOrNumber is a Hash, it is returned as is.
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> BlockReader for DatabaseProvider<TX, N>

Source§

fn block(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Block>>

Returns the block with matching number from database.

If the header for this block is not found, this returns None. If the header is found, but the transactions either do not exist, or are not indexed, this will return None.

Source§

fn ommers(&self, id: BlockHashOrNumber) -> ProviderResult<Option<Vec<Header>>>

Returns the ommers for the block with matching id from the database.

If the block is not found, this returns None. If the block exists, but doesn’t contain ommers, this returns None.

Source§

fn block_with_senders( &self, id: BlockHashOrNumber, transaction_kind: TransactionVariant, ) -> ProviderResult<Option<BlockWithSenders>>

Returns the block with senders with matching number or hash from database.

NOTE: The transactions have invalid hashes, since they would need to be calculated on the spot, and we want fast querying.

If the header for this block is not found, this returns None. If the header is found, but the transactions either do not exist, or are not indexed, this will return None.

Source§

fn find_block_by_hash( &self, hash: B256, source: BlockSource, ) -> ProviderResult<Option<Block>>

Tries to find in the given block source. Read more
Source§

fn pending_block(&self) -> ProviderResult<Option<SealedBlock>>

Returns the pending block if available Read more
Source§

fn pending_block_with_senders( &self, ) -> ProviderResult<Option<SealedBlockWithSenders>>

Returns the pending block if available Read more
Source§

fn pending_block_and_receipts( &self, ) -> ProviderResult<Option<(SealedBlock, Vec<Receipt>)>>

Returns the pending block and receipts if available.
Source§

fn block_body_indices( &self, num: u64, ) -> ProviderResult<Option<StoredBlockBodyIndices>>

Returns the block body indices with matching number from database. Read more
Source§

fn sealed_block_with_senders( &self, id: BlockHashOrNumber, transaction_kind: TransactionVariant, ) -> ProviderResult<Option<SealedBlockWithSenders>>

Returns the sealed block with senders with matching number or hash from database. Read more
Source§

fn block_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<Vec<Block>>

Returns all blocks in the given inclusive range. Read more
Source§

fn block_with_senders_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<Vec<BlockWithSenders>>

Returns a range of blocks from the database, along with the senders of each transaction in the blocks.
Source§

fn sealed_block_with_senders_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<Vec<SealedBlockWithSenders>>

Returns a range of sealed blocks from the database, along with the senders of each transaction in the blocks.
§

fn block_by_hash( &self, hash: FixedBytes<32>, ) -> Result<Option<Block>, ProviderError>

Returns the block with matching hash from the database. Read more
§

fn block_by_number(&self, num: u64) -> Result<Option<Block>, ProviderError>

Returns the block with matching number from database. Read more
Source§

impl<TX: DbTxMut + DbTx + 'static, N: ProviderNodeTypes + 'static> BlockWriter for DatabaseProvider<TX, N>

Source§

fn insert_block( &self, block: SealedBlockWithSenders<Header, Self::Body>, write_transactions_to: StorageLocation, ) -> ProviderResult<StoredBlockBodyIndices>

Inserts the block into the database, always modifying the following tables:

If there are transactions in the block, the following tables will be modified:

If ommers are not empty, this will modify BlockOmmers. If withdrawals are not empty, this will modify BlockWithdrawals.

If the provider has not configured full sender pruning, this will modify TransactionSenders.

If the provider has not configured full transaction lookup pruning, this will modify TransactionHashNumbers.

Source§

fn append_blocks_with_state( &self, blocks: Vec<SealedBlockWithSenders<Header, Self::Body>>, execution_outcome: ExecutionOutcome, hashed_state: HashedPostStateSorted, trie_updates: TrieUpdates, ) -> ProviderResult<()>

TODO(joshie): this fn should be moved to UnifiedStorageWriter eventually

Source§

type Body = <<<N as NodeTypes>::Primitives as FullNodePrimitives>::Block as Block>::Body

The body this writer can write.
Source§

fn append_block_bodies( &self, bodies: Vec<(BlockNumber, Option<Self::Body>)>, write_transactions_to: StorageLocation, ) -> ProviderResult<()>

Appends a batch of block bodies extending the canonical chain. This is invoked during Bodies stage and does not write to TransactionHashNumbers and TransactionSenders tables which are populated on later stages. Read more
Source§

fn remove_blocks_above( &self, block: BlockNumber, remove_transactions_from: StorageLocation, ) -> ProviderResult<()>

Removes all blocks above the given block number from the database. Read more
Source§

fn remove_bodies_above( &self, block: BlockNumber, remove_transactions_from: StorageLocation, ) -> ProviderResult<()>

Removes all block bodies above the given block number from the database.
Source§

impl<TX: Send + Sync, N: NodeTypes<ChainSpec: EthChainSpec + 'static>> ChainSpecProvider for DatabaseProvider<TX, N>

Source§

type ChainSpec = <N as NodeTypes>::ChainSpec

The chain spec type.
Source§

fn chain_spec(&self) -> Arc<Self::ChainSpec>

Get an Arc to the chainspec.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> ChainStateBlockReader for DatabaseProvider<TX, N>

Source§

fn last_finalized_block_number(&self) -> ProviderResult<Option<BlockNumber>>

Returns the last finalized block number. Read more
Source§

fn last_safe_block_number(&self) -> ProviderResult<Option<BlockNumber>>

Returns the last safe block number. Read more
Source§

impl<TX: DbTxMut, N: NodeTypes> ChainStateBlockWriter for DatabaseProvider<TX, N>

Source§

fn save_finalized_block_number( &self, block_number: BlockNumber, ) -> ProviderResult<()>

Saves the given finalized block number in the DB.
Source§

fn save_safe_block_number( &self, block_number: BlockNumber, ) -> ProviderResult<()>

Saves the given safe block number in the DB.
Source§

impl<TX: DbTx, N: NodeTypes> ChangeSetReader for DatabaseProvider<TX, N>

Source§

fn account_block_changeset( &self, block_number: BlockNumber, ) -> ProviderResult<Vec<AccountBeforeTx>>

Iterate over account changesets and return the account state from before this block.
Source§

impl<TX: DbTx + 'static, N: NodeTypes + 'static> DBProvider for DatabaseProvider<TX, N>

Source§

type Tx = TX

Underlying database transaction held by the provider.
Source§

fn tx_ref(&self) -> &Self::Tx

Returns a reference to the underlying transaction.
Source§

fn tx_mut(&mut self) -> &mut Self::Tx

Returns a mutable reference to the underlying transaction.
Source§

fn into_tx(self) -> Self::Tx

Consumes the provider and returns the underlying transaction.
Source§

fn prune_modes_ref(&self) -> &PruneModes

Returns a reference to prune modes.
§

fn disable_long_read_transaction_safety(self) -> Self

Disables long-lived read transaction safety guarantees for leaks prevention and observability improvements. Read more
§

fn commit(self) -> Result<bool, ProviderError>

Commit database transaction
§

fn table<T>( &self, ) -> Result<Vec<(<T as Table>::Key, <T as Table>::Value)>, DatabaseError>
where T: Table, <T as Table>::Key: Default + Ord,

Return full table as Vec
§

fn get<T>( &self, range: impl RangeBounds<<T as Table>::Key>, ) -> Result<Vec<(<T as Table>::Key, <T as Table>::Value)>, DatabaseError>
where T: Table,

Return a list of entries from the table, based on the given range.
§

fn cursor_read_collect<T>( &self, range: impl RangeBounds<<T as Table>::Key>, ) -> Result<Vec<<T as Table>::Value>, ProviderError>
where T: Table<Key = u64>,

Iterates over read only values in the given table and collects them into a vector. Read more
§

fn cursor_collect<T>( &self, cursor: &mut impl DbCursorRO<T>, range: impl RangeBounds<<T as Table>::Key>, ) -> Result<Vec<<T as Table>::Value>, ProviderError>
where T: Table<Key = u64>,

Iterates over read only values in the given table and collects them into a vector.
§

fn cursor_collect_with_capacity<T>( &self, cursor: &mut impl DbCursorRO<T>, range: impl RangeBounds<<T as Table>::Key>, capacity: usize, ) -> Result<Vec<<T as Table>::Value>, ProviderError>
where T: Table<Key = u64>,

Iterates over read only values in the given table and collects them into a vector with capacity.
§

fn remove<T>( &self, range: impl RangeBounds<<T as Table>::Key>, ) -> Result<usize, DatabaseError>
where T: Table, Self::Tx: DbTxMut,

Remove list of entries from the table. Returns the number of entries removed.
§

fn take<T>( &self, range: impl RangeBounds<<T as Table>::Key>, ) -> Result<Vec<(<T as Table>::Key, <T as Table>::Value)>, DatabaseError>
where T: Table, Self::Tx: DbTxMut,

Return a list of entries from the table, and remove them, based on the given range.
Source§

impl<TX: Debug, N: Debug + NodeTypes> Debug for DatabaseProvider<TX, N>
where N::ChainSpec: Debug, N::Primitives: Debug, N::Storage: Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> EvmEnvProvider for DatabaseProvider<TX, N>

Source§

fn fill_env_at<EvmConfig>( &self, cfg: &mut CfgEnvWithHandlerCfg, block_env: &mut BlockEnv, at: BlockHashOrNumber, evm_config: EvmConfig, ) -> ProviderResult<()>
where EvmConfig: ConfigureEvmEnv<Header = Header>,

Fills the [CfgEnvWithHandlerCfg] and [BlockEnv] fields with values specific to the given [BlockHashOrNumber].
Source§

fn fill_env_with_header<EvmConfig>( &self, cfg: &mut CfgEnvWithHandlerCfg, block_env: &mut BlockEnv, header: &Header, evm_config: EvmConfig, ) -> ProviderResult<()>
where EvmConfig: ConfigureEvmEnv<Header = Header>,

Fills the [CfgEnvWithHandlerCfg] and [BlockEnv] fields with values specific to the given [Header].
Source§

fn fill_cfg_env_at<EvmConfig>( &self, cfg: &mut CfgEnvWithHandlerCfg, at: BlockHashOrNumber, evm_config: EvmConfig, ) -> ProviderResult<()>
where EvmConfig: ConfigureEvmEnv<Header = Header>,

Fills the [CfgEnvWithHandlerCfg] fields with values specific to the given [BlockHashOrNumber].
Source§

fn fill_cfg_env_with_header<EvmConfig>( &self, cfg: &mut CfgEnvWithHandlerCfg, header: &Header, evm_config: EvmConfig, ) -> ProviderResult<()>
where EvmConfig: ConfigureEvmEnv<Header = Header>,

Fills the [CfgEnvWithHandlerCfg] fields with values specific to the given [Header].
§

fn env_with_header<EvmConfig>( &self, header: &Header, evm_config: EvmConfig, ) -> Result<(CfgEnvWithHandlerCfg, BlockEnv), ProviderError>
where EvmConfig: ConfigureEvmEnv<Header = Header>,

Fills the default [CfgEnvWithHandlerCfg] and [BlockEnv] fields with values specific to the given [Header].
Source§

impl<DB: Database, N: NodeTypes> From<DatabaseProviderRW<DB, N>> for DatabaseProvider<<DB as Database>::TXMut, N>

Source§

fn from(provider: DatabaseProviderRW<DB, N>) -> Self

Converts to this type from the input type.
Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> HashingWriter for DatabaseProvider<TX, N>

Source§

fn unwind_account_hashing<'a>( &self, changesets: impl Iterator<Item = &'a (BlockNumber, AccountBeforeTx)>, ) -> ProviderResult<BTreeMap<B256, Option<Account>>>

Unwind and clear account hashing. Read more
Source§

fn unwind_account_hashing_range( &self, range: impl RangeBounds<BlockNumber>, ) -> ProviderResult<BTreeMap<B256, Option<Account>>>

Unwind and clear account hashing in a given block range. Read more
Source§

fn insert_account_for_hashing( &self, changesets: impl IntoIterator<Item = (Address, Option<Account>)>, ) -> ProviderResult<BTreeMap<B256, Option<Account>>>

Inserts all accounts into reth_db::tables::AccountsHistory table. Read more
Source§

fn unwind_storage_hashing( &self, changesets: impl Iterator<Item = (BlockNumberAddress, StorageEntry)>, ) -> ProviderResult<HashMap<B256, BTreeSet<B256>>>

Unwind and clear storage hashing Read more
Source§

fn unwind_storage_hashing_range( &self, range: impl RangeBounds<BlockNumberAddress>, ) -> ProviderResult<HashMap<B256, BTreeSet<B256>>>

Unwind and clear storage hashing in a given block range. Read more
Source§

fn insert_storage_for_hashing( &self, storages: impl IntoIterator<Item = (Address, impl IntoIterator<Item = StorageEntry>)>, ) -> ProviderResult<HashMap<B256, BTreeSet<B256>>>

Iterates over storages and inserts them to hashing table. Read more
Source§

fn insert_hashes( &self, range: RangeInclusive<BlockNumber>, end_block_hash: B256, expected_state_root: B256, ) -> ProviderResult<()>

Calculate the hashes of all changed accounts and storages, and finally calculate the state root. Read more
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> HeaderProvider for DatabaseProvider<TX, N>

Source§

fn header(&self, block_hash: &BlockHash) -> ProviderResult<Option<Header>>

Get header by block hash
Source§

fn header_by_number(&self, num: BlockNumber) -> ProviderResult<Option<Header>>

Get header by block number
Source§

fn header_td(&self, block_hash: &BlockHash) -> ProviderResult<Option<U256>>

Get total difficulty by block hash.
Source§

fn header_td_by_number( &self, number: BlockNumber, ) -> ProviderResult<Option<U256>>

Get total difficulty by block number.
Source§

fn headers_range( &self, range: impl RangeBounds<BlockNumber>, ) -> ProviderResult<Vec<Header>>

Get headers in range of block numbers
Source§

fn sealed_header( &self, number: BlockNumber, ) -> ProviderResult<Option<SealedHeader>>

Get a single sealed header by block number.
Source§

fn sealed_headers_while( &self, range: impl RangeBounds<BlockNumber>, predicate: impl FnMut(&SealedHeader) -> bool, ) -> ProviderResult<Vec<SealedHeader>>

Get sealed headers while predicate returns true or the range is exhausted.
§

fn is_known(&self, block_hash: &FixedBytes<32>) -> Result<bool, ProviderError>

Check if block is known
§

fn sealed_header_by_hash( &self, block_hash: FixedBytes<32>, ) -> Result<Option<SealedHeader>, ProviderError>

Retrieves the header sealed by the given block hash.
§

fn header_by_hash_or_number( &self, hash_or_num: HashOrNumber, ) -> Result<Option<Header>, ProviderError>

Get header by block number or hash
§

fn sealed_headers_range( &self, range: impl RangeBounds<u64>, ) -> Result<Vec<SealedHeader>, ProviderError>

Get headers in range of block numbers.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> HeaderSyncGapProvider for DatabaseProvider<TX, N>

Source§

fn sync_gap( &self, tip: Receiver<B256>, highest_uninterrupted_block: BlockNumber, ) -> ProviderResult<HeaderSyncGap>

Find a current sync gap for the headers depending on the last uninterrupted block number. Last uninterrupted block represents the block number before which there are no gaps. It’s up to the caller to ensure that last uninterrupted block is determined correctly.
Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> HistoryWriter for DatabaseProvider<TX, N>

Source§

fn unwind_account_history_indices<'a>( &self, changesets: impl Iterator<Item = &'a (BlockNumber, AccountBeforeTx)>, ) -> ProviderResult<usize>

Unwind and clear account history indices. Read more
Source§

fn unwind_account_history_indices_range( &self, range: impl RangeBounds<BlockNumber>, ) -> ProviderResult<usize>

Unwind and clear account history indices in a given block range. Read more
Source§

fn insert_account_history_index( &self, account_transitions: impl IntoIterator<Item = (Address, impl IntoIterator<Item = u64>)>, ) -> ProviderResult<()>

Insert account change index to database. Used inside AccountHistoryIndex stage
Source§

fn unwind_storage_history_indices( &self, changesets: impl Iterator<Item = (BlockNumberAddress, StorageEntry)>, ) -> ProviderResult<usize>

Unwind and clear storage history indices. Read more
Source§

fn unwind_storage_history_indices_range( &self, range: impl RangeBounds<BlockNumberAddress>, ) -> ProviderResult<usize>

Unwind and clear storage history indices in a given block range. Read more
Source§

fn insert_storage_history_index( &self, storage_transitions: impl IntoIterator<Item = ((Address, B256), impl IntoIterator<Item = u64>)>, ) -> ProviderResult<()>

Insert storage change index to database. Used inside StorageHistoryIndex stage
Source§

fn update_history_indices( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<()>

Read account/storage changesets and update account/storage history indices.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> PruneCheckpointReader for DatabaseProvider<TX, N>

Source§

fn get_prune_checkpoint( &self, segment: PruneSegment, ) -> ProviderResult<Option<PruneCheckpoint>>

Fetch the prune checkpoint for the given segment.
Source§

fn get_prune_checkpoints( &self, ) -> ProviderResult<Vec<(PruneSegment, PruneCheckpoint)>>

Fetch all the prune checkpoints.
Source§

impl<TX: DbTxMut, N: NodeTypes> PruneCheckpointWriter for DatabaseProvider<TX, N>

Source§

fn save_prune_checkpoint( &self, segment: PruneSegment, checkpoint: PruneCheckpoint, ) -> ProviderResult<()>

Save prune checkpoint.
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> ReceiptProvider for DatabaseProvider<TX, N>

Source§

fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>>

Get receipt by transaction number Read more
Source§

fn receipt_by_hash(&self, hash: TxHash) -> ProviderResult<Option<Receipt>>

Get receipt by transaction hash. Read more
Source§

fn receipts_by_block( &self, block: BlockHashOrNumber, ) -> ProviderResult<Option<Vec<Receipt>>>

Get receipts by block num or hash. Read more
Source§

fn receipts_by_tx_range( &self, range: impl RangeBounds<TxNumber>, ) -> ProviderResult<Vec<Receipt>>

Get receipts by tx range.
Source§

impl<TX: DbTx, N: NodeTypes> StageCheckpointReader for DatabaseProvider<TX, N>

Source§

fn get_stage_checkpoint_progress( &self, id: StageId, ) -> ProviderResult<Option<Vec<u8>>>

Get stage checkpoint progress.

Source§

fn get_stage_checkpoint( &self, id: StageId, ) -> ProviderResult<Option<StageCheckpoint>>

Fetch the checkpoint for the given stage.
Source§

fn get_all_checkpoints(&self) -> ProviderResult<Vec<(String, StageCheckpoint)>>

Reads all stage checkpoints and returns a list with the name of the stage and the checkpoint data.
Source§

impl<TX: DbTxMut, N: NodeTypes> StageCheckpointWriter for DatabaseProvider<TX, N>

Source§

fn save_stage_checkpoint( &self, id: StageId, checkpoint: StageCheckpoint, ) -> ProviderResult<()>

Save stage checkpoint.

Source§

fn save_stage_checkpoint_progress( &self, id: StageId, checkpoint: Vec<u8>, ) -> ProviderResult<()>

Save stage checkpoint progress.

Source§

fn update_pipeline_stages( &self, block_number: BlockNumber, drop_stage_checkpoint: bool, ) -> ProviderResult<()>

Update all pipeline sync stage progress.
Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> StateChangeWriter for DatabaseProvider<TX, N>

Source§

fn remove_state(&self, range: RangeInclusive<BlockNumber>) -> ProviderResult<()>

Remove the last N blocks of state.

The latest state will be unwound

  1. Iterate over the BlockBodyIndices table to get all the transaction ids.
  2. Iterate over the StorageChangeSets table and the AccountChangeSets tables in reverse order to reconstruct the changesets.
    • In order to have both the old and new values in the changesets, we also access the plain state tables.
  3. While iterating over the changeset tables, if we encounter a new account or storage slot, we:
    1. Take the old value from the changeset
    2. Take the new value from the plain state
    3. Save the old value to the local state
  4. While iterating over the changeset tables, if we encounter an account/storage slot we have seen before we:
    1. Take the old value from the changeset
    2. Take the new value from the local state
    3. Set the local state to the value in the changeset
Source§

fn take_state( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<ExecutionOutcome>

Take the last N blocks of state, recreating the ExecutionOutcome.

The latest state will be unwound and returned back with all the blocks

  1. Iterate over the BlockBodyIndices table to get all the transaction ids.
  2. Iterate over the StorageChangeSets table and the AccountChangeSets tables in reverse order to reconstruct the changesets.
    • In order to have both the old and new values in the changesets, we also access the plain state tables.
  3. While iterating over the changeset tables, if we encounter a new account or storage slot, we:
    1. Take the old value from the changeset
    2. Take the new value from the plain state
    3. Save the old value to the local state
  4. While iterating over the changeset tables, if we encounter an account/storage slot we have seen before we:
    1. Take the old value from the changeset
    2. Take the new value from the local state
    3. Set the local state to the value in the changeset
Source§

fn write_state_reverts( &self, reverts: PlainStateReverts, first_block: BlockNumber, ) -> ProviderResult<()>

Write state reverts to the database. Read more
Source§

fn write_state_changes(&self, changes: StateChangeset) -> ProviderResult<()>

Write state changes to the database.
Source§

fn write_hashed_state( &self, hashed_state: &HashedPostStateSorted, ) -> ProviderResult<()>

Writes the hashed state changes to the database
Source§

impl<TX: DbTx + 'static, N: NodeTypes> StateReader for DatabaseProvider<TX, N>

Source§

fn get_state( &self, block: BlockNumber, ) -> ProviderResult<Option<ExecutionOutcome>>

Get the ExecutionOutcome for the given block
Source§

impl<TX, N: NodeTypes> StaticFileProviderFactory for DatabaseProvider<TX, N>

Source§

fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives>

Returns a static file provider

Source§

type Primitives = <N as NodeTypes>::Primitives

The network primitives type StaticFileProvider is using.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> StatsReader for DatabaseProvider<TX, N>

Source§

fn count_entries<T: Table>(&self) -> ProviderResult<usize>

Fetch the number of entries in the corresponding [Table]. Depending on the provider, it may route to different data sources other than [Table].
Source§

impl<TX: DbTx, N: NodeTypes> StorageChangeSetReader for DatabaseProvider<TX, N>

Source§

fn storage_changeset( &self, block_number: BlockNumber, ) -> ProviderResult<Vec<(BlockNumberAddress, StorageEntry)>>

Iterate over storage changesets and return the storage state from before this block.
Source§

impl<TX: DbTx + 'static, N: NodeTypes> StorageReader for DatabaseProvider<TX, N>

Source§

fn plain_state_storages( &self, addresses_with_keys: impl IntoIterator<Item = (Address, impl IntoIterator<Item = B256>)>, ) -> ProviderResult<Vec<(Address, Vec<StorageEntry>)>>

Get plainstate storages for addresses and storage keys.
Source§

fn changed_storages_with_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<BTreeMap<Address, BTreeSet<B256>>>

Iterate over storage changesets and return all storage slots that were changed.
Source§

fn changed_storages_and_blocks_with_range( &self, range: RangeInclusive<BlockNumber>, ) -> ProviderResult<BTreeMap<(Address, B256), Vec<u64>>>

Iterate over storage changesets and return all storage slots that were changed alongside each specific set of blocks. Read more
Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> StorageTrieWriter for DatabaseProvider<TX, N>

Source§

fn write_storage_trie_updates( &self, storage_tries: &HashMap<B256, StorageTrieUpdates>, ) -> ProviderResult<usize>

Writes storage trie updates from the given storage trie map. First sorts the storage trie updates by the hashed address, writing in sorted order.

Source§

fn write_individual_storage_trie_updates( &self, hashed_address: B256, updates: &StorageTrieUpdates, ) -> ProviderResult<usize>

Writes storage trie updates for the given hashed address.
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> TransactionsProvider for DatabaseProvider<TX, N>

Source§

fn transaction_id(&self, tx_hash: TxHash) -> ProviderResult<Option<TxNumber>>

Get internal transaction identifier by transaction hash. Read more
Source§

fn transaction_by_id( &self, id: TxNumber, ) -> ProviderResult<Option<TransactionSigned>>

Get transaction by id, computes hash every time so more expensive.
Source§

fn transaction_by_id_no_hash( &self, id: TxNumber, ) -> ProviderResult<Option<TransactionSignedNoHash>>

Get transaction by id without computing the hash.
Source§

fn transaction_by_hash( &self, hash: TxHash, ) -> ProviderResult<Option<TransactionSigned>>

Get transaction by transaction hash.
Source§

fn transaction_by_hash_with_meta( &self, tx_hash: TxHash, ) -> ProviderResult<Option<(TransactionSigned, TransactionMeta)>>

Get transaction by transaction hash and additional metadata of the block the transaction was mined in
Source§

fn transaction_block(&self, id: TxNumber) -> ProviderResult<Option<BlockNumber>>

Get transaction block number
Source§

fn transactions_by_block( &self, id: BlockHashOrNumber, ) -> ProviderResult<Option<Vec<TransactionSigned>>>

Get transactions by block id.
Source§

fn transactions_by_block_range( &self, range: impl RangeBounds<BlockNumber>, ) -> ProviderResult<Vec<Vec<TransactionSigned>>>

Get transactions by block range.
Source§

fn transactions_by_tx_range( &self, range: impl RangeBounds<TxNumber>, ) -> ProviderResult<Vec<TransactionSignedNoHash>>

Get transactions by tx range.
Source§

fn senders_by_tx_range( &self, range: impl RangeBounds<TxNumber>, ) -> ProviderResult<Vec<Address>>

Get Senders from a tx range.
Source§

fn transaction_sender(&self, id: TxNumber) -> ProviderResult<Option<Address>>

Get transaction sender. Read more
Source§

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> TransactionsProviderExt for DatabaseProvider<TX, N>

Source§

fn transaction_hashes_by_range( &self, tx_range: Range<TxNumber>, ) -> ProviderResult<Vec<(TxHash, TxNumber)>>

Recovers transaction hashes by walking through Transactions table and calculating them in a parallel manner. Returned unsorted.

§

fn transaction_range_by_block_range( &self, block_range: RangeInclusive<u64>, ) -> Result<RangeInclusive<u64>, ProviderError>

Get transactions range by block range.
Source§

impl<TX: DbTxMut + DbTx + 'static, N: NodeTypes> TrieWriter for DatabaseProvider<TX, N>

Source§

fn write_trie_updates( &self, trie_updates: &TrieUpdates, ) -> ProviderResult<usize>

Writes trie updates. Returns the number of entries modified.

Source§

impl<TX: DbTx + 'static, N: NodeTypes> TryIntoHistoricalStateProvider for DatabaseProvider<TX, N>

Source§

fn try_into_history_at_block( self, block_number: BlockNumber, ) -> ProviderResult<StateProviderBox>

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

impl<TX: DbTx + 'static, N: NodeTypes<ChainSpec: EthereumHardforks>> WithdrawalsProvider for DatabaseProvider<TX, N>

Source§

fn withdrawals_by_block( &self, id: BlockHashOrNumber, timestamp: u64, ) -> ProviderResult<Option<Withdrawals>>

Get withdrawals by block id.
Source§

fn latest_withdrawal(&self) -> ProviderResult<Option<Withdrawal>>

Get latest withdrawal from this block or earlier .

Auto Trait Implementations§

§

impl<TX, N> Freeze for DatabaseProvider<TX, N>
where TX: Freeze,

§

impl<TX, N> !RefUnwindSafe for DatabaseProvider<TX, N>

§

impl<TX, N> Send for DatabaseProvider<TX, N>
where TX: Send,

§

impl<TX, N> Sync for DatabaseProvider<TX, N>
where TX: Sync,

§

impl<TX, N> Unpin for DatabaseProvider<TX, N>
where TX: Unpin,

§

impl<TX, N> !UnwindSafe for DatabaseProvider<TX, N>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<T> ErasedDestructor for T
where T: 'static,

§

impl<T> MaybeDebug for T
where T: Debug,

§

impl<T> MaybeSendSync for T

Layout§

Note: Unable to compute type layout, possibly due to this type having generic parameters. Layout can only be computed for concrete, fully-instantiated types.