mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat: NodePrimitivesProvider (#12855)
This commit is contained in:
@ -27,14 +27,14 @@ use reth_evm::ConfigureEvmEnv;
|
||||
use reth_execution_types::ExecutionOutcome;
|
||||
use reth_node_types::{BlockTy, NodeTypesWithDB, TxTy};
|
||||
use reth_primitives::{
|
||||
Account, Block, BlockWithSenders, NodePrimitives, Receipt, SealedBlock, SealedBlockFor,
|
||||
SealedBlockWithSenders, SealedHeader, StorageEntry, TransactionMeta, TransactionSigned,
|
||||
TransactionSignedNoHash,
|
||||
Account, Block, BlockWithSenders, EthPrimitives, NodePrimitives, Receipt, SealedBlock,
|
||||
SealedBlockFor, SealedBlockWithSenders, SealedHeader, StorageEntry, TransactionMeta,
|
||||
TransactionSigned, TransactionSignedNoHash,
|
||||
};
|
||||
use reth_primitives_traits::BlockBody as _;
|
||||
use reth_prune_types::{PruneCheckpoint, PruneSegment};
|
||||
use reth_stages_types::{StageCheckpoint, StageId};
|
||||
use reth_storage_api::{DBProvider, StorageChangeSetReader};
|
||||
use reth_storage_api::{DBProvider, NodePrimitivesProvider, StorageChangeSetReader};
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg};
|
||||
use std::{
|
||||
@ -150,6 +150,10 @@ impl<N: ProviderNodeTypes> BlockchainProvider2<N> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<N: NodeTypesWithDB> NodePrimitivesProvider for BlockchainProvider2<N> {
|
||||
type Primitives = N::Primitives;
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> DatabaseProviderFactory for BlockchainProvider2<N> {
|
||||
type DB = N::DB;
|
||||
type Provider = <ProviderFactory<N> as DatabaseProviderFactory>::Provider;
|
||||
@ -165,8 +169,6 @@ impl<N: ProviderNodeTypes> DatabaseProviderFactory for BlockchainProvider2<N> {
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> StaticFileProviderFactory for BlockchainProvider2<N> {
|
||||
type Primitives = N::Primitives;
|
||||
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives> {
|
||||
self.database.static_file_provider()
|
||||
}
|
||||
@ -711,8 +713,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<N: NodeTypesWithDB> CanonStateSubscriptions for BlockchainProvider2<N> {
|
||||
fn subscribe_to_canonical_state(&self) -> CanonStateNotifications {
|
||||
impl<N: NodeTypesWithDB<Primitives = EthPrimitives>> CanonStateSubscriptions
|
||||
for BlockchainProvider2<N>
|
||||
{
|
||||
fn subscribe_to_canonical_state(&self) -> CanonStateNotifications<Self::Primitives> {
|
||||
self.canonical_in_memory_state.subscribe_canon_state()
|
||||
}
|
||||
}
|
||||
|
||||
@ -26,7 +26,9 @@ use reth_primitives::{
|
||||
use reth_primitives_traits::{Block, BlockBody};
|
||||
use reth_prune_types::{PruneCheckpoint, PruneSegment};
|
||||
use reth_stages_types::{StageCheckpoint, StageId};
|
||||
use reth_storage_api::{DatabaseProviderFactory, StateProvider, StorageChangeSetReader};
|
||||
use reth_storage_api::{
|
||||
DatabaseProviderFactory, NodePrimitivesProvider, StateProvider, StorageChangeSetReader,
|
||||
};
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
use revm::{
|
||||
db::states::PlainStorageRevert,
|
||||
@ -613,9 +615,11 @@ impl<N: ProviderNodeTypes> ConsistentProvider<N> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> StaticFileProviderFactory for ConsistentProvider<N> {
|
||||
impl<N: ProviderNodeTypes> NodePrimitivesProvider for ConsistentProvider<N> {
|
||||
type Primitives = N::Primitives;
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> StaticFileProviderFactory for ConsistentProvider<N> {
|
||||
fn static_file_provider(&self) -> StaticFileProvider<N::Primitives> {
|
||||
self.storage_provider.static_file_provider()
|
||||
}
|
||||
|
||||
@ -26,7 +26,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_api::{NodePrimitivesProvider, TryIntoHistoricalStateProvider};
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
use revm::primitives::{BlockEnv, CfgEnvWithHandlerCfg};
|
||||
use std::{
|
||||
@ -202,6 +202,10 @@ impl<N: ProviderNodeTypes> ProviderFactory<N> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<N: NodeTypesWithDB> NodePrimitivesProvider for ProviderFactory<N> {
|
||||
type Primitives = N::Primitives;
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> DatabaseProviderFactory for ProviderFactory<N> {
|
||||
type DB = N::DB;
|
||||
type Provider = DatabaseProvider<<N::DB as Database>::TX, N>;
|
||||
@ -217,8 +221,6 @@ impl<N: ProviderNodeTypes> DatabaseProviderFactory for ProviderFactory<N> {
|
||||
}
|
||||
|
||||
impl<N: NodeTypesWithDB> StaticFileProviderFactory for ProviderFactory<N> {
|
||||
type Primitives = N::Primitives;
|
||||
|
||||
/// Returns static file provider
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives> {
|
||||
self.static_file_provider.clone()
|
||||
|
||||
@ -56,7 +56,8 @@ use reth_primitives_traits::{Block as _, BlockBody as _, SignedTransaction};
|
||||
use reth_prune_types::{PruneCheckpoint, PruneModes, PruneSegment};
|
||||
use reth_stages_types::{StageCheckpoint, StageId};
|
||||
use reth_storage_api::{
|
||||
BlockBodyReader, StateProvider, StorageChangeSetReader, TryIntoHistoricalStateProvider,
|
||||
BlockBodyReader, NodePrimitivesProvider, StateProvider, StorageChangeSetReader,
|
||||
TryIntoHistoricalStateProvider,
|
||||
};
|
||||
use reth_storage_errors::provider::{ProviderResult, RootMismatch};
|
||||
use reth_trie::{
|
||||
@ -207,9 +208,11 @@ impl<TX: DbTx + 'static, N: NodeTypes> DatabaseProvider<TX, N> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<TX, N: NodeTypes> StaticFileProviderFactory for DatabaseProvider<TX, N> {
|
||||
impl<TX, N: NodeTypes> NodePrimitivesProvider for DatabaseProvider<TX, N> {
|
||||
type Primitives = N::Primitives;
|
||||
}
|
||||
|
||||
impl<TX, N: NodeTypes> StaticFileProviderFactory for DatabaseProvider<TX, N> {
|
||||
/// Returns a static file provider
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives> {
|
||||
self.static_file_provider.clone()
|
||||
@ -2678,7 +2681,7 @@ impl<TX: DbTxMut + DbTx + 'static, N: NodeTypesForProvider + 'static> BlockExecu
|
||||
&self,
|
||||
block: BlockNumber,
|
||||
remove_transactions_from: StorageLocation,
|
||||
) -> ProviderResult<Chain> {
|
||||
) -> ProviderResult<Chain<Self::Primitives>> {
|
||||
let range = block + 1..=self.last_block_number()?;
|
||||
|
||||
self.unwind_trie_state_range(range.clone())?;
|
||||
|
||||
@ -3,9 +3,10 @@ use crate::{
|
||||
BlockSource, BlockchainTreePendingStateProvider, CanonChainTracker, CanonStateNotifications,
|
||||
CanonStateSubscriptions, ChainSpecProvider, ChainStateBlockReader, ChangeSetReader,
|
||||
DatabaseProviderFactory, EvmEnvProvider, FullExecutionDataProvider, HeaderProvider,
|
||||
ProviderError, PruneCheckpointReader, ReceiptProvider, ReceiptProviderIdExt,
|
||||
StageCheckpointReader, StateProviderBox, StateProviderFactory, StaticFileProviderFactory,
|
||||
TransactionVariant, TransactionsProvider, TreeViewer, WithdrawalsProvider,
|
||||
NodePrimitivesProvider, ProviderError, PruneCheckpointReader, ReceiptProvider,
|
||||
ReceiptProviderIdExt, StageCheckpointReader, StateProviderBox, StateProviderFactory,
|
||||
StaticFileProviderFactory, TransactionVariant, TransactionsProvider, TreeViewer,
|
||||
WithdrawalsProvider,
|
||||
};
|
||||
use alloy_consensus::Header;
|
||||
use alloy_eips::{
|
||||
@ -80,6 +81,7 @@ where
|
||||
BlockHeader = alloy_consensus::Header,
|
||||
BlockBody = reth_primitives::BlockBody,
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
>,
|
||||
>,
|
||||
{
|
||||
@ -94,6 +96,7 @@ impl<T> NodeTypesForProvider for T where
|
||||
BlockHeader = alloy_consensus::Header,
|
||||
BlockBody = reth_primitives::BlockBody,
|
||||
Block = reth_primitives::Block,
|
||||
Receipt = reth_primitives::Receipt,
|
||||
>,
|
||||
>
|
||||
{
|
||||
@ -118,7 +121,7 @@ pub struct BlockchainProvider<N: NodeTypesWithDB> {
|
||||
/// Provider type used to access the database.
|
||||
database: ProviderFactory<N>,
|
||||
/// The blockchain tree instance.
|
||||
tree: Arc<dyn TreeViewer>,
|
||||
tree: Arc<dyn TreeViewer<Primitives = N::Primitives>>,
|
||||
/// Tracks the chain info wrt forkchoice updates
|
||||
chain_info: ChainInfoTracker<reth_primitives::EthPrimitives>,
|
||||
}
|
||||
@ -136,7 +139,7 @@ impl<N: ProviderNodeTypes> Clone for BlockchainProvider<N> {
|
||||
impl<N: NodeTypesWithDB> BlockchainProvider<N> {
|
||||
/// Sets the treeviewer for the provider.
|
||||
#[doc(hidden)]
|
||||
pub fn with_tree(mut self, tree: Arc<dyn TreeViewer>) -> Self {
|
||||
pub fn with_tree(mut self, tree: Arc<dyn TreeViewer<Primitives = N::Primitives>>) -> Self {
|
||||
self.tree = tree;
|
||||
self
|
||||
}
|
||||
@ -148,7 +151,7 @@ impl<N: ProviderNodeTypes> BlockchainProvider<N> {
|
||||
/// if it exists.
|
||||
pub fn with_blocks(
|
||||
database: ProviderFactory<N>,
|
||||
tree: Arc<dyn TreeViewer>,
|
||||
tree: Arc<dyn TreeViewer<Primitives = N::Primitives>>,
|
||||
latest: SealedHeader,
|
||||
finalized: Option<SealedHeader>,
|
||||
safe: Option<SealedHeader>,
|
||||
@ -158,7 +161,10 @@ impl<N: ProviderNodeTypes> BlockchainProvider<N> {
|
||||
|
||||
/// Create a new provider using only the database and the tree, fetching the latest header from
|
||||
/// the database to initialize the provider.
|
||||
pub fn new(database: ProviderFactory<N>, tree: Arc<dyn TreeViewer>) -> ProviderResult<Self> {
|
||||
pub fn new(
|
||||
database: ProviderFactory<N>,
|
||||
tree: Arc<dyn TreeViewer<Primitives = N::Primitives>>,
|
||||
) -> ProviderResult<Self> {
|
||||
let provider = database.provider()?;
|
||||
let best = provider.chain_info()?;
|
||||
let latest_header = provider
|
||||
@ -225,6 +231,10 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> NodePrimitivesProvider for BlockchainProvider<N> {
|
||||
type Primitives = N::Primitives;
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> DatabaseProviderFactory for BlockchainProvider<N> {
|
||||
type DB = N::DB;
|
||||
type Provider = <ProviderFactory<N> as DatabaseProviderFactory>::Provider;
|
||||
@ -240,8 +250,6 @@ impl<N: ProviderNodeTypes> DatabaseProviderFactory for BlockchainProvider<N> {
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> StaticFileProviderFactory for BlockchainProvider<N> {
|
||||
type Primitives = N::Primitives;
|
||||
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives> {
|
||||
self.database.static_file_provider()
|
||||
}
|
||||
@ -944,7 +952,7 @@ impl<N: ProviderNodeTypes> BlockchainTreePendingStateProvider for BlockchainProv
|
||||
}
|
||||
|
||||
impl<N: ProviderNodeTypes> CanonStateSubscriptions for BlockchainProvider<N> {
|
||||
fn subscribe_to_canonical_state(&self) -> CanonStateNotifications {
|
||||
fn subscribe_to_canonical_state(&self) -> CanonStateNotifications<Self::Primitives> {
|
||||
self.tree.subscribe_to_canonical_state()
|
||||
}
|
||||
}
|
||||
|
||||
@ -27,7 +27,7 @@ use reth_primitives::{
|
||||
};
|
||||
use reth_prune_types::{PruneCheckpoint, PruneSegment};
|
||||
use reth_stages_types::{StageCheckpoint, StageId};
|
||||
use reth_storage_api::{StateProofProvider, StorageRootProvider};
|
||||
use reth_storage_api::{NodePrimitivesProvider, StateProofProvider, StorageRootProvider};
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
use reth_trie::{
|
||||
updates::TrieUpdates, AccountProof, HashedPostState, HashedStorage, MultiProof, TrieInput,
|
||||
@ -559,9 +559,11 @@ impl PruneCheckpointReader for NoopProvider {
|
||||
}
|
||||
}
|
||||
|
||||
impl StaticFileProviderFactory for NoopProvider {
|
||||
impl NodePrimitivesProvider for NoopProvider {
|
||||
type Primitives = EthPrimitives;
|
||||
}
|
||||
|
||||
impl StaticFileProviderFactory for NoopProvider {
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives> {
|
||||
StaticFileProvider::read_only(PathBuf::default(), false).unwrap()
|
||||
}
|
||||
|
||||
@ -1,7 +1,9 @@
|
||||
use alloy_primitives::BlockNumber;
|
||||
use reth_db_api::models::StoredBlockBodyIndices;
|
||||
use reth_execution_types::{Chain, ExecutionOutcome};
|
||||
use reth_node_types::NodePrimitives;
|
||||
use reth_primitives::SealedBlockWithSenders;
|
||||
use reth_storage_api::NodePrimitivesProvider;
|
||||
use reth_storage_errors::provider::ProviderResult;
|
||||
use reth_trie::{updates::TrieUpdates, HashedPostStateSorted};
|
||||
|
||||
@ -28,9 +30,10 @@ impl StorageLocation {
|
||||
}
|
||||
}
|
||||
|
||||
/// BlockExecution Writer
|
||||
#[auto_impl::auto_impl(&, Arc, Box)]
|
||||
pub trait BlockExecutionWriter: BlockWriter + Send + Sync {
|
||||
/// `BlockExecution` Writer
|
||||
pub trait BlockExecutionWriter:
|
||||
NodePrimitivesProvider<Primitives: NodePrimitives<Block = Self::Block>> + BlockWriter + Send + Sync
|
||||
{
|
||||
/// Take all of the blocks above the provided number and their execution result
|
||||
///
|
||||
/// The passed block number will stay in the database.
|
||||
@ -38,7 +41,7 @@ pub trait BlockExecutionWriter: BlockWriter + Send + Sync {
|
||||
&self,
|
||||
block: BlockNumber,
|
||||
remove_transactions_from: StorageLocation,
|
||||
) -> ProviderResult<Chain>;
|
||||
) -> ProviderResult<Chain<Self::Primitives>>;
|
||||
|
||||
/// Remove all of the blocks above the provided number and their execution result
|
||||
///
|
||||
@ -50,6 +53,24 @@ pub trait BlockExecutionWriter: BlockWriter + Send + Sync {
|
||||
) -> ProviderResult<()>;
|
||||
}
|
||||
|
||||
impl<T: BlockExecutionWriter> BlockExecutionWriter for &T {
|
||||
fn take_block_and_execution_above(
|
||||
&self,
|
||||
block: BlockNumber,
|
||||
remove_transactions_from: StorageLocation,
|
||||
) -> ProviderResult<Chain<Self::Primitives>> {
|
||||
(*self).take_block_and_execution_above(block, remove_transactions_from)
|
||||
}
|
||||
|
||||
fn remove_block_and_execution_above(
|
||||
&self,
|
||||
block: BlockNumber,
|
||||
remove_transactions_from: StorageLocation,
|
||||
) -> ProviderResult<()> {
|
||||
(*self).remove_block_and_execution_above(block, remove_transactions_from)
|
||||
}
|
||||
}
|
||||
|
||||
/// This just receives state, or [`ExecutionOutcome`], from the provider
|
||||
#[auto_impl::auto_impl(&, Arc, Box)]
|
||||
pub trait StateReader: Send + Sync {
|
||||
|
||||
@ -19,7 +19,7 @@ pub trait FullProvider<N: NodeTypesWithDB>:
|
||||
+ EvmEnvProvider
|
||||
+ ChainSpecProvider<ChainSpec = N::ChainSpec>
|
||||
+ ChangeSetReader
|
||||
+ CanonStateSubscriptions
|
||||
+ CanonStateSubscriptions<Primitives = N::Primitives>
|
||||
+ ForkChoiceSubscriptions
|
||||
+ StageCheckpointReader
|
||||
+ Clone
|
||||
@ -37,7 +37,7 @@ impl<T, N: NodeTypesWithDB> FullProvider<N> for T where
|
||||
+ EvmEnvProvider
|
||||
+ ChainSpecProvider<ChainSpec = N::ChainSpec>
|
||||
+ ChangeSetReader
|
||||
+ CanonStateSubscriptions
|
||||
+ CanonStateSubscriptions<Primitives = N::Primitives>
|
||||
+ ForkChoiceSubscriptions
|
||||
+ StageCheckpointReader
|
||||
+ Clone
|
||||
|
||||
@ -1,12 +1,9 @@
|
||||
use reth_node_types::NodePrimitives;
|
||||
use reth_storage_api::NodePrimitivesProvider;
|
||||
|
||||
use crate::providers::StaticFileProvider;
|
||||
|
||||
/// Static file provider factory.
|
||||
pub trait StaticFileProviderFactory {
|
||||
/// The network primitives type [`StaticFileProvider`] is using.
|
||||
type Primitives: NodePrimitives;
|
||||
|
||||
pub trait StaticFileProviderFactory: NodePrimitivesProvider {
|
||||
/// Create new instance of static file provider.
|
||||
fn static_file_provider(&self) -> StaticFileProvider<Self::Primitives>;
|
||||
}
|
||||
|
||||
@ -70,3 +70,6 @@ pub use stats::*;
|
||||
|
||||
mod legacy;
|
||||
pub use legacy::*;
|
||||
|
||||
mod primitives;
|
||||
pub use primitives::*;
|
||||
|
||||
8
crates/storage/storage-api/src/primitives.rs
Normal file
8
crates/storage/storage-api/src/primitives.rs
Normal file
@ -0,0 +1,8 @@
|
||||
use reth_primitives::NodePrimitives;
|
||||
|
||||
/// Provider implementation that knows configured [`NodePrimitives`].
|
||||
#[auto_impl::auto_impl(&, Arc, Box)]
|
||||
pub trait NodePrimitivesProvider {
|
||||
/// The node primitive types.
|
||||
type Primitives: NodePrimitives;
|
||||
}
|
||||
Reference in New Issue
Block a user