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_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);
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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> {
|
||||||
|
|||||||
@ -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.
|
||||||
///
|
///
|
||||||
|
|||||||
Reference in New Issue
Block a user