diff --git a/crates/blockchain-tree/src/chain.rs b/crates/blockchain-tree/src/chain.rs index e720b35df6..b070fd2aaf 100644 --- a/crates/blockchain-tree/src/chain.rs +++ b/crates/blockchain-tree/src/chain.rs @@ -17,7 +17,7 @@ use reth_execution_types::{Chain, ExecutionOutcome}; use reth_primitives::{ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader}; use reth_provider::{ providers::{BundleStateProvider, ConsistentDbView, ProviderNodeTypes}, - FullExecutionDataProvider, ProviderError, StateRootProvider, + FullExecutionDataProvider, ProviderError, StateRootProvider, TryIntoHistoricalStateProvider, }; use reth_revm::database::StateProviderDatabase; use reth_trie::{updates::TrieUpdates, HashedPostState}; @@ -198,7 +198,7 @@ impl AppendableChain { // State root calculation can take a while, and we're sure no write transaction // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/7509. .disable_long_read_transaction_safety() - .state_provider_by_block_number(canonical_fork.number)?; + .try_into_history_at_block(canonical_fork.number)?; let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider); diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index 2c79134ca9..df29d809c0 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -22,6 +22,7 @@ use reth_primitives::{ }; use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; +use reth_storage_api::TryIntoHistoricalStateProvider; use reth_storage_errors::provider::ProviderResult; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg}; use std::{ @@ -163,7 +164,7 @@ impl ProviderFactory { &self, block_number: BlockNumber, ) -> ProviderResult { - let state_provider = self.provider()?.state_provider_by_block_number(block_number)?; + let state_provider = self.provider()?.try_into_history_at_block(block_number)?; trace!(target: "providers::db", ?block_number, "Returning historical state provider for block number"); Ok(state_provider) } @@ -176,7 +177,7 @@ impl ProviderFactory { .block_number(block_hash)? .ok_or(ProviderError::BlockHashNotFound(block_hash))?; - let state_provider = self.provider()?.state_provider_by_block_number(block_number)?; + let state_provider = self.provider()?.try_into_history_at_block(block_number)?; trace!(target: "providers::db", ?block_number, %block_hash, "Returning historical state provider for block hash"); Ok(state_provider) } diff --git a/crates/storage/provider/src/providers/database/provider.rs b/crates/storage/provider/src/providers/database/provider.rs index fa608d2c1e..c2bf4cdf78 100644 --- a/crates/storage/provider/src/providers/database/provider.rs +++ b/crates/storage/provider/src/providers/database/provider.rs @@ -45,6 +45,7 @@ use reth_primitives::{ }; use reth_prune_types::{PruneCheckpoint, PruneLimiter, PruneModes, PruneSegment}; use reth_stages_types::{StageCheckpoint, StageId}; +use reth_storage_api::TryIntoHistoricalStateProvider; use reth_storage_errors::provider::{ProviderResult, RootMismatch}; use reth_trie::{ prefix_set::{PrefixSet, PrefixSetMut, TriePrefixSets}, @@ -141,9 +142,8 @@ impl DatabaseProvider { } } -impl DatabaseProvider { - /// Storage provider for state at that given block - pub fn state_provider_by_block_number( +impl TryIntoHistoricalStateProvider for DatabaseProvider { + fn try_into_history_at_block( self, mut block_number: BlockNumber, ) -> ProviderResult { diff --git a/crates/storage/storage-api/src/state.rs b/crates/storage/storage-api/src/state.rs index f1fc640e36..bd487ce0d7 100644 --- a/crates/storage/storage-api/src/state.rs +++ b/crates/storage/storage-api/src/state.rs @@ -82,6 +82,15 @@ pub trait StateProvider: } } +/// Trait implemented for database providers that can be converted into a historical state provider. +pub trait TryIntoHistoricalStateProvider { + /// Returns a historical [`StateProvider`] indexed by the given historic block number. + fn try_into_history_at_block( + self, + block_number: BlockNumber, + ) -> ProviderResult; +} + /// Light wrapper that returns `StateProvider` implementations that correspond to the given /// `BlockNumber`, the latest state, or the pending state. ///