mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat(storage): replace Tree generic with Arc<dyn TreeViewer> (#7810)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
@ -174,7 +174,7 @@ impl Command {
|
||||
EvmProcessorFactory::new(self.chain.clone(), evm_config),
|
||||
);
|
||||
let tree = BlockchainTree::new(tree_externals, BlockchainTreeConfig::default(), None)?;
|
||||
let blockchain_tree = ShareableBlockchainTree::new(tree);
|
||||
let blockchain_tree = Arc::new(ShareableBlockchainTree::new(tree));
|
||||
|
||||
// fetch the best block from the database
|
||||
let best_block =
|
||||
|
||||
@ -136,11 +136,10 @@ impl Command {
|
||||
EvmProcessorFactory::new(self.chain.clone(), evm_config),
|
||||
);
|
||||
let tree = BlockchainTree::new(tree_externals, BlockchainTreeConfig::default(), None)?;
|
||||
let blockchain_tree = ShareableBlockchainTree::new(tree);
|
||||
let blockchain_tree = Arc::new(ShareableBlockchainTree::new(tree));
|
||||
|
||||
// Set up the blockchain provider
|
||||
let blockchain_db =
|
||||
BlockchainProvider::new(provider_factory.clone(), blockchain_tree.clone())?;
|
||||
let blockchain_db = BlockchainProvider::new(provider_factory.clone(), blockchain_tree)?;
|
||||
|
||||
// Set up network
|
||||
let network_secret_path =
|
||||
|
||||
@ -43,13 +43,7 @@ type DatabaseEnv = TempDatabase<DE>;
|
||||
|
||||
type TestBeaconConsensusEngine<Client> = BeaconConsensusEngine<
|
||||
Arc<DatabaseEnv>,
|
||||
BlockchainProvider<
|
||||
Arc<DatabaseEnv>,
|
||||
ShareableBlockchainTree<
|
||||
Arc<DatabaseEnv>,
|
||||
EitherExecutorFactory<TestExecutorFactory, EvmProcessorFactory<EthEvmConfig>>,
|
||||
>,
|
||||
>,
|
||||
BlockchainProvider<Arc<DatabaseEnv>>,
|
||||
Arc<EitherDownloader<Client, NoopFullBlockClient>>,
|
||||
EthEngineTypes,
|
||||
>;
|
||||
@ -423,9 +417,9 @@ where
|
||||
// Setup blockchain tree
|
||||
let externals = TreeExternals::new(provider_factory.clone(), consensus, executor_factory);
|
||||
let config = BlockchainTreeConfig::new(1, 2, 3, 2);
|
||||
let tree = ShareableBlockchainTree::new(
|
||||
let tree = Arc::new(ShareableBlockchainTree::new(
|
||||
BlockchainTree::new(externals, config, None).expect("failed to create tree"),
|
||||
);
|
||||
));
|
||||
let latest = self.base_config.chain_spec.genesis_header().seal_slow();
|
||||
let blockchain_provider =
|
||||
BlockchainProvider::with_latest(provider_factory.clone(), tree, latest);
|
||||
|
||||
@ -1,15 +1,13 @@
|
||||
use node::NodeHelper;
|
||||
use reth::{
|
||||
args::{DiscoveryArgs, NetworkArgs, RpcServerArgs},
|
||||
blockchain_tree::ShareableBlockchainTree,
|
||||
builder::{NodeBuilder, NodeConfig, NodeHandle},
|
||||
revm::EvmProcessorFactory,
|
||||
tasks::TaskManager,
|
||||
};
|
||||
use reth_db::{test_utils::TempDatabase, DatabaseEnv};
|
||||
use reth_node_builder::{
|
||||
components::{NetworkBuilder, PayloadServiceBuilder, PoolBuilder},
|
||||
FullNodeComponentsAdapter, FullNodeTypesAdapter, NodeTypes,
|
||||
FullNodeComponentsAdapter, FullNodeTypesAdapter,
|
||||
};
|
||||
use reth_primitives::ChainSpec;
|
||||
use reth_provider::providers::BlockchainProvider;
|
||||
@ -100,12 +98,10 @@ where
|
||||
// Type aliases
|
||||
|
||||
type TmpDB = Arc<TempDatabase<DatabaseEnv>>;
|
||||
type EvmType<N> = EvmProcessorFactory<<N as NodeTypes>::Evm>;
|
||||
type RethProvider<N> = BlockchainProvider<TmpDB, ShareableBlockchainTree<TmpDB, EvmType<N>>>;
|
||||
type TmpPool<N> = <<N as reth_node_builder::Node<TmpNodeAdapter<N>>>::PoolBuilder as PoolBuilder<
|
||||
TmpNodeAdapter<N>,
|
||||
>>::Pool;
|
||||
type TmpNodeAdapter<N> = FullNodeTypesAdapter<N, TmpDB, RethProvider<N>>;
|
||||
type TmpNodeAdapter<N> = FullNodeTypesAdapter<N, TmpDB, BlockchainProvider<TmpDB>>;
|
||||
|
||||
/// Type alias for a type of NodeHelper
|
||||
pub type NodeHelperType<N> = NodeHelper<FullNodeComponentsAdapter<TmpNodeAdapter<N>, TmpPool<N>>>;
|
||||
|
||||
@ -63,11 +63,9 @@ use tokio::sync::{mpsc::unbounded_channel, oneshot};
|
||||
|
||||
/// The builtin provider type of the reth node.
|
||||
// Note: we need to hardcode this because custom components might depend on it in associated types.
|
||||
type RethFullProviderType<DB, Evm> =
|
||||
BlockchainProvider<DB, ShareableBlockchainTree<DB, EvmProcessorFactory<Evm>>>;
|
||||
type RethFullProviderType<DB> = BlockchainProvider<DB>;
|
||||
|
||||
type RethFullAdapter<DB, N> =
|
||||
FullNodeTypesAdapter<N, DB, RethFullProviderType<DB, <N as NodeTypes>::Evm>>;
|
||||
type RethFullAdapter<DB, N> = FullNodeTypesAdapter<N, DB, RethFullProviderType<DB>>;
|
||||
|
||||
#[cfg_attr(doc, aquamarine::aquamarine)]
|
||||
/// Declaratively construct a node.
|
||||
@ -278,7 +276,7 @@ where
|
||||
>,
|
||||
>
|
||||
where
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB, <N as NodeTypes>::Evm>>>,
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB>>>,
|
||||
N::PoolBuilder: PoolBuilder<RethFullAdapter<DB, N>>,
|
||||
N::NetworkBuilder: crate::components::NetworkBuilder<
|
||||
RethFullAdapter<DB, N>,
|
||||
@ -308,15 +306,14 @@ where
|
||||
Types,
|
||||
Components,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
>
|
||||
where
|
||||
Components: NodeComponentsBuilder<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
>,
|
||||
Components:
|
||||
NodeComponentsBuilder<FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>>,
|
||||
{
|
||||
NodeBuilder {
|
||||
config: self.config,
|
||||
@ -339,7 +336,7 @@ impl<DB, Types, Components>
|
||||
Types,
|
||||
Components,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -347,9 +344,7 @@ impl<DB, Types, Components>
|
||||
where
|
||||
DB: Database + DatabaseMetrics + DatabaseMetadata + Clone + Unpin + 'static,
|
||||
Types: NodeTypes,
|
||||
Components: NodeComponentsBuilder<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
>,
|
||||
Components: NodeComponentsBuilder<FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>>,
|
||||
{
|
||||
/// Apply a function to the components builder.
|
||||
pub fn map_components(self, f: impl FnOnce(Components) -> Components) -> Self {
|
||||
@ -371,7 +366,7 @@ where
|
||||
where
|
||||
F: Fn(
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
) -> eyre::Result<()>
|
||||
@ -388,7 +383,7 @@ where
|
||||
F: Fn(
|
||||
FullNode<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -407,7 +402,7 @@ where
|
||||
RpcContext<
|
||||
'_,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -427,7 +422,7 @@ where
|
||||
RpcContext<
|
||||
'_,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -449,7 +444,7 @@ where
|
||||
F: Fn(
|
||||
ExExContext<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -476,7 +471,7 @@ where
|
||||
) -> eyre::Result<
|
||||
NodeHandle<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -556,7 +551,7 @@ where
|
||||
.with_sync_metrics_tx(sync_metrics_tx.clone());
|
||||
|
||||
let canon_state_notification_sender = tree.canon_state_notification_sender();
|
||||
let blockchain_tree = ShareableBlockchainTree::new(tree);
|
||||
let blockchain_tree = Arc::new(ShareableBlockchainTree::new(tree));
|
||||
debug!(target: "reth::cli", "configured blockchain tree");
|
||||
|
||||
// fetch the head block from the database
|
||||
@ -995,7 +990,7 @@ where
|
||||
>,
|
||||
>
|
||||
where
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB, <N as NodeTypes>::Evm>>>,
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB>>>,
|
||||
N::PoolBuilder: PoolBuilder<RethFullAdapter<DB, N>>,
|
||||
N::NetworkBuilder: crate::components::NetworkBuilder<
|
||||
RethFullAdapter<DB, N>,
|
||||
@ -1032,7 +1027,7 @@ where
|
||||
>,
|
||||
>
|
||||
where
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB, <N as NodeTypes>::Evm>>>,
|
||||
N: Node<FullNodeTypesAdapter<N, DB, RethFullProviderType<DB>>>,
|
||||
N::PoolBuilder: PoolBuilder<RethFullAdapter<DB, N>>,
|
||||
N::NetworkBuilder: crate::components::NetworkBuilder<
|
||||
RethFullAdapter<DB, N>,
|
||||
@ -1065,15 +1060,14 @@ where
|
||||
Types,
|
||||
Components,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
>
|
||||
where
|
||||
Components: NodeComponentsBuilder<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
>,
|
||||
Components:
|
||||
NodeComponentsBuilder<FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>>,
|
||||
{
|
||||
WithLaunchContext {
|
||||
builder: self.builder.with_components(components_builder),
|
||||
@ -1090,7 +1084,7 @@ impl<DB, Types, Components>
|
||||
Types,
|
||||
Components,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1098,9 +1092,7 @@ impl<DB, Types, Components>
|
||||
where
|
||||
DB: Database + DatabaseMetrics + DatabaseMetadata + Clone + Unpin + 'static,
|
||||
Types: NodeTypes,
|
||||
Components: NodeComponentsBuilder<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
>,
|
||||
Components: NodeComponentsBuilder<FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>>,
|
||||
{
|
||||
/// Apply a function to the components builder.
|
||||
pub fn map_components(self, f: impl FnOnce(Components) -> Components) -> Self {
|
||||
@ -1116,7 +1108,7 @@ where
|
||||
where
|
||||
F: Fn(
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
) -> eyre::Result<()>
|
||||
@ -1133,7 +1125,7 @@ where
|
||||
F: Fn(
|
||||
FullNode<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1152,7 +1144,7 @@ where
|
||||
RpcContext<
|
||||
'_,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1172,7 +1164,7 @@ where
|
||||
RpcContext<
|
||||
'_,
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1190,7 +1182,7 @@ where
|
||||
F: Fn(
|
||||
ExExContext<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1210,7 +1202,7 @@ where
|
||||
) -> eyre::Result<
|
||||
NodeHandle<
|
||||
FullNodeComponentsAdapter<
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
Components::Pool,
|
||||
>,
|
||||
>,
|
||||
@ -1391,13 +1383,12 @@ impl<Node: FullNodeTypes> std::fmt::Debug for BuilderContext<Node> {
|
||||
pub struct InitState;
|
||||
|
||||
/// The state after all types of the node have been configured.
|
||||
#[derive(Debug)]
|
||||
pub struct TypesState<Types, DB>
|
||||
where
|
||||
DB: Database + Clone + 'static,
|
||||
Types: NodeTypes,
|
||||
{
|
||||
adapter: FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB, Types::Evm>>,
|
||||
adapter: FullNodeTypesAdapter<Types, DB, RethFullProviderType<DB>>,
|
||||
}
|
||||
|
||||
/// The state of the node builder process after the node's components have been configured.
|
||||
|
||||
@ -4,7 +4,8 @@ use crate::{
|
||||
CanonStateNotifications, CanonStateSubscriptions, ChainSpecProvider, ChangeSetReader,
|
||||
DatabaseProviderFactory, EvmEnvProvider, HeaderProvider, ProviderError, PruneCheckpointReader,
|
||||
ReceiptProvider, ReceiptProviderIdExt, StageCheckpointReader, StateProviderBox,
|
||||
StateProviderFactory, TransactionVariant, TransactionsProvider, WithdrawalsProvider,
|
||||
StateProviderFactory, TransactionVariant, TransactionsProvider, TreeViewer,
|
||||
WithdrawalsProvider,
|
||||
};
|
||||
use reth_db::{
|
||||
database::Database,
|
||||
@ -67,31 +68,36 @@ use reth_rpc_types::engine::ForkchoiceState;
|
||||
/// This type serves as the main entry point for interacting with the blockchain and provides data
|
||||
/// from database storage and from the blockchain tree (pending state etc.) It is a simple wrapper
|
||||
/// type that holds an instance of the database and the blockchain tree.
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct BlockchainProvider<DB, Tree> {
|
||||
#[derive(Clone)]
|
||||
#[allow(missing_debug_implementations)]
|
||||
pub struct BlockchainProvider<DB> {
|
||||
/// Provider type used to access the database.
|
||||
database: ProviderFactory<DB>,
|
||||
/// The blockchain tree instance.
|
||||
tree: Tree,
|
||||
tree: Arc<dyn TreeViewer>,
|
||||
/// Tracks the chain info wrt forkchoice updates
|
||||
chain_info: ChainInfoTracker,
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainProvider<DB, Tree> {
|
||||
impl<DB> BlockchainProvider<DB> {
|
||||
/// Create new provider instance that wraps the database and the blockchain tree, using the
|
||||
/// provided latest header to initialize the chain info tracker.
|
||||
pub fn with_latest(database: ProviderFactory<DB>, tree: Tree, latest: SealedHeader) -> Self {
|
||||
pub fn with_latest(
|
||||
database: ProviderFactory<DB>,
|
||||
tree: Arc<dyn TreeViewer>,
|
||||
latest: SealedHeader,
|
||||
) -> Self {
|
||||
Self { database, tree, chain_info: ChainInfoTracker::new(latest) }
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
{
|
||||
/// 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<DB>, tree: Tree) -> ProviderResult<Self> {
|
||||
pub fn new(database: ProviderFactory<DB>, tree: Arc<dyn TreeViewer>) -> ProviderResult<Self> {
|
||||
let provider = database.provider()?;
|
||||
let best: ChainInfo = provider.chain_info()?;
|
||||
match provider.header_by_number(best.best_number)? {
|
||||
@ -104,10 +110,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer,
|
||||
{
|
||||
/// Ensures that the given block number is canonical (synced)
|
||||
///
|
||||
@ -128,7 +133,7 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> DatabaseProviderFactory<DB> for BlockchainProvider<DB, Tree>
|
||||
impl<DB> DatabaseProviderFactory<DB> for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
{
|
||||
@ -137,10 +142,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> HeaderProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> HeaderProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn header(&self, block_hash: &BlockHash) -> ProviderResult<Option<Header>> {
|
||||
self.database.header(block_hash)
|
||||
@ -182,10 +186,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockHashReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockHashReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn block_hash(&self, number: u64) -> ProviderResult<Option<B256>> {
|
||||
self.database.block_hash(number)
|
||||
@ -200,10 +203,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockNumReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockNumReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer + Send + Sync,
|
||||
{
|
||||
fn chain_info(&self) -> ProviderResult<ChainInfo> {
|
||||
Ok(self.chain_info.chain_info())
|
||||
@ -222,10 +224,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockIdReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockIdReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer + Send + Sync,
|
||||
{
|
||||
fn pending_block_num_hash(&self) -> ProviderResult<Option<BlockNumHash>> {
|
||||
Ok(self.tree.pending_block_num_hash())
|
||||
@ -240,10 +241,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer + Send + Sync,
|
||||
{
|
||||
fn find_block_by_hash(&self, hash: B256, source: BlockSource) -> ProviderResult<Option<Block>> {
|
||||
let block = match source {
|
||||
@ -320,10 +320,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> TransactionsProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> TransactionsProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer + Send + Sync,
|
||||
{
|
||||
fn transaction_id(&self, tx_hash: TxHash) -> ProviderResult<Option<TxNumber>> {
|
||||
self.database.transaction_id(tx_hash)
|
||||
@ -388,10 +387,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> ReceiptProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> ReceiptProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn receipt(&self, id: TxNumber) -> ProviderResult<Option<Receipt>> {
|
||||
self.database.receipt(id)
|
||||
@ -412,10 +410,10 @@ where
|
||||
self.database.receipts_by_tx_range(range)
|
||||
}
|
||||
}
|
||||
impl<DB, Tree> ReceiptProviderIdExt for BlockchainProvider<DB, Tree>
|
||||
|
||||
impl<DB> ReceiptProviderIdExt for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreeViewer + Send + Sync,
|
||||
{
|
||||
fn receipts_by_block_id(&self, block: BlockId) -> ProviderResult<Option<Vec<Receipt>>> {
|
||||
match block {
|
||||
@ -440,10 +438,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> WithdrawalsProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> WithdrawalsProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn withdrawals_by_block(
|
||||
&self,
|
||||
@ -458,10 +455,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> StageCheckpointReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> StageCheckpointReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn get_stage_checkpoint(&self, id: StageId) -> ProviderResult<Option<StageCheckpoint>> {
|
||||
self.database.provider()?.get_stage_checkpoint(id)
|
||||
@ -472,10 +468,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> EvmEnvProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> EvmEnvProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn fill_env_at<EvmConfig>(
|
||||
&self,
|
||||
@ -544,10 +539,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> PruneCheckpointReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> PruneCheckpointReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn get_prune_checkpoint(
|
||||
&self,
|
||||
@ -557,20 +551,18 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> ChainSpecProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> ChainSpecProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: Send + Sync,
|
||||
{
|
||||
fn chain_spec(&self) -> Arc<ChainSpec> {
|
||||
self.database.chain_spec()
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> StateProviderFactory for BlockchainProvider<DB, Tree>
|
||||
impl<DB> StateProviderFactory for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: BlockchainTreePendingStateProvider + BlockchainTreeViewer,
|
||||
{
|
||||
/// Storage provider for latest block
|
||||
fn latest(&self) -> ProviderResult<StateProviderBox> {
|
||||
@ -644,10 +636,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainTreeEngine for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockchainTreeEngine for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: BlockchainTreeEngine,
|
||||
{
|
||||
fn buffer_block(&self, block: SealedBlockWithSenders) -> Result<(), InsertBlockError> {
|
||||
self.tree.buffer_block(block)
|
||||
@ -681,10 +672,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainTreeViewer for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockchainTreeViewer for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: BlockchainTreeViewer,
|
||||
{
|
||||
fn blocks(&self) -> BTreeMap<BlockNumber, HashSet<BlockHash>> {
|
||||
self.tree.blocks()
|
||||
@ -743,10 +733,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> CanonChainTracker for BlockchainProvider<DB, Tree>
|
||||
impl<DB> CanonChainTracker for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: Send + Sync,
|
||||
Self: BlockReader,
|
||||
{
|
||||
fn on_forkchoice_update_received(&self, _update: &ForkchoiceState) {
|
||||
@ -779,10 +768,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockReaderIdExt for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockReaderIdExt for BlockchainProvider<DB>
|
||||
where
|
||||
Self: BlockReader + BlockIdReader + ReceiptProviderIdExt,
|
||||
Tree: BlockchainTreeEngine,
|
||||
{
|
||||
fn block_by_id(&self, id: BlockId) -> ProviderResult<Option<Block>> {
|
||||
match id {
|
||||
@ -859,10 +847,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> BlockchainTreePendingStateProvider for BlockchainProvider<DB, Tree>
|
||||
impl<DB> BlockchainTreePendingStateProvider for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: BlockchainTreePendingStateProvider,
|
||||
{
|
||||
fn find_pending_state_provider(
|
||||
&self,
|
||||
@ -872,20 +859,18 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> CanonStateSubscriptions for BlockchainProvider<DB, Tree>
|
||||
impl<DB> CanonStateSubscriptions for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Send + Sync,
|
||||
Tree: CanonStateSubscriptions,
|
||||
{
|
||||
fn subscribe_to_canonical_state(&self) -> CanonStateNotifications {
|
||||
self.tree.subscribe_to_canonical_state()
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> ChangeSetReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> ChangeSetReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database,
|
||||
Tree: Sync + Send,
|
||||
{
|
||||
fn account_block_changeset(
|
||||
&self,
|
||||
@ -895,10 +880,9 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
impl<DB, Tree> AccountReader for BlockchainProvider<DB, Tree>
|
||||
impl<DB> AccountReader for BlockchainProvider<DB>
|
||||
where
|
||||
DB: Database + Sync + Send,
|
||||
Tree: Sync + Send,
|
||||
{
|
||||
/// Get basic account information.
|
||||
fn basic_account(&self, address: Address) -> ProviderResult<Option<Account>> {
|
||||
|
||||
@ -80,3 +80,6 @@ pub use stats::StatsReader;
|
||||
|
||||
mod full;
|
||||
pub use full::FullProvider;
|
||||
|
||||
mod tree_viewer;
|
||||
pub use tree_viewer::TreeViewer;
|
||||
|
||||
22
crates/storage/provider/src/traits/tree_viewer.rs
Normal file
22
crates/storage/provider/src/traits/tree_viewer.rs
Normal file
@ -0,0 +1,22 @@
|
||||
use crate::{BlockchainTreePendingStateProvider, CanonStateSubscriptions};
|
||||
|
||||
use reth_interfaces::blockchain_tree::{BlockchainTreeEngine, BlockchainTreeViewer};
|
||||
|
||||
/// Helper trait to combine all the traits we need for the BlockchainProvider
|
||||
///
|
||||
/// This is a temporary solution
|
||||
pub trait TreeViewer:
|
||||
BlockchainTreeViewer
|
||||
+ BlockchainTreePendingStateProvider
|
||||
+ CanonStateSubscriptions
|
||||
+ BlockchainTreeEngine
|
||||
{
|
||||
}
|
||||
|
||||
impl<T> TreeViewer for T where
|
||||
T: BlockchainTreeViewer
|
||||
+ BlockchainTreePendingStateProvider
|
||||
+ CanonStateSubscriptions
|
||||
+ BlockchainTreeEngine
|
||||
{
|
||||
}
|
||||
@ -49,7 +49,7 @@ async fn main() -> eyre::Result<()> {
|
||||
// 2. Setup the blockchain provider using only the database provider and a noop for the tree to
|
||||
// satisfy trait bounds. Tree is not used in this example since we are only operating on the
|
||||
// disk and don't handle new blocks/live sync etc, which is done by the blockchain tree.
|
||||
let provider = BlockchainProvider::new(factory, NoopBlockchainTree::default())?;
|
||||
let provider = BlockchainProvider::new(factory, Arc::new(NoopBlockchainTree::default()))?;
|
||||
|
||||
let rpc_builder = RpcModuleBuilder::default()
|
||||
.with_provider(provider.clone())
|
||||
|
||||
Reference in New Issue
Block a user