feat: NodePrimitivesProvider (#12855)

This commit is contained in:
Arsenii Kulikov
2024-11-26 16:06:55 +04:00
committed by GitHub
parent b34fb7883a
commit 26fc701814
40 changed files with 239 additions and 148 deletions

View File

@ -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()
}
}

View File

@ -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()
}

View File

@ -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()

View File

@ -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())?;

View File

@ -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()
}
}

View File

@ -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()
}

View File

@ -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 {

View File

@ -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

View File

@ -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>;
}

View File

@ -70,3 +70,6 @@ pub use stats::*;
mod legacy;
pub use legacy::*;
mod primitives;
pub use primitives::*;

View 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;
}