diff --git a/crates/cli/commands/src/common.rs b/crates/cli/commands/src/common.rs index 174eeffa3..e206715fc 100644 --- a/crates/cli/commands/src/common.rs +++ b/crates/cli/commands/src/common.rs @@ -2,10 +2,10 @@ use alloy_primitives::B256; use clap::Parser; -use reth_beacon_consensus::EthBeaconConsensus; use reth_chainspec::EthChainSpec; use reth_cli::chainspec::ChainSpecParser; use reth_config::{config::EtlConfig, Config}; +use reth_consensus::noop::NoopConsensus; use reth_db::{init_db, open_db_read_only, DatabaseEnv}; use reth_db_common::init::init_genesis; use reth_downloaders::{bodies::noop::NoopBodiesDownloader, headers::noop::NoopHeaderDownloader}; @@ -151,10 +151,10 @@ impl EnvironmentArgs { .add_stages(DefaultStages::new( factory.clone(), tip_rx, - Arc::new(EthBeaconConsensus::new(self.chain.clone())), + Arc::new(NoopConsensus::default()), NoopHeaderDownloader::default(), NoopBodiesDownloader::default(), - NoopBlockExecutorProvider::default(), + NoopBlockExecutorProvider::::default(), config.stages.clone(), prune_modes.clone(), )) diff --git a/crates/cli/commands/src/stage/dump/execution.rs b/crates/cli/commands/src/stage/dump/execution.rs index 73d2e8a9f..1460c6bb6 100644 --- a/crates/cli/commands/src/stage/dump/execution.rs +++ b/crates/cli/commands/src/stage/dump/execution.rs @@ -140,13 +140,7 @@ fn import_tables_with_range( /// `PlainAccountState` safely. There might be some state dependency from an address /// which hasn't been changed in the given range. fn unwind_and_copy< - N: ProviderNodeTypes< - Primitives: NodePrimitives< - Block = reth_primitives::Block, - Receipt = reth_primitives::Receipt, - BlockHeader = reth_primitives::Header, - >, - >, + N: ProviderNodeTypes>, >( db_tool: &DbTool, from: u64, @@ -155,7 +149,8 @@ fn unwind_and_copy< ) -> eyre::Result<()> { let provider = db_tool.provider_factory.database_provider_rw()?; - let mut exec_stage = ExecutionStage::new_with_executor(NoopBlockExecutorProvider::default()); + let mut exec_stage = + ExecutionStage::new_with_executor(NoopBlockExecutorProvider::::default()); exec_stage.unwind( &provider, diff --git a/crates/cli/commands/src/stage/dump/merkle.rs b/crates/cli/commands/src/stage/dump/merkle.rs index 59a25c492..f0dbb1a1f 100644 --- a/crates/cli/commands/src/stage/dump/merkle.rs +++ b/crates/cli/commands/src/stage/dump/merkle.rs @@ -112,7 +112,7 @@ fn unwind_and_copy< // Bring Plainstate to TO (hashing stage execution requires it) let mut exec_stage = ExecutionStage::new( - NoopBlockExecutorProvider::default(), // Not necessary for unwinding. + NoopBlockExecutorProvider::::default(), // Not necessary for unwinding. ExecutionStageThresholds { max_blocks: Some(u64::MAX), max_changes: None, diff --git a/crates/cli/commands/src/stage/unwind.rs b/crates/cli/commands/src/stage/unwind.rs index de535d655..cc5d719d2 100644 --- a/crates/cli/commands/src/stage/unwind.rs +++ b/crates/cli/commands/src/stage/unwind.rs @@ -120,7 +120,7 @@ impl> Command let (tip_tx, tip_rx) = watch::channel(B256::ZERO); // Unwinding does not require a valid executor - let executor = NoopBlockExecutorProvider::default(); + let executor = NoopBlockExecutorProvider::::default(); let builder = if self.offline { Pipeline::::builder().add_stages( diff --git a/crates/engine/local/src/service.rs b/crates/engine/local/src/service.rs index 6ce588a82..0bdc77dbe 100644 --- a/crates/engine/local/src/service.rs +++ b/crates/engine/local/src/service.rs @@ -27,7 +27,7 @@ use reth_engine_tree::{ EngineApiKind, EngineApiRequest, EngineApiRequestHandler, EngineRequestHandler, FromEngine, RequestHandlerEvent, }, - persistence::{PersistenceHandle, PersistenceNodeTypes}, + persistence::PersistenceHandle, tree::{EngineApiTreeHandler, InvalidBlockHook, TreeConfig}, }; use reth_evm::execute::BlockExecutorProvider; @@ -59,7 +59,7 @@ where impl LocalEngineService where - N: EngineNodeTypes + PersistenceNodeTypes, + N: EngineNodeTypes, { /// Constructor for [`LocalEngineService`]. #[allow(clippy::too_many_arguments)] diff --git a/crates/engine/service/src/service.rs b/crates/engine/service/src/service.rs index d839fab2c..27de4a636 100644 --- a/crates/engine/service/src/service.rs +++ b/crates/engine/service/src/service.rs @@ -8,7 +8,7 @@ use reth_engine_tree::{ backfill::PipelineSync, download::BasicBlockDownloader, engine::{EngineApiKind, EngineApiRequest, EngineApiRequestHandler, EngineHandler}, - persistence::{PersistenceHandle, PersistenceNodeTypes}, + persistence::PersistenceHandle, tree::{EngineApiTreeHandler, InvalidBlockHook, TreeConfig}, }; pub use reth_engine_tree::{ @@ -59,7 +59,7 @@ where impl EngineService where - N: EngineNodeTypes + PersistenceNodeTypes, + N: EngineNodeTypes, Client: EthBlockClient + 'static, E: BlockExecutorProvider + 'static, { diff --git a/crates/engine/tree/src/persistence.rs b/crates/engine/tree/src/persistence.rs index 2f0b20f02..c7ad41100 100644 --- a/crates/engine/tree/src/persistence.rs +++ b/crates/engine/tree/src/persistence.rs @@ -1,4 +1,5 @@ use crate::metrics::PersistenceMetrics; +use alloy_consensus::BlockHeader; use alloy_eips::BlockNumHash; use reth_chain_state::ExecutedBlock; use reth_errors::ProviderError; @@ -17,11 +18,6 @@ use thiserror::Error; use tokio::sync::oneshot; use tracing::{debug, error}; -/// A helper trait with requirements for [`ProviderNodeTypes`] to be used within -/// [`PersistenceService`]. -pub trait PersistenceNodeTypes: ProviderNodeTypes {} -impl PersistenceNodeTypes for T where T: ProviderNodeTypes {} - /// Writes parts of reth's in memory tree state to the database and static files. /// /// This is meant to be a spawned service that listens for various incoming persistence operations, @@ -32,7 +28,7 @@ impl PersistenceNodeTypes for T where T: ProviderNodeTypes where - N: PersistenceNodeTypes, + N: ProviderNodeTypes, { /// The provider factory to use provider: ProviderFactory, @@ -48,7 +44,7 @@ where impl PersistenceService where - N: PersistenceNodeTypes, + N: ProviderNodeTypes, { /// Create a new persistence service pub fn new( @@ -74,7 +70,7 @@ where impl PersistenceService where - N: PersistenceNodeTypes, + N: ProviderNodeTypes, { /// This is the main loop, that will listen to database events and perform the requested /// database actions @@ -148,9 +144,10 @@ where ) -> Result, PersistenceError> { debug!(target: "engine::persistence", first=?blocks.first().map(|b| b.block.num_hash()), last=?blocks.last().map(|b| b.block.num_hash()), "Saving range of blocks"); let start_time = Instant::now(); - let last_block_hash_num = blocks - .last() - .map(|block| BlockNumHash { hash: block.block().hash(), number: block.block().number }); + let last_block_hash_num = blocks.last().map(|block| BlockNumHash { + hash: block.block().hash(), + number: block.block().header().number(), + }); if last_block_hash_num.is_some() { let provider_rw = self.provider.database_provider_rw()?; @@ -219,7 +216,7 @@ impl PersistenceHandle { sync_metrics_tx: MetricEventsSender, ) -> PersistenceHandle where - N: PersistenceNodeTypes, + N: ProviderNodeTypes, { // create the initial channels let (db_service_tx, db_service_rx) = std::sync::mpsc::channel(); diff --git a/crates/evm/src/noop.rs b/crates/evm/src/noop.rs index 7b1063533..816a4c835 100644 --- a/crates/evm/src/noop.rs +++ b/crates/evm/src/noop.rs @@ -4,7 +4,7 @@ use alloy_primitives::BlockNumber; use core::fmt::Display; use reth_execution_errors::BlockExecutionError; use reth_execution_types::{BlockExecutionInput, BlockExecutionOutput, ExecutionOutcome}; -use reth_primitives::{BlockWithSenders, EthPrimitives, Receipt}; +use reth_primitives::{BlockWithSenders, NodePrimitives}; use reth_prune_types::PruneModes; use reth_storage_errors::provider::ProviderError; use revm::State; @@ -20,10 +20,10 @@ const UNAVAILABLE_FOR_NOOP: &str = "execution unavailable for noop"; /// A [`BlockExecutorProvider`] implementation that does nothing. #[derive(Debug, Default, Clone)] #[non_exhaustive] -pub struct NoopBlockExecutorProvider; +pub struct NoopBlockExecutorProvider

(core::marker::PhantomData

); -impl BlockExecutorProvider for NoopBlockExecutorProvider { - type Primitives = EthPrimitives; +impl BlockExecutorProvider for NoopBlockExecutorProvider

{ + type Primitives = P; type Executor + Display>> = Self; @@ -33,20 +33,20 @@ impl BlockExecutorProvider for NoopBlockExecutorProvider { where DB: Database + Display>, { - Self + Self::default() } fn batch_executor(&self, _: DB) -> Self::BatchExecutor where DB: Database + Display>, { - Self + Self::default() } } -impl Executor for NoopBlockExecutorProvider { - type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; - type Output = BlockExecutionOutput; +impl Executor for NoopBlockExecutorProvider

{ + type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; + type Output = BlockExecutionOutput; type Error = BlockExecutionError; fn execute(self, _: Self::Input<'_>) -> Result { @@ -76,9 +76,9 @@ impl Executor for NoopBlockExecutorProvider { } } -impl BatchExecutor for NoopBlockExecutorProvider { - type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; - type Output = ExecutionOutcome; +impl BatchExecutor for NoopBlockExecutorProvider

{ + type Input<'a> = BlockExecutionInput<'a, BlockWithSenders>; + type Output = ExecutionOutcome; type Error = BlockExecutionError; fn execute_and_verify_one(&mut self, _: Self::Input<'_>) -> Result<(), Self::Error> { diff --git a/crates/net/downloaders/src/bodies/noop.rs b/crates/net/downloaders/src/bodies/noop.rs index f311a242c..dd3e6e969 100644 --- a/crates/net/downloaders/src/bodies/noop.rs +++ b/crates/net/downloaders/src/bodies/noop.rs @@ -4,24 +4,23 @@ use reth_network_p2p::{ bodies::{downloader::BodyDownloader, response::BlockResponse}, error::{DownloadError, DownloadResult}, }; -use reth_primitives::BlockBody; -use std::ops::RangeInclusive; +use std::{fmt::Debug, ops::RangeInclusive}; /// A [`BodyDownloader`] implementation that does nothing. #[derive(Debug, Default)] #[non_exhaustive] -pub struct NoopBodiesDownloader; +pub struct NoopBodiesDownloader(std::marker::PhantomData); -impl BodyDownloader for NoopBodiesDownloader { - type Body = BlockBody; +impl BodyDownloader for NoopBodiesDownloader { + type Body = B; fn set_download_range(&mut self, _: RangeInclusive) -> DownloadResult<()> { Ok(()) } } -impl Stream for NoopBodiesDownloader { - type Item = Result>, DownloadError>; +impl Stream for NoopBodiesDownloader { + type Item = Result>, DownloadError>; fn poll_next( self: std::pin::Pin<&mut Self>, diff --git a/crates/net/downloaders/src/headers/noop.rs b/crates/net/downloaders/src/headers/noop.rs index 58da73123..e9dee56dd 100644 --- a/crates/net/downloaders/src/headers/noop.rs +++ b/crates/net/downloaders/src/headers/noop.rs @@ -1,28 +1,28 @@ -use alloy_consensus::Header; use futures::Stream; use reth_network_p2p::headers::{ downloader::{HeaderDownloader, SyncTarget}, error::HeadersDownloaderError, }; use reth_primitives::SealedHeader; +use std::fmt::Debug; /// A [`HeaderDownloader`] implementation that does nothing. #[derive(Debug, Default)] #[non_exhaustive] -pub struct NoopHeaderDownloader; +pub struct NoopHeaderDownloader(std::marker::PhantomData); -impl HeaderDownloader for NoopHeaderDownloader { - type Header = Header; +impl HeaderDownloader for NoopHeaderDownloader { + type Header = H; - fn update_local_head(&mut self, _: SealedHeader) {} + fn update_local_head(&mut self, _: SealedHeader) {} fn update_sync_target(&mut self, _: SyncTarget) {} fn set_batch_size(&mut self, _: usize) {} } -impl Stream for NoopHeaderDownloader { - type Item = Result, HeadersDownloaderError

>; +impl Stream for NoopHeaderDownloader { + type Item = Result>, HeadersDownloaderError>; fn poll_next( self: std::pin::Pin<&mut Self>, diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index 104ecef9e..62226cb0b 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -10,9 +10,9 @@ use crate::{ use alloy_primitives::{BlockNumber, B256}; use eyre::{Context, OptionExt}; use rayon::ThreadPoolBuilder; -use reth_beacon_consensus::EthBeaconConsensus; use reth_chainspec::{Chain, EthChainSpec, EthereumHardforks}; use reth_config::{config::EtlConfig, PruneConfig}; +use reth_consensus::noop::NoopConsensus; use reth_db_api::{database::Database, database_metrics::DatabaseMetrics}; use reth_db_common::init::{init_genesis, InitStorageError}; use reth_downloaders::{bodies::noop::NoopBodiesDownloader, headers::noop::NoopHeaderDownloader}; @@ -383,12 +383,7 @@ where pub async fn create_provider_factory(&self) -> eyre::Result> where N: ProviderNodeTypes, - N::Primitives: FullNodePrimitives< - Block = reth_primitives::Block, - BlockBody = reth_primitives::BlockBody, - Receipt = reth_primitives::Receipt, - BlockHeader = reth_primitives::Header, - >, + N::Primitives: FullNodePrimitives, { let factory = ProviderFactory::new( self.right().clone(), @@ -420,10 +415,10 @@ where .add_stages(DefaultStages::new( factory.clone(), tip_rx, - Arc::new(EthBeaconConsensus::new(self.chain_spec())), + Arc::new(NoopConsensus::default()), NoopHeaderDownloader::default(), NoopBodiesDownloader::default(), - NoopBlockExecutorProvider::default(), + NoopBlockExecutorProvider::::default(), self.toml_config().stages.clone(), self.prune_modes(), )) @@ -455,12 +450,7 @@ where ) -> eyre::Result, ProviderFactory>>> where N: ProviderNodeTypes, - N::Primitives: FullNodePrimitives< - Block = reth_primitives::Block, - BlockBody = reth_primitives::BlockBody, - Receipt = reth_primitives::Receipt, - BlockHeader = reth_primitives::Header, - >, + N::Primitives: FullNodePrimitives, { let factory = self.create_provider_factory().await?; let ctx = LaunchContextWith { diff --git a/crates/node/builder/src/launch/engine.rs b/crates/node/builder/src/launch/engine.rs index 264de0704..054def94e 100644 --- a/crates/node/builder/src/launch/engine.rs +++ b/crates/node/builder/src/launch/engine.rs @@ -3,7 +3,7 @@ use futures::{future::Either, stream, stream_select, StreamExt}; use reth_beacon_consensus::{ hooks::{EngineHooks, StaticFileHook}, - BeaconConsensusEngineHandle, + BeaconConsensusEngineHandle, EngineNodeTypes, }; use reth_chainspec::EthChainSpec; use reth_consensus_debug_client::{DebugConsensusClient, EtherscanBlockProvider}; @@ -11,7 +11,6 @@ use reth_engine_local::{LocalEngineService, LocalPayloadAttributesBuilder}; use reth_engine_service::service::{ChainEvent, EngineService}; use reth_engine_tree::{ engine::{EngineApiRequest, EngineRequestHandler}, - persistence::PersistenceNodeTypes, tree::TreeConfig, }; use reth_engine_util::EngineMessageStreamExt; @@ -28,8 +27,8 @@ use reth_node_core::{ primitives::Head, }; use reth_node_events::{cl::ConsensusLayerHealthEvents, node}; -use reth_primitives::{EthPrimitives, EthereumHardforks}; -use reth_provider::providers::{BlockchainProvider2, ProviderNodeTypes}; +use reth_primitives::EthereumHardforks; +use reth_provider::providers::BlockchainProvider2; use reth_tasks::TaskExecutor; use reth_tokio_util::EventSender; use reth_tracing::tracing::{debug, error, info}; @@ -70,17 +69,13 @@ impl EngineNodeLauncher { impl LaunchNode> for EngineNodeLauncher where - Types: - ProviderNodeTypes + NodeTypesWithEngine + PersistenceNodeTypes, + Types: EngineNodeTypes, T: FullNodeTypes>, CB: NodeComponentsBuilder, AO: RethRpcAddOns> + EngineValidatorAddOn< NodeAdapter, - Validator: EngineValidator< - ::Engine, - Block = BlockTy, - >, + Validator: EngineValidator>, >, LocalPayloadAttributesBuilder: PayloadAttributesBuilder< diff --git a/crates/node/builder/src/launch/exex.rs b/crates/node/builder/src/launch/exex.rs index 0eef0d005..0235dd929 100644 --- a/crates/node/builder/src/launch/exex.rs +++ b/crates/node/builder/src/launch/exex.rs @@ -10,7 +10,7 @@ use reth_exex::{ DEFAULT_EXEX_MANAGER_CAPACITY, }; use reth_node_api::{FullNodeComponents, NodeTypes}; -use reth_primitives::{EthPrimitives, Head}; +use reth_primitives::Head; use reth_provider::CanonStateSubscriptions; use reth_tracing::tracing::{debug, info}; use tracing::Instrument; @@ -25,9 +25,7 @@ pub struct ExExLauncher { config_container: WithConfigs<::ChainSpec>, } -impl> + Clone> - ExExLauncher -{ +impl ExExLauncher { /// Create a new `ExExLauncher` with the given extensions. pub const fn new( head: Head, @@ -42,7 +40,9 @@ impl> + Cl /// /// Spawns all extensions and returns the handle to the exex manager if any extensions are /// installed. - pub async fn launch(self) -> eyre::Result> { + pub async fn launch( + self, + ) -> eyre::Result::Primitives>>> { let Self { head, extensions, components, config_container } = self; if extensions.is_empty() {