chore: separate trait for conversion into state provider (#10858)

This commit is contained in:
Arsenii Kulikov
2024-09-13 21:03:52 +04:00
committed by GitHub
parent c6359b6242
commit 75c6295d29
4 changed files with 17 additions and 7 deletions

View File

@ -17,7 +17,7 @@ use reth_execution_types::{Chain, ExecutionOutcome};
use reth_primitives::{ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader}; use reth_primitives::{ForkBlock, GotExpected, SealedBlockWithSenders, SealedHeader};
use reth_provider::{ use reth_provider::{
providers::{BundleStateProvider, ConsistentDbView, ProviderNodeTypes}, providers::{BundleStateProvider, ConsistentDbView, ProviderNodeTypes},
FullExecutionDataProvider, ProviderError, StateRootProvider, FullExecutionDataProvider, ProviderError, StateRootProvider, TryIntoHistoricalStateProvider,
}; };
use reth_revm::database::StateProviderDatabase; use reth_revm::database::StateProviderDatabase;
use reth_trie::{updates::TrieUpdates, HashedPostState}; 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 // 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. // will be open in parallel. See https://github.com/paradigmxyz/reth/issues/7509.
.disable_long_read_transaction_safety() .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); let provider = BundleStateProvider::new(state_provider, bundle_state_data_provider);

View File

@ -22,6 +22,7 @@ use reth_primitives::{
}; };
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::TryIntoHistoricalStateProvider;
use reth_storage_errors::provider::ProviderResult; use reth_storage_errors::provider::ProviderResult;
use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg}; use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg};
use std::{ use std::{
@ -163,7 +164,7 @@ impl<N: ProviderNodeTypes> ProviderFactory<N> {
&self, &self,
block_number: BlockNumber, block_number: BlockNumber,
) -> ProviderResult<StateProviderBox> { ) -> ProviderResult<StateProviderBox> {
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"); trace!(target: "providers::db", ?block_number, "Returning historical state provider for block number");
Ok(state_provider) Ok(state_provider)
} }
@ -176,7 +177,7 @@ impl<N: ProviderNodeTypes> ProviderFactory<N> {
.block_number(block_hash)? .block_number(block_hash)?
.ok_or(ProviderError::BlockHashNotFound(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"); trace!(target: "providers::db", ?block_number, %block_hash, "Returning historical state provider for block hash");
Ok(state_provider) Ok(state_provider)
} }

View File

@ -45,6 +45,7 @@ use reth_primitives::{
}; };
use reth_prune_types::{PruneCheckpoint, PruneLimiter, PruneModes, PruneSegment}; use reth_prune_types::{PruneCheckpoint, PruneLimiter, PruneModes, PruneSegment};
use reth_stages_types::{StageCheckpoint, StageId}; use reth_stages_types::{StageCheckpoint, StageId};
use reth_storage_api::TryIntoHistoricalStateProvider;
use reth_storage_errors::provider::{ProviderResult, RootMismatch}; use reth_storage_errors::provider::{ProviderResult, RootMismatch};
use reth_trie::{ use reth_trie::{
prefix_set::{PrefixSet, PrefixSetMut, TriePrefixSets}, prefix_set::{PrefixSet, PrefixSetMut, TriePrefixSets},
@ -141,9 +142,8 @@ impl<TX: DbTxMut> DatabaseProvider<TX> {
} }
} }
impl<TX: DbTx + 'static> DatabaseProvider<TX> { impl<TX: DbTx + 'static> TryIntoHistoricalStateProvider for DatabaseProvider<TX> {
/// Storage provider for state at that given block fn try_into_history_at_block(
pub fn state_provider_by_block_number(
self, self,
mut block_number: BlockNumber, mut block_number: BlockNumber,
) -> ProviderResult<StateProviderBox> { ) -> ProviderResult<StateProviderBox> {

View File

@ -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<StateProviderBox>;
}
/// Light wrapper that returns `StateProvider` implementations that correspond to the given /// Light wrapper that returns `StateProvider` implementations that correspond to the given
/// `BlockNumber`, the latest state, or the pending state. /// `BlockNumber`, the latest state, or the pending state.
/// ///