mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 19:09:54 +00:00
chore: separate trait for conversion into state provider (#10858)
This commit is contained in:
@ -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);
|
||||
|
||||
|
||||
@ -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<N: ProviderNodeTypes> ProviderFactory<N> {
|
||||
&self,
|
||||
block_number: BlockNumber,
|
||||
) -> 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");
|
||||
Ok(state_provider)
|
||||
}
|
||||
@ -176,7 +177,7 @@ impl<N: ProviderNodeTypes> ProviderFactory<N> {
|
||||
.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)
|
||||
}
|
||||
|
||||
@ -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<TX: DbTxMut> DatabaseProvider<TX> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<TX: DbTx + 'static> DatabaseProvider<TX> {
|
||||
/// Storage provider for state at that given block
|
||||
pub fn state_provider_by_block_number(
|
||||
impl<TX: DbTx + 'static> TryIntoHistoricalStateProvider for DatabaseProvider<TX> {
|
||||
fn try_into_history_at_block(
|
||||
self,
|
||||
mut block_number: BlockNumber,
|
||||
) -> ProviderResult<StateProviderBox> {
|
||||
|
||||
@ -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
|
||||
/// `BlockNumber`, the latest state, or the pending state.
|
||||
///
|
||||
|
||||
Reference in New Issue
Block a user