diff --git a/Cargo.lock b/Cargo.lock index 408972b00..f390b7eec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2862,6 +2862,7 @@ version = "0.0.0" dependencies = [ "eyre", "reth", + "reth-chainspec", "reth-node-ethereum", "reth-tracing", "reth-transaction-pool", @@ -7690,6 +7691,7 @@ dependencies = [ name = "reth-node-api" version = "1.0.5" dependencies = [ + "reth-chainspec", "reth-db-api", "reth-engine-primitives", "reth-evm", @@ -8031,6 +8033,7 @@ dependencies = [ "jsonrpsee", "jsonrpsee-types", "parking_lot 0.12.3", + "reth-chainspec", "reth-evm", "reth-evm-optimism", "reth-network-api", diff --git a/crates/chainspec/src/api.rs b/crates/chainspec/src/api.rs new file mode 100644 index 000000000..f31b0918e --- /dev/null +++ b/crates/chainspec/src/api.rs @@ -0,0 +1,27 @@ +use crate::ChainSpec; +use alloy_chains::Chain; +use reth_ethereum_forks::{EthereumHardfork, ForkCondition}; + +/// Trait representing type configuring a chain spec. +pub trait EthChainSpec: Send + Sync + Unpin + 'static { + /// Enumw with chain hardforks. + type Hardfork: Clone + Copy + 'static; + + /// Chain id. + fn chain(&self) -> Chain; + + /// Activation condition for a given hardfork. + fn activation_condition(&self, hardfork: Self::Hardfork) -> ForkCondition; +} + +impl EthChainSpec for ChainSpec { + type Hardfork = EthereumHardfork; + + fn chain(&self) -> Chain { + self.chain + } + + fn activation_condition(&self, hardfork: Self::Hardfork) -> ForkCondition { + self.hardforks.fork(hardfork) + } +} diff --git a/crates/chainspec/src/lib.rs b/crates/chainspec/src/lib.rs index 24f050d6f..26e15edc8 100644 --- a/crates/chainspec/src/lib.rs +++ b/crates/chainspec/src/lib.rs @@ -29,6 +29,9 @@ mod info; /// The chain spec module. mod spec; +mod api; +pub use api::EthChainSpec; + /// Chain specific constants pub(crate) mod constants; diff --git a/crates/chainspec/src/spec.rs b/crates/chainspec/src/spec.rs index 8ce82b057..28659b823 100644 --- a/crates/chainspec/src/spec.rs +++ b/crates/chainspec/src/spec.rs @@ -1,4 +1,4 @@ -use crate::constants::MAINNET_DEPOSIT_CONTRACT; +use crate::{constants::MAINNET_DEPOSIT_CONTRACT, EthChainSpec}; #[cfg(not(feature = "std"))] use alloc::{boxed::Box, sync::Arc, vec::Vec}; use alloy_chains::{Chain, ChainKind, NamedChain}; @@ -813,8 +813,11 @@ impl From for ChainSpec { /// A trait for reading the current [`ChainSpec`]. #[auto_impl::auto_impl(&, Arc)] pub trait ChainSpecProvider: Send + Sync { + /// The chain spec type. + type ChainSpec: EthChainSpec; + /// Get an [`Arc`] to the [`ChainSpec`]. - fn chain_spec(&self) -> Arc; + fn chain_spec(&self) -> Arc; } /// A helper to build custom chain specs diff --git a/crates/consensus/beacon/src/engine/mod.rs b/crates/consensus/beacon/src/engine/mod.rs index f82577761..21605b042 100644 --- a/crates/consensus/beacon/src/engine/mod.rs +++ b/crates/consensus/beacon/src/engine/mod.rs @@ -4,6 +4,7 @@ use reth_blockchain_tree_api::{ error::{BlockchainTreeError, CanonicalError, InsertBlockError, InsertBlockErrorKind}, BlockStatus, BlockValidationKind, BlockchainTreeEngine, CanonicalOutcome, InsertPayloadOk, }; +use reth_chainspec::ChainSpec; use reth_db_api::database::Database; use reth_engine_primitives::EngineTypes; use reth_errors::{BlockValidationError, ProviderResult, RethError, RethResult}; @@ -231,7 +232,7 @@ where + BlockIdReader + CanonChainTracker + StageCheckpointReader - + ChainSpecProvider + + ChainSpecProvider + 'static, Client: BlockClient + 'static, EngineT: EngineTypes + Unpin, @@ -1797,7 +1798,7 @@ where + BlockIdReader + CanonChainTracker + StageCheckpointReader - + ChainSpecProvider + + ChainSpecProvider + Unpin + 'static, EngineT: EngineTypes + Unpin, diff --git a/crates/e2e-test-utils/src/lib.rs b/crates/e2e-test-utils/src/lib.rs index 132bc36c1..c7f464fa7 100644 --- a/crates/e2e-test-utils/src/lib.rs +++ b/crates/e2e-test-utils/src/lib.rs @@ -14,7 +14,7 @@ use reth_chainspec::ChainSpec; use reth_db::{test_utils::TempDatabase, DatabaseEnv}; use reth_node_builder::{ components::NodeComponentsBuilder, rpc::EthApiBuilderProvider, FullNodeTypesAdapter, Node, - NodeAdapter, NodeAddOns, NodeComponents, RethFullAdapter, + NodeAdapter, NodeAddOns, NodeComponents, NodeTypes, RethFullAdapter, }; use reth_provider::providers::BlockchainProvider; use tracing::{span, Level}; @@ -50,7 +50,7 @@ pub async fn setup( is_dev: bool, ) -> eyre::Result<(Vec>, TaskManager, Wallet)> where - N: Default + Node>, + N: Default + Node> + NodeTypes, <>>::Components as NodeComponents>>::Network: PeersHandleProvider, >>::EthApi: FullEthApiServer + AddDevSigners + EthApiBuilderProvider>, diff --git a/crates/e2e-test-utils/src/node.rs b/crates/e2e-test-utils/src/node.rs index 19f387c7b..350eb6ca0 100644 --- a/crates/e2e-test-utils/src/node.rs +++ b/crates/e2e-test-utils/src/node.rs @@ -14,6 +14,7 @@ use reth::{ types::engine::PayloadStatusEnum, }, }; +use reth_chainspec::ChainSpec; use reth_node_builder::{NodeAddOns, NodeTypes}; use reth_primitives::{BlockHash, BlockNumber, Bytes, B256}; use reth_stages_types::StageId; @@ -45,7 +46,7 @@ where impl NodeTestContext where - Node: FullNodeComponents, + Node: FullNodeComponents, Node::Network: PeersHandleProvider, AddOns: NodeAddOns, { diff --git a/crates/e2e-test-utils/src/rpc.rs b/crates/e2e-test-utils/src/rpc.rs index b30188950..1714ffb7a 100644 --- a/crates/e2e-test-utils/src/rpc.rs +++ b/crates/e2e-test-utils/src/rpc.rs @@ -7,6 +7,7 @@ use reth::{ DebugApiServer, }, }; +use reth_chainspec::ChainSpec; use reth_primitives::{Bytes, B256}; #[allow(missing_debug_implementations)] @@ -14,7 +15,7 @@ pub struct RpcTestContext { pub inner: RpcRegistry, } -impl RpcTestContext +impl, EthApi> RpcTestContext where EthApi: EthApiSpec + EthTransactions + TraceExt, { diff --git a/crates/ethereum/node/Cargo.toml b/crates/ethereum/node/Cargo.toml index fba683a2a..e7a5e7029 100644 --- a/crates/ethereum/node/Cargo.toml +++ b/crates/ethereum/node/Cargo.toml @@ -27,6 +27,7 @@ reth-auto-seal-consensus.workspace = true reth-beacon-consensus.workspace = true reth-rpc.workspace = true reth-node-api.workspace = true +reth-chainspec.workspace = true # misc eyre.workspace = true diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 63fbe0688..c6142d88a 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -5,6 +5,7 @@ use std::sync::Arc; use reth_auto_seal_consensus::AutoSealConsensus; use reth_basic_payload_builder::{BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig}; use reth_beacon_consensus::EthBeaconConsensus; +use reth_chainspec::ChainSpec; use reth_ethereum_engine_primitives::{ EthBuiltPayload, EthPayloadAttributes, EthPayloadBuilderAttributes, }; @@ -46,7 +47,7 @@ impl EthereumNode { EthereumConsensusBuilder, > where - Node: FullNodeTypes, + Node: FullNodeTypes, ::Engine: PayloadTypes< BuiltPayload = EthBuiltPayload, PayloadAttributes = EthPayloadAttributes, @@ -66,6 +67,7 @@ impl EthereumNode { impl NodeTypes for EthereumNode { type Primitives = (); type Engine = EthEngineTypes; + type ChainSpec = ChainSpec; } /// Add-ons w.r.t. l1 ethereum. @@ -78,7 +80,7 @@ impl NodeAddOns for EthereumAddOns { impl Node for EthereumNode where - N: FullNodeTypes, + N: FullNodeTypes, { type ComponentsBuilder = ComponentsBuilder< N, @@ -103,7 +105,7 @@ pub struct EthereumExecutorBuilder; impl ExecutorBuilder for EthereumExecutorBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type EVM = EthEvmConfig; type Executor = EthExecutorProvider; @@ -132,7 +134,7 @@ pub struct EthereumPoolBuilder { impl PoolBuilder for EthereumPoolBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type Pool = EthTransactionPool; @@ -210,7 +212,7 @@ impl EthereumPayloadBuilder { impl PayloadServiceBuilder for EthereumPayloadBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, Evm: ConfigureEvm, Pool: TransactionPool + Unpin + 'static, ::Engine: PayloadTypes< @@ -282,7 +284,7 @@ pub struct EthereumConsensusBuilder { impl ConsensusBuilder for EthereumConsensusBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type Consensus = Arc; diff --git a/crates/exex/test-utils/src/lib.rs b/crates/exex/test-utils/src/lib.rs index 5791f61cd..b363823ea 100644 --- a/crates/exex/test-utils/src/lib.rs +++ b/crates/exex/test-utils/src/lib.rs @@ -111,11 +111,12 @@ pub struct TestNode; impl NodeTypes for TestNode { type Primitives = (); type Engine = EthEngineTypes; + type ChainSpec = ChainSpec; } impl Node for TestNode where - N: FullNodeTypes, + N: FullNodeTypes, { type ComponentsBuilder = ComponentsBuilder< N, diff --git a/crates/node/api/Cargo.toml b/crates/node/api/Cargo.toml index 46ff61396..db5eb6b2d 100644 --- a/crates/node/api/Cargo.toml +++ b/crates/node/api/Cargo.toml @@ -14,6 +14,7 @@ workspace = true # reth reth-evm.workspace = true reth-provider.workspace = true +reth-chainspec.workspace = true reth-db-api.workspace = true reth-engine-primitives.workspace = true reth-transaction-pool.workspace = true diff --git a/crates/node/api/src/node.rs b/crates/node/api/src/node.rs index 8cd72e91e..b7bfdd804 100644 --- a/crates/node/api/src/node.rs +++ b/crates/node/api/src/node.rs @@ -2,6 +2,7 @@ use std::marker::PhantomData; +use reth_chainspec::EthChainSpec; use reth_db_api::{ database::Database, database_metrics::{DatabaseMetadata, DatabaseMetrics}, @@ -26,32 +27,37 @@ pub trait NodeTypes: Send + Sync + Unpin + 'static { type Primitives: NodePrimitives; /// The node's engine types, defining the interaction with the consensus engine. type Engine: EngineTypes; + /// The type used for configuration of the EVM. + type ChainSpec: EthChainSpec; } /// A [`NodeTypes`] type builder #[derive(Default, Debug)] -pub struct AnyNodeTypes

(PhantomData

, PhantomData); +pub struct AnyNodeTypes

(PhantomData

, PhantomData, PhantomData); -impl AnyNodeTypes { +impl AnyNodeTypes { /// Sets the `Primitives` associated type. - pub const fn primitives(self) -> AnyNodeTypes { - AnyNodeTypes::(PhantomData::, PhantomData::) + pub const fn primitives(self) -> AnyNodeTypes { + AnyNodeTypes::(PhantomData::, PhantomData::, PhantomData::) } /// Sets the `Engine` associated type. - pub const fn engine(self) -> AnyNodeTypes { - AnyNodeTypes::(PhantomData::

, PhantomData::) + pub const fn engine(self) -> AnyNodeTypes { + AnyNodeTypes::(PhantomData::

, PhantomData::, PhantomData::) } } -impl NodeTypes for AnyNodeTypes +impl NodeTypes for AnyNodeTypes where P: NodePrimitives + Send + Sync + Unpin + 'static, E: EngineTypes + Send + Sync + Unpin, + C: EthChainSpec, { type Primitives = P; type Engine = E; + + type ChainSpec = C; } /// A helper trait that is downstream of the [`NodeTypes`] trait and adds stateful components to the @@ -62,7 +68,7 @@ pub trait FullNodeTypes: NodeTypes + 'static { /// Underlying database type used by the node to store and retrieve data. type DB: Database + DatabaseMetrics + DatabaseMetadata + Clone + Unpin + 'static; /// The provider type used to interact with the node. - type Provider: FullProvider; + type Provider: FullProvider; } /// An adapter type that adds the builtin provider type to the user configured node types. @@ -103,12 +109,13 @@ where { type Primitives = Types::Primitives; type Engine = Types::Engine; + type ChainSpec = Types::ChainSpec; } impl FullNodeTypes for FullNodeTypesAdapter where Types: NodeTypes, - Provider: FullProvider, + Provider: FullProvider, DB: Database + DatabaseMetrics + DatabaseMetadata + Clone + Unpin + 'static, { type DB = DB; diff --git a/crates/node/builder/src/builder/mod.rs b/crates/node/builder/src/builder/mod.rs index f63f0c3a6..c40c24900 100644 --- a/crates/node/builder/src/builder/mod.rs +++ b/crates/node/builder/src/builder/mod.rs @@ -206,7 +206,7 @@ where /// Configures the types of the node. pub fn with_types(self) -> NodeBuilderWithTypes> where - T: NodeTypes, + T: NodeTypes, { self.with_types_and_provider() } @@ -216,8 +216,8 @@ where self, ) -> NodeBuilderWithTypes> where - T: NodeTypes, - P: FullProvider, + T: NodeTypes, + P: FullProvider, { NodeBuilderWithTypes::new(self.config, self.database) } @@ -230,7 +230,7 @@ where node: N, ) -> NodeBuilderWithComponents, N::ComponentsBuilder, N::AddOns> where - N: Node>, + N: Node, ChainSpec = ChainSpec>, { self.with_types().with_components(node.components_builder()).with_add_ons::() } @@ -264,7 +264,7 @@ where /// Configures the types of the node. pub fn with_types(self) -> WithLaunchContext>> where - T: NodeTypes, + T: NodeTypes, { WithLaunchContext { builder: self.builder.with_types(), task_executor: self.task_executor } } @@ -274,8 +274,8 @@ where self, ) -> WithLaunchContext>> where - T: NodeTypes, - P: FullProvider, + T: NodeTypes, + P: FullProvider, { WithLaunchContext { builder: self.builder.with_types_and_provider(), @@ -293,7 +293,7 @@ where NodeBuilderWithComponents, N::ComponentsBuilder, N::AddOns>, > where - N: Node>, + N: Node, ChainSpec = ChainSpec>, { self.with_types().with_components(node.components_builder()).with_add_ons::() } @@ -316,7 +316,7 @@ where >, > where - N: Node>, + N: Node, ChainSpec = ChainSpec>, N::AddOns: NodeAddOns< NodeAdapter< RethFullAdapter, @@ -469,7 +469,7 @@ where impl WithLaunchContext, CB, AO>> where DB: Database + DatabaseMetrics + DatabaseMetadata + Clone + Unpin + 'static, - T: NodeTypes, + T: NodeTypes, CB: NodeComponentsBuilder>, AO: NodeAddOns< NodeAdapter, CB::Components>, @@ -540,7 +540,7 @@ impl BuilderContext { } /// Returns the chain spec of the node. - pub fn chain_spec(&self) -> Arc { + pub fn chain_spec(&self) -> Arc { self.provider().chain_spec() } diff --git a/crates/node/builder/src/builder/states.rs b/crates/node/builder/src/builder/states.rs index f42bee7d9..f6915a3db 100644 --- a/crates/node/builder/src/builder/states.rs +++ b/crates/node/builder/src/builder/states.rs @@ -91,6 +91,7 @@ pub struct NodeAdapter> { impl> NodeTypes for NodeAdapter { type Primitives = T::Primitives; type Engine = T::Engine; + type ChainSpec = T::ChainSpec; } impl> FullNodeTypes for NodeAdapter { diff --git a/crates/node/builder/src/launch/common.rs b/crates/node/builder/src/launch/common.rs index 1b2cfee81..51423f10f 100644 --- a/crates/node/builder/src/launch/common.rs +++ b/crates/node/builder/src/launch/common.rs @@ -569,7 +569,7 @@ where ) -> eyre::Result>>> where T: FullNodeTypes, - T::Provider: FullProvider, + T::Provider: FullProvider, F: FnOnce(ProviderFactory) -> eyre::Result, { let blockchain_db = create_blockchain_provider(self.provider_factory().clone())?; @@ -598,7 +598,7 @@ where impl LaunchContextWith>> where DB: Database + DatabaseMetrics + Send + Sync + Clone + 'static, - T: FullNodeTypes + WithTree>, + T: FullNodeTypes + WithTree>, { /// Returns access to the underlying database. pub fn database(&self) -> &DB { @@ -717,7 +717,7 @@ where impl LaunchContextWith>> where DB: Database + DatabaseMetrics + Send + Sync + Clone + 'static, - T: FullNodeTypes + WithTree>, + T: FullNodeTypes + WithTree>, CB: NodeComponentsBuilder, { /// Returns the configured `ProviderFactory`. @@ -915,7 +915,7 @@ pub struct WithMeteredProvider { pub struct WithMeteredProviders where DB: Database, - T: FullNodeTypes>, + T: FullNodeTypes>, { db_provider_container: WithMeteredProvider, blockchain_db: T::Provider, @@ -931,7 +931,7 @@ where pub struct WithComponents where DB: Database, - T: FullNodeTypes>, + T: FullNodeTypes>, CB: NodeComponentsBuilder, { db_provider_container: WithMeteredProvider, diff --git a/crates/node/builder/src/launch/engine.rs b/crates/node/builder/src/launch/engine.rs index 4d2ed714c..362938c73 100644 --- a/crates/node/builder/src/launch/engine.rs +++ b/crates/node/builder/src/launch/engine.rs @@ -6,6 +6,7 @@ use reth_beacon_consensus::{ BeaconConsensusEngineHandle, }; use reth_blockchain_tree::BlockchainTreeConfig; +use reth_chainspec::ChainSpec; use reth_engine_service::service::{ChainEvent, EngineService}; use reth_engine_tree::{ engine::{EngineApiRequest, EngineRequestHandler}, @@ -59,7 +60,10 @@ impl EngineNodeLauncher { impl LaunchNode> for EngineNodeLauncher where - T: FullNodeTypes::DB>>, + T: FullNodeTypes< + Provider = BlockchainProvider2<::DB>, + ChainSpec = ChainSpec, + >, CB: NodeComponentsBuilder, AO: NodeAddOns< NodeAdapter, diff --git a/crates/node/builder/src/launch/mod.rs b/crates/node/builder/src/launch/mod.rs index 60b7dc6d7..bb7715c89 100644 --- a/crates/node/builder/src/launch/mod.rs +++ b/crates/node/builder/src/launch/mod.rs @@ -16,6 +16,7 @@ use reth_beacon_consensus::{ BeaconConsensusEngine, }; use reth_blockchain_tree::{noop::NoopBlockchainTree, BlockchainTreeConfig}; +use reth_chainspec::ChainSpec; use reth_consensus_debug_client::{DebugConsensusClient, EtherscanBlockProvider, RpcBlockProvider}; use reth_engine_util::EngineMessageStreamExt; use reth_exex::ExExManagerHandle; @@ -101,7 +102,10 @@ impl DefaultNodeLauncher { impl LaunchNode> for DefaultNodeLauncher where - T: FullNodeTypes::DB>>, + T: FullNodeTypes< + Provider = BlockchainProvider<::DB>, + ChainSpec = ChainSpec, + >, CB: NodeComponentsBuilder, AO: NodeAddOns< NodeAdapter, diff --git a/crates/node/builder/src/node.rs b/crates/node/builder/src/node.rs index 8f5c641a0..4b54b09cd 100644 --- a/crates/node/builder/src/node.rs +++ b/crates/node/builder/src/node.rs @@ -3,7 +3,6 @@ pub use reth_node_api::{FullNodeTypes, NodeTypes}; use std::{marker::PhantomData, sync::Arc}; -use reth_chainspec::ChainSpec; use reth_node_api::FullNodeComponents; use reth_node_core::{ dirs::{ChainPath, DataDirPath}, @@ -62,6 +61,8 @@ where type Primitives = N::Primitives; type Engine = N::Engine; + + type ChainSpec = N::ChainSpec; } impl Node for AnyNode @@ -112,8 +113,8 @@ where Node: FullNodeComponents, AddOns: NodeAddOns, { - /// Returns the [`ChainSpec`] of the node. - pub fn chain_spec(&self) -> Arc { + /// Returns the chain spec of the node. + pub fn chain_spec(&self) -> Arc { self.provider.chain_spec() } diff --git a/crates/node/builder/src/rpc.rs b/crates/node/builder/src/rpc.rs index 920882703..cb229f860 100644 --- a/crates/node/builder/src/rpc.rs +++ b/crates/node/builder/src/rpc.rs @@ -6,6 +6,7 @@ use std::{ }; use futures::TryFutureExt; +use reth_chainspec::ChainSpec; use reth_node_api::{BuilderProvider, FullNodeComponents}; use reth_node_core::{ node_config::NodeConfig, @@ -260,7 +261,7 @@ pub async fn launch_rpc_servers( ) -> eyre::Result<(RethRpcServerHandles, RpcRegistry)> where EthApi: EthApiBuilderProvider + FullEthApiServer, - Node: FullNodeComponents + Clone, + Node: FullNodeComponents + Clone, Engine: EngineApiServer, { let auth_config = config.rpc.auth_server_config(jwt_secret)?; diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index e276ccdd5..1dca4b7da 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -3,6 +3,7 @@ use std::sync::Arc; use reth_basic_payload_builder::{BasicPayloadJobGenerator, BasicPayloadJobGeneratorConfig}; +use reth_chainspec::ChainSpec; use reth_evm::ConfigureEvm; use reth_evm_optimism::{OpExecutorProvider, OptimismEvmConfig}; use reth_network::{NetworkHandle, NetworkManager}; @@ -57,7 +58,7 @@ impl OptimismNode { OptimismConsensusBuilder, > where - Node: FullNodeTypes, + Node: FullNodeTypes, { let RollupArgs { disable_txpool_gossip, compute_pending_block, discovery_v4, .. } = args; ComponentsBuilder::default() @@ -78,7 +79,7 @@ impl OptimismNode { impl Node for OptimismNode where - N: FullNodeTypes, + N: FullNodeTypes, { type ComponentsBuilder = ComponentsBuilder< N, @@ -100,6 +101,7 @@ where impl NodeTypes for OptimismNode { type Primitives = (); type Engine = OptimismEngineTypes; + type ChainSpec = ChainSpec; } /// Add-ons w.r.t. optimism. @@ -117,7 +119,7 @@ pub struct OptimismExecutorBuilder; impl ExecutorBuilder for OptimismExecutorBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type EVM = OptimismEvmConfig; type Executor = OpExecutorProvider; @@ -144,7 +146,7 @@ pub struct OptimismPoolBuilder; impl PoolBuilder for OptimismPoolBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type Pool = OpTransactionPool; @@ -239,7 +241,7 @@ impl OptimismPayloadBuilder { impl PayloadServiceBuilder for OptimismPayloadBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, Pool: TransactionPool + Unpin + 'static, EVM: ConfigureEvm, { @@ -288,7 +290,7 @@ pub struct OptimismNetworkBuilder { impl NetworkBuilder for OptimismNetworkBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, Pool: TransactionPool + Unpin + 'static, { async fn build_network( @@ -345,7 +347,7 @@ pub struct OptimismConsensusBuilder; impl ConsensusBuilder for OptimismConsensusBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type Consensus = Arc; diff --git a/crates/optimism/rpc/Cargo.toml b/crates/optimism/rpc/Cargo.toml index e5c2bede4..b75b461d6 100644 --- a/crates/optimism/rpc/Cargo.toml +++ b/crates/optimism/rpc/Cargo.toml @@ -26,6 +26,7 @@ reth-transaction-pool.workspace = true reth-rpc.workspace = true reth-node-api.workspace = true reth-network-api.workspace = true +reth-chainspec.workspace = true # ethereum alloy-primitives.workspace = true diff --git a/crates/optimism/rpc/src/eth/call.rs b/crates/optimism/rpc/src/eth/call.rs index 5018ab129..e877d9ae6 100644 --- a/crates/optimism/rpc/src/eth/call.rs +++ b/crates/optimism/rpc/src/eth/call.rs @@ -1,3 +1,4 @@ +use reth_chainspec::ChainSpec; use reth_evm::ConfigureEvm; use reth_node_api::FullNodeComponents; use reth_primitives::{ @@ -16,7 +17,7 @@ use crate::{OpEthApi, OpEthApiError}; impl EthCall for OpEthApi where Self: Call, - N: FullNodeComponents, + N: FullNodeComponents, { } diff --git a/crates/optimism/rpc/src/eth/mod.rs b/crates/optimism/rpc/src/eth/mod.rs index d36f9a3b8..3d379c9d3 100644 --- a/crates/optimism/rpc/src/eth/mod.rs +++ b/crates/optimism/rpc/src/eth/mod.rs @@ -11,6 +11,7 @@ use std::{fmt, sync::Arc}; use alloy_primitives::U256; use derive_more::Deref; +use reth_chainspec::ChainSpec; use reth_evm::ConfigureEvm; use reth_network_api::NetworkInfo; use reth_node_api::{BuilderProvider, FullNodeComponents, FullNodeTypes}; @@ -98,17 +99,20 @@ impl OpEthApi { impl EthApiTypes for OpEthApi where Self: Send + Sync, - N: FullNodeComponents, + N: FullNodeComponents, { type Error = OpEthApiError; } impl EthApiSpec for OpEthApi where - N: FullNodeComponents, + N: FullNodeComponents, { #[inline] - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader { + fn provider( + &self, + ) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader + { self.inner.provider() } @@ -131,7 +135,7 @@ where impl SpawnBlocking for OpEthApi where Self: Send + Sync + Clone + 'static, - N: FullNodeComponents, + N: FullNodeComponents, { #[inline] fn io_task_spawner(&self) -> impl TaskSpawner { @@ -152,10 +156,12 @@ where impl LoadFee for OpEthApi where Self: LoadBlock, - N: FullNodeComponents, + N: FullNodeComponents, { #[inline] - fn provider(&self) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider { + fn provider( + &self, + ) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider { self.inner.provider() } @@ -178,10 +184,10 @@ where impl LoadState for OpEthApi where Self: Send + Sync, - N: FullNodeComponents, + N: FullNodeComponents, { #[inline] - fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider { + fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider { self.inner.provider() } diff --git a/crates/optimism/rpc/src/eth/pending_block.rs b/crates/optimism/rpc/src/eth/pending_block.rs index 0a66fb623..62aaee682 100644 --- a/crates/optimism/rpc/src/eth/pending_block.rs +++ b/crates/optimism/rpc/src/eth/pending_block.rs @@ -1,6 +1,7 @@ //! Loads OP pending block for a RPC response. use crate::OpEthApi; +use reth_chainspec::ChainSpec; use reth_evm::ConfigureEvm; use reth_node_api::FullNodeComponents; use reth_primitives::{ @@ -20,12 +21,15 @@ use reth_transaction_pool::TransactionPool; impl LoadPendingBlock for OpEthApi where Self: SpawnBlocking, - N: FullNodeComponents, + N: FullNodeComponents, { #[inline] fn provider( &self, - ) -> impl BlockReaderIdExt + EvmEnvProvider + ChainSpecProvider + StateProviderFactory { + ) -> impl BlockReaderIdExt + + EvmEnvProvider + + ChainSpecProvider + + StateProviderFactory { self.inner.provider() } diff --git a/crates/rpc/rpc-builder/Cargo.toml b/crates/rpc/rpc-builder/Cargo.toml index d410268a2..790feb70b 100644 --- a/crates/rpc/rpc-builder/Cargo.toml +++ b/crates/rpc/rpc-builder/Cargo.toml @@ -14,6 +14,7 @@ workspace = true [dependencies] # reth reth-ipc.workspace = true +reth-chainspec.workspace = true reth-network-api.workspace = true reth-node-core.workspace = true reth-provider.workspace = true diff --git a/crates/rpc/rpc-builder/src/lib.rs b/crates/rpc/rpc-builder/src/lib.rs index d3346bcdc..cf38fd1fa 100644 --- a/crates/rpc/rpc-builder/src/lib.rs +++ b/crates/rpc/rpc-builder/src/lib.rs @@ -151,6 +151,7 @@ use jsonrpsee::{ }, Methods, RpcModule, }; +use reth_chainspec::ChainSpec; use reth_engine_primitives::EngineTypes; use reth_evm::ConfigureEvm; use reth_network_api::{noop::NoopNetwork, NetworkInfo, Peers}; @@ -754,10 +755,11 @@ where } } -impl +impl RpcRegistryInner where Network: NetworkInfo + Clone + 'static, + Provider: ChainSpecProvider, { /// Instantiates `AdminApi` pub fn admin_api(&self) -> AdminApi diff --git a/crates/rpc/rpc-eth-api/src/helpers/fee.rs b/crates/rpc/rpc-eth-api/src/helpers/fee.rs index bbd397134..6b715ed21 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/fee.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/fee.rs @@ -1,6 +1,7 @@ //! Loads fee history from database. Helper trait for `eth_` fee and transaction RPC methods. use futures::Future; +use reth_chainspec::ChainSpec; use reth_primitives::U256; use reth_provider::{BlockIdReader, BlockReaderIdExt, ChainSpecProvider, HeaderProvider}; use reth_rpc_eth_types::{ @@ -239,7 +240,9 @@ pub trait LoadFee: LoadBlock { // Returns a handle for reading data from disk. /// /// Data access in default (L1) trait method implementations. - fn provider(&self) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider; + fn provider( + &self, + ) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider; /// Returns a handle for reading data from memory. /// diff --git a/crates/rpc/rpc-eth-api/src/helpers/pending_block.rs b/crates/rpc/rpc-eth-api/src/helpers/pending_block.rs index 183b1c791..a47326792 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/pending_block.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/pending_block.rs @@ -4,7 +4,7 @@ use std::time::{Duration, Instant}; use futures::Future; -use reth_chainspec::EthereumHardforks; +use reth_chainspec::{ChainSpec, EthereumHardforks}; use reth_evm::{system_calls::pre_block_beacon_root_contract_call, ConfigureEvm, ConfigureEvmEnv}; use reth_execution_types::ExecutionOutcome; use reth_primitives::{ @@ -47,7 +47,10 @@ pub trait LoadPendingBlock: EthApiTypes { /// Data access in default (L1) trait method implementations. fn provider( &self, - ) -> impl BlockReaderIdExt + EvmEnvProvider + ChainSpecProvider + StateProviderFactory; + ) -> impl BlockReaderIdExt + + EvmEnvProvider + + ChainSpecProvider + + StateProviderFactory; /// Returns a handle for reading data from transaction pool. /// diff --git a/crates/rpc/rpc-eth-api/src/helpers/spec.rs b/crates/rpc/rpc-eth-api/src/helpers/spec.rs index bf1e82204..f8f257fdb 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/spec.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/spec.rs @@ -18,7 +18,9 @@ use super::EthSigner; #[auto_impl::auto_impl(&, Arc)] pub trait EthApiSpec: Send + Sync { /// Returns a handle for reading data from disk. - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader; + fn provider( + &self, + ) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader; /// Returns a handle for reading network data summary. fn network(&self) -> impl NetworkInfo; diff --git a/crates/rpc/rpc-eth-api/src/helpers/state.rs b/crates/rpc/rpc-eth-api/src/helpers/state.rs index 1407a661b..a8907e419 100644 --- a/crates/rpc/rpc-eth-api/src/helpers/state.rs +++ b/crates/rpc/rpc-eth-api/src/helpers/state.rs @@ -2,6 +2,7 @@ //! RPC methods. use futures::Future; +use reth_chainspec::ChainSpec; use reth_errors::RethError; use reth_evm::ConfigureEvmEnv; use reth_primitives::{Address, BlockId, Bytes, Header, B256, KECCAK_EMPTY, U256}; @@ -163,7 +164,7 @@ pub trait LoadState: EthApiTypes { /// Returns a handle for reading state from database. /// /// Data access in default trait method implementations. - fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider; + fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider; /// Returns a handle for reading data from memory. /// diff --git a/crates/rpc/rpc/src/debug.rs b/crates/rpc/rpc/src/debug.rs index b7173c44c..32ff728ef 100644 --- a/crates/rpc/rpc/src/debug.rs +++ b/crates/rpc/rpc/src/debug.rs @@ -1,7 +1,7 @@ use alloy_rlp::{Decodable, Encodable}; use async_trait::async_trait; use jsonrpsee::core::RpcResult; -use reth_chainspec::EthereumHardforks; +use reth_chainspec::{ChainSpec, EthereumHardforks}; use reth_evm::{system_calls::pre_block_beacon_root_contract_call, ConfigureEvmEnv}; use reth_primitives::{ Address, Block, BlockId, BlockNumberOrTag, Bytes, TransactionSignedEcRecovered, B256, U256, @@ -68,7 +68,7 @@ impl DebugApi where Provider: BlockReaderIdExt + HeaderProvider - + ChainSpecProvider + + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, @@ -789,7 +789,7 @@ impl DebugApiServer for DebugApi where Provider: BlockReaderIdExt + HeaderProvider - + ChainSpecProvider + + ChainSpecProvider + StateProviderFactory + EvmEnvProvider + 'static, diff --git a/crates/rpc/rpc/src/eth/core.rs b/crates/rpc/rpc/src/eth/core.rs index 231b6a72d..281d0768e 100644 --- a/crates/rpc/rpc/src/eth/core.rs +++ b/crates/rpc/rpc/src/eth/core.rs @@ -368,7 +368,7 @@ impl UpdateRawTxForwarder #[cfg(test)] mod tests { use jsonrpsee_types::error::INVALID_PARAMS_CODE; - use reth_chainspec::BaseFeeParams; + use reth_chainspec::{BaseFeeParams, ChainSpec}; use reth_evm_ethereum::EthEvmConfig; use reth_network_api::noop::NoopNetwork; use reth_primitives::{Block, BlockNumberOrTag, Header, TransactionSigned, B256, U64}; @@ -391,7 +391,7 @@ mod tests { fn build_test_eth_api< P: BlockReaderIdExt + BlockReader - + ChainSpecProvider + + ChainSpecProvider + EvmEnvProvider + StateProviderFactory + Unpin diff --git a/crates/rpc/rpc/src/eth/helpers/fees.rs b/crates/rpc/rpc/src/eth/helpers/fees.rs index 7380f4ea2..70ff98ba8 100644 --- a/crates/rpc/rpc/src/eth/helpers/fees.rs +++ b/crates/rpc/rpc/src/eth/helpers/fees.rs @@ -1,5 +1,6 @@ //! Contains RPC handler implementations for fee history. +use reth_chainspec::ChainSpec; use reth_provider::{BlockIdReader, BlockReaderIdExt, ChainSpecProvider, HeaderProvider}; use reth_rpc_eth_api::helpers::{EthFees, LoadBlock, LoadFee}; @@ -15,10 +16,12 @@ impl EthFees for EthApi LoadFee for EthApi where Self: LoadBlock, - Provider: BlockReaderIdExt + HeaderProvider + ChainSpecProvider, + Provider: BlockReaderIdExt + HeaderProvider + ChainSpecProvider, { #[inline] - fn provider(&self) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider { + fn provider( + &self, + ) -> impl BlockIdReader + HeaderProvider + ChainSpecProvider { self.inner.provider() } diff --git a/crates/rpc/rpc/src/eth/helpers/pending_block.rs b/crates/rpc/rpc/src/eth/helpers/pending_block.rs index 02b092b4b..0660a92da 100644 --- a/crates/rpc/rpc/src/eth/helpers/pending_block.rs +++ b/crates/rpc/rpc/src/eth/helpers/pending_block.rs @@ -1,5 +1,6 @@ //! Support for building a pending block with transactions from local view of mempool. +use reth_chainspec::ChainSpec; use reth_evm::ConfigureEvm; use reth_provider::{BlockReaderIdExt, ChainSpecProvider, EvmEnvProvider, StateProviderFactory}; use reth_rpc_eth_api::helpers::{LoadPendingBlock, SpawnBlocking}; @@ -12,14 +13,20 @@ impl LoadPendingBlock for EthApi where Self: SpawnBlocking, - Provider: BlockReaderIdExt + EvmEnvProvider + ChainSpecProvider + StateProviderFactory, + Provider: BlockReaderIdExt + + EvmEnvProvider + + ChainSpecProvider + + StateProviderFactory, Pool: TransactionPool, EvmConfig: ConfigureEvm, { #[inline] fn provider( &self, - ) -> impl BlockReaderIdExt + EvmEnvProvider + ChainSpecProvider + StateProviderFactory { + ) -> impl BlockReaderIdExt + + EvmEnvProvider + + ChainSpecProvider + + StateProviderFactory { self.inner.provider() } diff --git a/crates/rpc/rpc/src/eth/helpers/spec.rs b/crates/rpc/rpc/src/eth/helpers/spec.rs index 3bb3d804b..202587a3e 100644 --- a/crates/rpc/rpc/src/eth/helpers/spec.rs +++ b/crates/rpc/rpc/src/eth/helpers/spec.rs @@ -1,3 +1,4 @@ +use reth_chainspec::ChainSpec; use reth_network_api::NetworkInfo; use reth_primitives::U256; use reth_provider::{BlockNumReader, ChainSpecProvider, StageCheckpointReader}; @@ -9,11 +10,15 @@ use crate::EthApi; impl EthApiSpec for EthApi where Pool: TransactionPool + 'static, - Provider: ChainSpecProvider + BlockNumReader + StageCheckpointReader + 'static, + Provider: + ChainSpecProvider + BlockNumReader + StageCheckpointReader + 'static, Network: NetworkInfo + 'static, EvmConfig: Send + Sync, { - fn provider(&self) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader { + fn provider( + &self, + ) -> impl ChainSpecProvider + BlockNumReader + StageCheckpointReader + { self.inner.provider() } diff --git a/crates/rpc/rpc/src/eth/helpers/state.rs b/crates/rpc/rpc/src/eth/helpers/state.rs index 6b1a24aff..a63ce5847 100644 --- a/crates/rpc/rpc/src/eth/helpers/state.rs +++ b/crates/rpc/rpc/src/eth/helpers/state.rs @@ -1,5 +1,6 @@ //! Contains RPC handler implementations specific to state. +use reth_chainspec::ChainSpec; use reth_provider::{ChainSpecProvider, StateProviderFactory}; use reth_transaction_pool::TransactionPool; @@ -20,11 +21,11 @@ where impl LoadState for EthApi where Self: Send + Sync, - Provider: StateProviderFactory + ChainSpecProvider, + Provider: StateProviderFactory + ChainSpecProvider, Pool: TransactionPool, { #[inline] - fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider { + fn provider(&self) -> impl StateProviderFactory + ChainSpecProvider { self.inner.provider() } diff --git a/crates/rpc/rpc/src/trace.rs b/crates/rpc/rpc/src/trace.rs index 0089b8b86..cb9f0ab26 100644 --- a/crates/rpc/rpc/src/trace.rs +++ b/crates/rpc/rpc/src/trace.rs @@ -2,7 +2,7 @@ use std::{collections::HashSet, sync::Arc}; use async_trait::async_trait; use jsonrpsee::core::RpcResult; -use reth_chainspec::EthereumHardforks; +use reth_chainspec::{ChainSpec, EthereumHardforks}; use reth_consensus_common::calc::{ base_block_reward, base_block_reward_pre_merge, block_reward, ommer_reward, }; @@ -75,7 +75,11 @@ impl TraceApi { impl TraceApi where - Provider: BlockReader + StateProviderFactory + EvmEnvProvider + ChainSpecProvider + 'static, + Provider: BlockReader + + StateProviderFactory + + EvmEnvProvider + + ChainSpecProvider + + 'static, Eth: TraceExt + 'static, { /// Executes the given call and returns a number of possible traces for it. @@ -547,7 +551,11 @@ where #[async_trait] impl TraceApiServer for TraceApi where - Provider: BlockReader + StateProviderFactory + EvmEnvProvider + ChainSpecProvider + 'static, + Provider: BlockReader + + StateProviderFactory + + EvmEnvProvider + + ChainSpecProvider + + 'static, Eth: TraceExt + 'static, { /// Executes the given call and returns a number of possible traces for it. diff --git a/crates/storage/provider/src/providers/blockchain_provider.rs b/crates/storage/provider/src/providers/blockchain_provider.rs index 87c0afa33..382fd4cc5 100644 --- a/crates/storage/provider/src/providers/blockchain_provider.rs +++ b/crates/storage/provider/src/providers/blockchain_provider.rs @@ -41,9 +41,9 @@ use tracing::trace; /// 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(Debug)] -pub struct BlockchainProvider2 { +pub struct BlockchainProvider2 { /// Provider type used to access the database. - database: ProviderFactory, + database: ProviderFactory, /// Tracks the chain info wrt forkchoice updates and in memory canonical /// state. pub(super) canonical_in_memory_state: CanonicalInMemoryState, @@ -1173,6 +1173,8 @@ impl ChainSpecProvider for BlockchainProvider2 where DB: Send + Sync, { + type ChainSpec = ChainSpec; + fn chain_spec(&self) -> Arc { self.database.chain_spec() } diff --git a/crates/storage/provider/src/providers/database/mod.rs b/crates/storage/provider/src/providers/database/mod.rs index e5d2bbd33..70a516931 100644 --- a/crates/storage/provider/src/providers/database/mod.rs +++ b/crates/storage/provider/src/providers/database/mod.rs @@ -7,7 +7,7 @@ use crate::{ PruneCheckpointReader, RequestsProvider, StageCheckpointReader, StateProviderBox, StaticFileProviderFactory, TransactionVariant, TransactionsProvider, WithdrawalsProvider, }; -use reth_chainspec::{ChainInfo, ChainSpec}; +use reth_chainspec::{ChainInfo, ChainSpec, EthChainSpec}; use reth_db::{init_db, mdbx::DatabaseArguments, DatabaseEnv}; use reth_db_api::{database::Database, models::StoredBlockBodyIndices}; use reth_errors::{RethError, RethResult}; @@ -39,11 +39,11 @@ mod metrics; /// /// This provider implements most provider or provider factory traits. #[derive(Debug)] -pub struct ProviderFactory { +pub struct ProviderFactory { /// Database db: Arc, /// Chain spec - chain_spec: Arc, + chain_spec: Arc, /// Static File Provider static_file_provider: StaticFileProvider, /// Optional pruning configuration @@ -569,10 +569,12 @@ impl EvmEnvProvider for ProviderFactory { } } -impl ChainSpecProvider for ProviderFactory +impl ChainSpecProvider for ProviderFactory where DB: Send + Sync, + ChainSpec: EthChainSpec, { + type ChainSpec = ChainSpec; fn chain_spec(&self) -> Arc { self.chain_spec.clone() } @@ -591,7 +593,7 @@ impl PruneCheckpointReader for ProviderFactory { } } -impl Clone for ProviderFactory { +impl Clone for ProviderFactory { fn clone(&self) -> Self { Self { db: Arc::clone(&self.db), diff --git a/crates/storage/provider/src/providers/mod.rs b/crates/storage/provider/src/providers/mod.rs index cd6fb7732..3b85a8086 100644 --- a/crates/storage/provider/src/providers/mod.rs +++ b/crates/storage/provider/src/providers/mod.rs @@ -13,7 +13,7 @@ use reth_blockchain_tree_api::{ InsertPayloadOk, }; use reth_chain_state::{ChainInfoTracker, ForkChoiceNotifications, ForkChoiceSubscriptions}; -use reth_chainspec::{ChainInfo, ChainSpec}; +use reth_chainspec::{ChainInfo, ChainSpec, EthChainSpec}; use reth_db_api::{ database::Database, models::{AccountBeforeTx, StoredBlockBodyIndices}, @@ -68,16 +68,16 @@ pub use blockchain_provider::BlockchainProvider2; /// 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. #[allow(missing_debug_implementations)] -pub struct BlockchainProvider { +pub struct BlockchainProvider { /// Provider type used to access the database. - database: ProviderFactory, + database: ProviderFactory, /// The blockchain tree instance. tree: Arc, /// Tracks the chain info wrt forkchoice updates chain_info: ChainInfoTracker, } -impl Clone for BlockchainProvider { +impl Clone for BlockchainProvider { fn clone(&self) -> Self { Self { database: self.database.clone(), @@ -613,11 +613,14 @@ where } } -impl ChainSpecProvider for BlockchainProvider +impl ChainSpecProvider for BlockchainProvider where DB: Send + Sync, + ChainSpec: EthChainSpec, { - fn chain_spec(&self) -> Arc { + type ChainSpec = ChainSpec; + + fn chain_spec(&self) -> Arc { self.database.chain_spec() } } diff --git a/crates/storage/provider/src/test_utils/mock.rs b/crates/storage/provider/src/test_utils/mock.rs index 3bd4b772d..9c92dafad 100644 --- a/crates/storage/provider/src/test_utils/mock.rs +++ b/crates/storage/provider/src/test_utils/mock.rs @@ -197,6 +197,8 @@ impl HeaderProvider for MockEthProvider { } impl ChainSpecProvider for MockEthProvider { + type ChainSpec = ChainSpec; + fn chain_spec(&self) -> Arc { self.chain_spec.clone() } diff --git a/crates/storage/provider/src/test_utils/noop.rs b/crates/storage/provider/src/test_utils/noop.rs index 814b7c121..5bd1e6d38 100644 --- a/crates/storage/provider/src/test_utils/noop.rs +++ b/crates/storage/provider/src/test_utils/noop.rs @@ -44,6 +44,8 @@ use crate::{ pub struct NoopProvider; impl ChainSpecProvider for NoopProvider { + type ChainSpec = ChainSpec; + fn chain_spec(&self) -> Arc { MAINNET.clone() } diff --git a/crates/storage/provider/src/traits/full.rs b/crates/storage/provider/src/traits/full.rs index 1f967fe14..d2a8f1cc7 100644 --- a/crates/storage/provider/src/traits/full.rs +++ b/crates/storage/provider/src/traits/full.rs @@ -6,17 +6,18 @@ use crate::{ StaticFileProviderFactory, TransactionsProvider, }; use reth_chain_state::{CanonStateSubscriptions, ForkChoiceSubscriptions}; +use reth_chainspec::{ChainSpec, EthChainSpec}; use reth_db_api::database::Database; /// Helper trait to unify all provider traits for simplicity. -pub trait FullProvider: +pub trait FullProvider: DatabaseProviderFactory + StaticFileProviderFactory + BlockReaderIdExt + AccountReader + StateProviderFactory + EvmEnvProvider - + ChainSpecProvider + + ChainSpecProvider + ChangeSetReader + CanonStateSubscriptions + ForkChoiceSubscriptions @@ -27,14 +28,14 @@ pub trait FullProvider: { } -impl FullProvider for T where +impl FullProvider for T where T: DatabaseProviderFactory + StaticFileProviderFactory + BlockReaderIdExt + AccountReader + StateProviderFactory + EvmEnvProvider - + ChainSpecProvider + + ChainSpecProvider + ChangeSetReader + CanonStateSubscriptions + ForkChoiceSubscriptions @@ -50,7 +51,7 @@ impl FullProvider for T where pub trait FullRpcProvider: StateProviderFactory + EvmEnvProvider - + ChainSpecProvider + + ChainSpecProvider + BlockReaderIdExt + HeaderProvider + TransactionsProvider @@ -64,7 +65,7 @@ pub trait FullRpcProvider: impl FullRpcProvider for T where T: StateProviderFactory + EvmEnvProvider - + ChainSpecProvider + + ChainSpecProvider + BlockReaderIdExt + HeaderProvider + TransactionsProvider diff --git a/crates/transaction-pool/src/lib.rs b/crates/transaction-pool/src/lib.rs index 241131d47..6b9d6bb81 100644 --- a/crates/transaction-pool/src/lib.rs +++ b/crates/transaction-pool/src/lib.rs @@ -108,7 +108,7 @@ //! ``` //! use futures_util::Stream; //! use reth_chain_state::CanonStateNotification; -//! use reth_chainspec::{MAINNET, ChainSpecProvider}; +//! use reth_chainspec::{MAINNET, ChainSpecProvider, ChainSpec}; //! use reth_storage_api::{BlockReaderIdExt, StateProviderFactory}; //! use reth_tasks::TokioTaskExecutor; //! use reth_tasks::TaskSpawner; @@ -118,7 +118,7 @@ //! use reth_transaction_pool::maintain::{maintain_transaction_pool_future}; //! //! async fn t(client: C, stream: St) -//! where C: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + 'static, +//! where C: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + 'static, //! St: Stream + Send + Unpin + 'static, //! { //! let blob_store = InMemoryBlobStore::default(); diff --git a/crates/transaction-pool/src/maintain.rs b/crates/transaction-pool/src/maintain.rs index b95dce886..6bf168ebf 100644 --- a/crates/transaction-pool/src/maintain.rs +++ b/crates/transaction-pool/src/maintain.rs @@ -12,7 +12,7 @@ use futures_util::{ FutureExt, Stream, StreamExt, }; use reth_chain_state::CanonStateNotification; -use reth_chainspec::ChainSpecProvider; +use reth_chainspec::{ChainSpec, ChainSpecProvider}; use reth_execution_types::ExecutionOutcome; use reth_fs_util::FsPathError; use reth_primitives::{ @@ -73,7 +73,12 @@ pub fn maintain_transaction_pool_future( config: MaintainPoolConfig, ) -> BoxFuture<'static, ()> where - Client: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + Send + 'static, + Client: StateProviderFactory + + BlockReaderIdExt + + ChainSpecProvider + + Clone + + Send + + 'static, P: TransactionPoolExt + 'static, St: Stream + Send + Unpin + 'static, Tasks: TaskSpawner + 'static, @@ -94,7 +99,12 @@ pub async fn maintain_transaction_pool( task_spawner: Tasks, config: MaintainPoolConfig, ) where - Client: StateProviderFactory + BlockReaderIdExt + ChainSpecProvider + Clone + Send + 'static, + Client: StateProviderFactory + + BlockReaderIdExt + + ChainSpecProvider + + Clone + + Send + + 'static, P: TransactionPoolExt + 'static, St: Stream + Send + Unpin + 'static, Tasks: TaskSpawner + 'static, diff --git a/examples/custom-engine-types/src/main.rs b/examples/custom-engine-types/src/main.rs index f1f83c55d..9980be374 100644 --- a/examples/custom-engine-types/src/main.rs +++ b/examples/custom-engine-types/src/main.rs @@ -196,6 +196,7 @@ impl NodeTypes for MyCustomNode { type Primitives = (); // use the custom engine types type Engine = CustomEngineTypes; + type ChainSpec = ChainSpec; } /// Implement the Node trait for the custom node @@ -203,7 +204,7 @@ impl NodeTypes for MyCustomNode { /// This provides a preset configuration for the node impl Node for MyCustomNode where - N: FullNodeTypes, + N: FullNodeTypes, { type ComponentsBuilder = ComponentsBuilder< N, @@ -233,7 +234,7 @@ pub struct CustomPayloadServiceBuilder; impl PayloadServiceBuilder for CustomPayloadServiceBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, Pool: TransactionPool + Unpin + 'static, { async fn spawn_payload_service( diff --git a/examples/custom-evm/src/main.rs b/examples/custom-evm/src/main.rs index c8b8a20f7..349dd5a84 100644 --- a/examples/custom-evm/src/main.rs +++ b/examples/custom-evm/src/main.rs @@ -144,7 +144,7 @@ pub struct MyExecutorBuilder; impl ExecutorBuilder for MyExecutorBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type EVM = MyEvmConfig; type Executor = EthExecutorProvider; diff --git a/examples/custom-node-components/Cargo.toml b/examples/custom-node-components/Cargo.toml index 467914102..1aa422447 100644 --- a/examples/custom-node-components/Cargo.toml +++ b/examples/custom-node-components/Cargo.toml @@ -11,6 +11,7 @@ reth.workspace = true reth-node-ethereum.workspace = true reth-transaction-pool.workspace = true reth-tracing.workspace = true +reth-chainspec.workspace = true eyre.workspace = true diff --git a/examples/custom-node-components/src/main.rs b/examples/custom-node-components/src/main.rs index 2c44e18d8..921f8cb3e 100644 --- a/examples/custom-node-components/src/main.rs +++ b/examples/custom-node-components/src/main.rs @@ -10,6 +10,7 @@ use reth::{ blobstore::InMemoryBlobStore, EthTransactionPool, TransactionValidationTaskExecutor, }, }; +use reth_chainspec::ChainSpec; use reth_node_ethereum::{node::EthereumAddOns, EthereumNode}; use reth_tracing::tracing::{debug, info}; use reth_transaction_pool::PoolConfig; @@ -45,7 +46,7 @@ pub struct CustomPoolBuilder { /// This will be used to build the transaction pool and its maintenance tasks during launch. impl PoolBuilder for CustomPoolBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type Pool = EthTransactionPool; diff --git a/examples/custom-payload-builder/src/main.rs b/examples/custom-payload-builder/src/main.rs index ca636198a..e0bf4e57a 100644 --- a/examples/custom-payload-builder/src/main.rs +++ b/examples/custom-payload-builder/src/main.rs @@ -20,6 +20,7 @@ use reth::{ transaction_pool::TransactionPool, }; use reth_basic_payload_builder::BasicPayloadJobGeneratorConfig; +use reth_chainspec::ChainSpec; use reth_node_ethereum::{node::EthereumAddOns, EthEngineTypes, EthereumNode}; use reth_payload_builder::PayloadBuilderService; @@ -32,7 +33,7 @@ pub struct CustomPayloadBuilder; impl PayloadServiceBuilder for CustomPayloadBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, Pool: TransactionPool + Unpin + 'static, { async fn spawn_payload_service( diff --git a/examples/stateful-precompile/src/main.rs b/examples/stateful-precompile/src/main.rs index 5505f6d16..253aea6df 100644 --- a/examples/stateful-precompile/src/main.rs +++ b/examples/stateful-precompile/src/main.rs @@ -207,7 +207,7 @@ pub struct MyExecutorBuilder { impl ExecutorBuilder for MyExecutorBuilder where - Node: FullNodeTypes, + Node: FullNodeTypes, { type EVM = MyEvmConfig; type Executor = EthExecutorProvider;