From 77aa17fb57f8cc7207a13e8725cdac170a4656cf Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Wed, 26 Feb 2025 03:45:07 +0400 Subject: [PATCH] refactor: introduce `BasicPayloadServiceBuilder` (#14700) --- Cargo.lock | 3 +- crates/ethereum/node/src/node.rs | 9 +- crates/ethereum/node/src/payload.rs | 8 +- crates/exex/exex/Cargo.toml | 1 + crates/exex/exex/src/context.rs | 13 ++- crates/exex/test-utils/Cargo.toml | 1 - crates/exex/test-utils/src/lib.rs | 17 +--- crates/node/api/src/node.rs | 6 -- crates/node/builder/src/builder/states.rs | 5 - crates/node/builder/src/components/builder.rs | 20 ++-- crates/node/builder/src/components/mod.rs | 36 +------ crates/node/builder/src/components/payload.rs | 98 +++++++++++++------ crates/node/builder/src/launch/engine.rs | 1 - crates/node/builder/src/node.rs | 3 - crates/node/builder/src/rpc.rs | 8 +- crates/optimism/node/src/node.rs | 18 ++-- crates/optimism/node/tests/it/priority.rs | 9 +- crates/rpc/rpc-eth-api/Cargo.toml | 1 + crates/rpc/rpc-eth-api/src/node.rs | 7 +- examples/custom-engine-types/src/main.rs | 12 +-- examples/custom-evm/src/main.rs | 8 +- examples/custom-payload-builder/src/main.rs | 20 ++-- 22 files changed, 142 insertions(+), 162 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 682f3eea3f..1f5c30c88c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7848,6 +7848,7 @@ dependencies = [ "reth-metrics", "reth-node-api", "reth-node-core", + "reth-payload-builder", "reth-primitives", "reth-primitives-traits", "reth-provider", @@ -7879,7 +7880,6 @@ dependencies = [ "reth-consensus", "reth-db", "reth-db-common", - "reth-ethereum-payload-builder", "reth-evm", "reth-execution-types", "reth-exex", @@ -9324,6 +9324,7 @@ dependencies = [ "reth-evm", "reth-network-api", "reth-node-api", + "reth-payload-builder", "reth-primitives", "reth-primitives-traits", "reth-provider", diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 0dade2bd4f..cb77775f8f 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -15,7 +15,8 @@ use reth_network::{EthNetworkPrimitives, NetworkHandle, PeersInfo}; use reth_node_api::{AddOnsContext, FullNodeComponents, NodeAddOns, TxTy}; use reth_node_builder::{ components::{ - ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, NetworkBuilder, PoolBuilder, + BasicPayloadServiceBuilder, ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, + NetworkBuilder, PoolBuilder, }, node::{FullNodeTypes, NodeTypes, NodeTypesWithEngine}, rpc::{EngineValidatorAddOn, EngineValidatorBuilder, RethRpcAddOns, RpcAddOns, RpcHandle}, @@ -46,7 +47,7 @@ impl EthereumNode { pub fn components() -> ComponentsBuilder< Node, EthereumPoolBuilder, - EthereumPayloadBuilder, + BasicPayloadServiceBuilder, EthereumNetworkBuilder, EthereumExecutorBuilder, EthereumConsensusBuilder, @@ -62,7 +63,7 @@ impl EthereumNode { ComponentsBuilder::default() .node_types::() .pool(EthereumPoolBuilder::default()) - .payload(EthereumPayloadBuilder::default()) + .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) .executor(EthereumExecutorBuilder::default()) .consensus(EthereumConsensusBuilder::default()) @@ -210,7 +211,7 @@ where type ComponentsBuilder = ComponentsBuilder< N, EthereumPoolBuilder, - EthereumPayloadBuilder, + BasicPayloadServiceBuilder, EthereumNetworkBuilder, EthereumExecutorBuilder, EthereumConsensusBuilder, diff --git a/crates/ethereum/node/src/payload.rs b/crates/ethereum/node/src/payload.rs index ad156bf52f..984f704a4d 100644 --- a/crates/ethereum/node/src/payload.rs +++ b/crates/ethereum/node/src/payload.rs @@ -10,7 +10,7 @@ use reth_evm::ConfigureEvmFor; use reth_evm_ethereum::EthEvmConfig; use reth_node_api::{FullNodeTypes, NodeTypesWithEngine, PrimitivesTy, TxTy}; use reth_node_builder::{ - components::PayloadServiceBuilder, BuilderContext, PayloadBuilderConfig, PayloadTypes, + components::PayloadBuilderBuilder, BuilderContext, PayloadBuilderConfig, PayloadTypes, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; @@ -23,7 +23,7 @@ impl EthereumPayloadBuilder { /// A helper method initializing [`reth_ethereum_payload_builder::EthereumPayloadBuilder`] with /// the given EVM config. pub fn build( - &self, + self, evm_config: Evm, ctx: &BuilderContext, pool: Pool, @@ -53,7 +53,7 @@ impl EthereumPayloadBuilder { } } -impl PayloadServiceBuilder for EthereumPayloadBuilder +impl PayloadBuilderBuilder for EthereumPayloadBuilder where Types: NodeTypesWithEngine, Node: FullNodeTypes, @@ -70,7 +70,7 @@ where reth_ethereum_payload_builder::EthereumPayloadBuilder; async fn build_payload_builder( - &self, + self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { diff --git a/crates/exex/exex/Cargo.toml b/crates/exex/exex/Cargo.toml index 81992af8dd..43734040ed 100644 --- a/crates/exex/exex/Cargo.toml +++ b/crates/exex/exex/Cargo.toml @@ -30,6 +30,7 @@ reth-revm.workspace = true reth-stages-api.workspace = true reth-tasks.workspace = true reth-tracing.workspace = true +reth-payload-builder.workspace = true # alloy alloy-consensus.workspace = true diff --git a/crates/exex/exex/src/context.rs b/crates/exex/exex/src/context.rs index 8e29a7abaf..9b4b5876f7 100644 --- a/crates/exex/exex/src/context.rs +++ b/crates/exex/exex/src/context.rs @@ -1,8 +1,11 @@ use crate::{ExExContextDyn, ExExEvent, ExExNotifications, ExExNotificationsStream}; use alloy_eips::BlockNumHash; use reth_exex_types::ExExHead; -use reth_node_api::{FullNodeComponents, NodePrimitives, NodeTypes, PrimitivesTy}; +use reth_node_api::{ + FullNodeComponents, NodePrimitives, NodeTypes, NodeTypesWithEngine, PrimitivesTy, +}; use reth_node_core::node_config::NodeConfig; +use reth_payload_builder::PayloadBuilderHandle; use reth_provider::BlockReader; use reth_tasks::TaskExecutor; use std::fmt::Debug; @@ -100,8 +103,10 @@ where } /// Returns the handle to the payload builder service. - pub fn payload_builder(&self) -> &Node::PayloadBuilder { - self.components.payload_builder() + pub fn payload_builder_handle( + &self, + ) -> &PayloadBuilderHandle<::Engine> { + self.components.payload_builder_handle() } /// Returns the task executor. @@ -159,7 +164,7 @@ mod tests { self.ctx.block_executor(); self.ctx.provider(); self.ctx.network(); - self.ctx.payload_builder(); + self.ctx.payload_builder_handle(); self.ctx.task_executor(); self.ctx.set_notifications_without_head(); self.ctx.set_notifications_with_head(ExExHead { block: Default::default() }); diff --git a/crates/exex/test-utils/Cargo.toml b/crates/exex/test-utils/Cargo.toml index ec8f9e397c..e1cb0385f3 100644 --- a/crates/exex/test-utils/Cargo.toml +++ b/crates/exex/test-utils/Cargo.toml @@ -32,7 +32,6 @@ reth-provider = { workspace = true, features = ["test-utils"] } reth-tasks.workspace = true reth-transaction-pool = { workspace = true, features = ["test-utils"] } reth-trie-db.workspace = true -reth-ethereum-payload-builder.workspace = true ## alloy alloy-eips.workspace = true diff --git a/crates/exex/test-utils/src/lib.rs b/crates/exex/test-utils/src/lib.rs index 0ffdecf0a5..657802860d 100644 --- a/crates/exex/test-utils/src/lib.rs +++ b/crates/exex/test-utils/src/lib.rs @@ -24,7 +24,6 @@ use reth_db::{ DatabaseEnv, }; use reth_db_common::init::init_genesis; -use reth_ethereum_payload_builder::EthereumBuilderConfig; use reth_evm::test_utils::MockExecutorProvider; use reth_execution_types::Chain; use reth_exex::{ExExContext, ExExEvent, ExExNotification, ExExNotifications, Wal}; @@ -35,8 +34,8 @@ use reth_node_api::{ }; use reth_node_builder::{ components::{ - Components, ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, NodeComponentsBuilder, - PoolBuilder, + BasicPayloadServiceBuilder, Components, ComponentsBuilder, ConsensusBuilder, + ExecutorBuilder, NodeComponentsBuilder, PoolBuilder, }, BuilderContext, Node, NodeAdapter, RethFullAdapter, }; @@ -143,7 +142,7 @@ where type ComponentsBuilder = ComponentsBuilder< N, TestPoolBuilder, - EthereumPayloadBuilder, + BasicPayloadServiceBuilder, EthereumNetworkBuilder, TestExecutorBuilder, TestConsensusBuilder, @@ -156,7 +155,7 @@ where ComponentsBuilder::default() .node_types::() .pool(TestPoolBuilder::default()) - .payload(EthereumPayloadBuilder::default()) + .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) .executor(TestExecutorBuilder::default()) .consensus(TestConsensusBuilder::default()) @@ -288,13 +287,6 @@ pub async fn test_exex_context_with_chain_spec( let task_executor = tasks.executor(); tasks.executor().spawn(network_manager); - let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::new( - provider.clone(), - transaction_pool.clone(), - evm_config.clone(), - EthereumBuilderConfig::new(Default::default()), - ); - let (_, payload_builder_handle) = NoopPayloadBuilderService::::new(); let components = NodeAdapter::, _> { @@ -304,7 +296,6 @@ pub async fn test_exex_context_with_chain_spec( executor, consensus, network, - payload_builder, payload_builder_handle, }, task_executor, diff --git a/crates/node/api/src/node.rs b/crates/node/api/src/node.rs index 4ef4dccc1b..96991a55c5 100644 --- a/crates/node/api/src/node.rs +++ b/crates/node/api/src/node.rs @@ -82,9 +82,6 @@ pub trait FullNodeComponents: FullNodeTypes + Clone + 'static { /// Network API. type Network: FullNetwork; - /// Builds new blocks. - type PayloadBuilder: PayloadBuilderFor; - /// Returns the transaction pool of the node. fn pool(&self) -> &Self::Pool; @@ -100,9 +97,6 @@ pub trait FullNodeComponents: FullNodeTypes + Clone + 'static { /// Returns the handle to the network fn network(&self) -> &Self::Network; - /// Returns the configured payload builder. - fn payload_builder(&self) -> &Self::PayloadBuilder; - /// Returns the handle to the payload builder service handling payload building requests from /// the engine. fn payload_builder_handle( diff --git a/crates/node/builder/src/builder/states.rs b/crates/node/builder/src/builder/states.rs index a07caccbd8..4708d6ba1a 100644 --- a/crates/node/builder/src/builder/states.rs +++ b/crates/node/builder/src/builder/states.rs @@ -93,7 +93,6 @@ impl> FullNodeComponents for NodeAdapter< type Executor = C::Executor; type Consensus = C::Consensus; type Network = C::Network; - type PayloadBuilder = C::PayloadBuilder; fn pool(&self) -> &Self::Pool { self.components.pool() @@ -115,10 +114,6 @@ impl> FullNodeComponents for NodeAdapter< self.components.network() } - fn payload_builder(&self) -> &Self::PayloadBuilder { - self.components.payload_builder() - } - fn payload_builder_handle( &self, ) -> &reth_payload_builder::PayloadBuilderHandle< diff --git a/crates/node/builder/src/components/builder.rs b/crates/node/builder/src/components/builder.rs index 3468f989e2..5fb4a24d6c 100644 --- a/crates/node/builder/src/components/builder.rs +++ b/crates/node/builder/src/components/builder.rs @@ -14,8 +14,6 @@ use reth_node_api::{BlockTy, BodyTy, HeaderTy, PrimitivesTy, TxTy}; use reth_transaction_pool::{PoolTransaction, TransactionPool}; use std::{future::Future, marker::PhantomData}; -use super::PayloadBuilderFor; - /// A generic, general purpose and customizable [`NodeComponentsBuilder`] implementation. /// /// This type is stateful and captures the configuration of the node's components. @@ -325,7 +323,6 @@ where ExecB::EVM, ExecB::Executor, ConsB::Consensus, - PayloadB::PayloadBuilder, >; async fn build_components( @@ -334,7 +331,7 @@ where ) -> eyre::Result { let Self { pool_builder, - payload_builder: payload_builder_builder, + payload_builder, network_builder, executor_builder: evm_builder, consensus_builder, @@ -344,17 +341,14 @@ where let (evm_config, executor) = evm_builder.build_evm(context).await?; let pool = pool_builder.build_pool(context).await?; let network = network_builder.build_network(context, pool.clone()).await?; - let payload_builder = - payload_builder_builder.build_payload_builder(context, pool.clone()).await?; - let payload_builder_handle = payload_builder_builder - .spawn_payload_builder_service(context, payload_builder.clone())?; + let payload_builder_handle = + payload_builder.spawn_payload_builder_service(context, pool.clone()).await?; let consensus = consensus_builder.build_consensus(context).await?; Ok(Components { transaction_pool: pool, evm_config, network, - payload_builder, payload_builder_handle, executor, consensus, @@ -395,7 +389,7 @@ pub trait NodeComponentsBuilder: Send { ) -> impl Future> + Send; } -impl NodeComponentsBuilder for F +impl NodeComponentsBuilder for F where N: NetworkPrimitives< BlockHeader = HeaderTy, @@ -404,8 +398,7 @@ where >, Node: FullNodeTypes, F: FnOnce(&BuilderContext) -> Fut + Send, - Fut: Future>> - + Send, + Fut: Future>> + Send, Pool: TransactionPool>> + Unpin + 'static, @@ -413,9 +406,8 @@ where Executor: BlockExecutorProvider>, Cons: FullConsensus, Error = ConsensusError> + Clone + Unpin + 'static, - Payload: PayloadBuilderFor + Unpin + 'static, { - type Components = Components; + type Components = Components; fn build_components( self, diff --git a/crates/node/builder/src/components/mod.rs b/crates/node/builder/src/components/mod.rs index 846a49dc0c..036d962d23 100644 --- a/crates/node/builder/src/components/mod.rs +++ b/crates/node/builder/src/components/mod.rs @@ -29,8 +29,7 @@ use reth_evm::execute::{BlockExecutionStrategyFactory, BlockExecutorProvider}; use reth_network::{NetworkHandle, NetworkPrimitives}; use reth_network_api::FullNetwork; use reth_node_api::{ - BlockTy, BodyTy, HeaderTy, NodeTypes, NodeTypesWithEngine, PayloadBuilderFor, PrimitivesTy, - TxTy, + BlockTy, BodyTy, HeaderTy, NodeTypes, NodeTypesWithEngine, PrimitivesTy, TxTy, }; use reth_transaction_pool::{PoolTransaction, TransactionPool}; @@ -58,9 +57,6 @@ pub trait NodeComponents: Clone + Unpin + Send + Sync + 'stati /// Network API. type Network: FullNetwork>>; - /// Builds new blocks. - type PayloadBuilder: PayloadBuilderFor + Clone + Unpin + 'static; - /// Returns the transaction pool of the node. fn pool(&self) -> &Self::Pool; @@ -76,9 +72,6 @@ pub trait NodeComponents: Clone + Unpin + Send + Sync + 'stati /// Returns the handle to the network fn network(&self) -> &Self::Network; - /// Returns the payload builder that knows how to build blocks. - fn payload_builder(&self) -> &Self::PayloadBuilder; - /// Returns the handle to the payload builder service handling payload building requests from /// the engine. fn payload_builder_handle( @@ -90,15 +83,7 @@ pub trait NodeComponents: Clone + Unpin + Send + Sync + 'stati /// /// This provides access to all the components of the node. #[derive(Debug)] -pub struct Components< - Node: FullNodeTypes, - N: NetworkPrimitives, - Pool, - EVM, - Executor, - Consensus, - Payload, -> { +pub struct Components { /// The transaction pool of the node. pub transaction_pool: Pool, /// The node's EVM configuration, defining settings for the Ethereum Virtual Machine. @@ -109,14 +94,12 @@ pub struct Components< pub consensus: Consensus, /// The network implementation of the node. pub network: NetworkHandle, - /// The payload builder. - pub payload_builder: Payload, /// The handle to the payload builder service. pub payload_builder_handle: PayloadBuilderHandle<::Engine>, } -impl NodeComponents - for Components +impl NodeComponents + for Components where Node: FullNodeTypes, N: NetworkPrimitives< @@ -131,14 +114,12 @@ where Executor: BlockExecutorProvider>, Cons: FullConsensus, Error = ConsensusError> + Clone + Unpin + 'static, - Payload: PayloadBuilderFor + Clone + Unpin + 'static, { type Pool = Pool; type Evm = EVM; type Executor = Executor; type Consensus = Cons; type Network = NetworkHandle; - type PayloadBuilder = Payload; fn pool(&self) -> &Self::Pool { &self.transaction_pool @@ -160,10 +141,6 @@ where &self.network } - fn payload_builder(&self) -> &Self::PayloadBuilder { - &self.payload_builder - } - fn payload_builder_handle( &self, ) -> &PayloadBuilderHandle<::Engine> { @@ -171,8 +148,7 @@ where } } -impl Clone - for Components +impl Clone for Components where N: NetworkPrimitives, Node: FullNodeTypes, @@ -180,7 +156,6 @@ where EVM: ConfigureEvm, Executor: BlockExecutorProvider, Cons: Clone, - Payload: Clone, { fn clone(&self) -> Self { Self { @@ -189,7 +164,6 @@ where executor: self.executor.clone(), consensus: self.consensus.clone(), network: self.network.clone(), - payload_builder: self.payload_builder.clone(), payload_builder_handle: self.payload_builder_handle.clone(), } } diff --git a/crates/node/builder/src/components/payload.rs b/crates/node/builder/src/components/payload.rs index 5fc7102cc7..958b422f35 100644 --- a/crates/node/builder/src/components/payload.rs +++ b/crates/node/builder/src/components/payload.rs @@ -10,18 +10,6 @@ use std::future::Future; /// A type that knows how to spawn the payload service. pub trait PayloadServiceBuilder: Send + Sized { - /// Payload builder implementation. - type PayloadBuilder: PayloadBuilderFor + Unpin + 'static; - - /// Spawns the payload service and returns the handle to it. - /// - /// The [`BuilderContext`] is provided to allow access to the node's configuration. - fn build_payload_builder( - &self, - ctx: &BuilderContext, - pool: Pool, - ) -> impl Future> + Send; - /// Spawns the [`PayloadBuilderService`] and returns the handle to it for use by the engine. /// /// We provide default implementation via [`BasicPayloadJobGenerator`] but it can be overridden @@ -29,8 +17,73 @@ pub trait PayloadServiceBuilder: Sen fn spawn_payload_builder_service( self, ctx: &BuilderContext, - payload_builder: Self::PayloadBuilder, + pool: Pool, + ) -> impl Future< + Output = eyre::Result::Engine>>, + > + Send; +} + +impl PayloadServiceBuilder for F +where + Node: FullNodeTypes, + Pool: TransactionPool, + F: Fn(&BuilderContext, Pool) -> Fut + Send, + Fut: Future< + Output = eyre::Result< + PayloadBuilderHandle<::Engine>, + >, + > + Send, +{ + fn spawn_payload_builder_service( + self, + ctx: &BuilderContext, + pool: Pool, + ) -> impl Future< + Output = eyre::Result::Engine>>, + > { + self(ctx, pool) + } +} + +/// A type that knows how to build a payload builder to plug into [`BasicPayloadServiceBuilder`]. +pub trait PayloadBuilderBuilder: Send + Sized { + /// Payload builder implementation. + type PayloadBuilder: PayloadBuilderFor + Unpin + 'static; + + /// Spawns the payload service and returns the handle to it. + /// + /// The [`BuilderContext`] is provided to allow access to the node's configuration. + fn build_payload_builder( + self, + ctx: &BuilderContext, + pool: Pool, + ) -> impl Future> + Send; +} + +/// Basic payload service builder that spawns a [`BasicPayloadJobGenerator`] +#[derive(Debug, Default, Clone)] +pub struct BasicPayloadServiceBuilder(PB); + +impl BasicPayloadServiceBuilder { + /// Create a new [`BasicPayloadServiceBuilder`]. + pub fn new(payload_builder_builder: PB) -> Self { + Self(payload_builder_builder) + } +} + +impl PayloadServiceBuilder for BasicPayloadServiceBuilder +where + Node: FullNodeTypes, + Pool: TransactionPool, + PB: PayloadBuilderBuilder, +{ + async fn spawn_payload_builder_service( + self, + ctx: &BuilderContext, + pool: Pool, ) -> eyre::Result::Engine>> { + let payload_builder = self.0.build_payload_builder(ctx, pool).await?; + let conf = ctx.config().builder.clone(); let payload_job_config = BasicPayloadJobGeneratorConfig::default() @@ -52,22 +105,3 @@ pub trait PayloadServiceBuilder: Sen Ok(payload_service_handle) } } - -impl PayloadServiceBuilder for F -where - Node: FullNodeTypes, - Pool: TransactionPool, - F: Fn(&BuilderContext, Pool) -> Fut + Send, - Fut: Future> + Send, - Builder: PayloadBuilderFor + Unpin + 'static, -{ - type PayloadBuilder = Builder; - - fn build_payload_builder( - &self, - ctx: &BuilderContext, - pool: Pool, - ) -> impl Future> + Send { - self(ctx, pool) - } -} diff --git a/crates/node/builder/src/launch/engine.rs b/crates/node/builder/src/launch/engine.rs index e5fc8b340a..0c917f63ce 100644 --- a/crates/node/builder/src/launch/engine.rs +++ b/crates/node/builder/src/launch/engine.rs @@ -411,7 +411,6 @@ where pool: ctx.components().pool().clone(), network: ctx.components().network().clone(), provider: ctx.node_adapter().provider.clone(), - payload_builder: ctx.components().payload_builder().clone(), payload_builder_handle: ctx.components().payload_builder_handle().clone(), task_executor: ctx.task_executor().clone(), config: ctx.node_config().clone(), diff --git a/crates/node/builder/src/node.rs b/crates/node/builder/src/node.rs index d2e6ae8ae4..53cc6f96c5 100644 --- a/crates/node/builder/src/node.rs +++ b/crates/node/builder/src/node.rs @@ -117,8 +117,6 @@ pub struct FullNode> { pub network: Node::Network, /// Provider to interact with the node's database pub provider: Node::Provider, - /// Node's configured payload builder. - pub payload_builder: Node::PayloadBuilder, /// Handle to the node's payload builder service. pub payload_builder_handle: PayloadBuilderHandle<::Engine>, /// Task executor for the node. @@ -139,7 +137,6 @@ impl> Clone for FullNode &Node::PayloadBuilder { - self.node.payload_builder() + pub fn payload_builder_handle( + &self, + ) -> &PayloadBuilderHandle<::Engine> { + self.node.payload_builder_handle() } } diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index d2622c6225..c8e59ea776 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -17,8 +17,8 @@ use reth_node_api::{ }; use reth_node_builder::{ components::{ - ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, NetworkBuilder, - PayloadServiceBuilder, PoolBuilder, PoolBuilderConfigOverrides, + BasicPayloadServiceBuilder, ComponentsBuilder, ConsensusBuilder, ExecutorBuilder, + NetworkBuilder, PayloadBuilderBuilder, PoolBuilder, PoolBuilderConfigOverrides, }, node::{FullNodeTypes, NodeTypes, NodeTypesWithEngine}, rpc::{EngineValidatorAddOn, EngineValidatorBuilder, RethRpcAddOns, RpcAddOns, RpcHandle}, @@ -89,7 +89,7 @@ impl OpNode { ) -> ComponentsBuilder< Node, OpPoolBuilder, - OpPayloadBuilder, + BasicPayloadServiceBuilder, OpNetworkBuilder, OpExecutorBuilder, OpConsensusBuilder, @@ -111,9 +111,9 @@ impl OpNode { OpPoolBuilder::default() .with_enable_tx_conditional(self.args.enable_tx_conditional), ) - .payload( + .payload(BasicPayloadServiceBuilder::new( OpPayloadBuilder::new(compute_pending_block).with_da_config(self.da_config.clone()), - ) + )) .network(OpNetworkBuilder { disable_txpool_gossip, disable_discovery_v4: !discovery_v4, @@ -171,7 +171,7 @@ where type ComponentsBuilder = ComponentsBuilder< N, OpPoolBuilder, - OpPayloadBuilder, + BasicPayloadServiceBuilder, OpNetworkBuilder, OpExecutorBuilder, OpConsensusBuilder, @@ -592,7 +592,7 @@ impl OpPayloadBuilder { /// given EVM config. #[expect(clippy::type_complexity)] pub fn build( - &self, + self, evm_config: Evm, ctx: &BuilderContext, pool: Pool, @@ -632,7 +632,7 @@ impl OpPayloadBuilder { } } -impl PayloadServiceBuilder for OpPayloadBuilder +impl PayloadBuilderBuilder for OpPayloadBuilder where Node: FullNodeTypes< Types: NodeTypesWithEngine< @@ -655,7 +655,7 @@ where >; async fn build_payload_builder( - &self, + self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { diff --git a/crates/optimism/node/tests/it/priority.rs b/crates/optimism/node/tests/it/priority.rs index b1169c8320..81b5763e5c 100644 --- a/crates/optimism/node/tests/it/priority.rs +++ b/crates/optimism/node/tests/it/priority.rs @@ -12,7 +12,8 @@ use reth_e2e_test_utils::{ }; use reth_node_api::{FullNodeTypes, NodeTypesWithEngine}; use reth_node_builder::{ - components::ComponentsBuilder, EngineNodeLauncher, NodeBuilder, NodeConfig, + components::{BasicPayloadServiceBuilder, ComponentsBuilder}, + EngineNodeLauncher, NodeBuilder, NodeConfig, }; use reth_node_core::args::DatadirArgs; use reth_optimism_chainspec::{OpChainSpec, OpChainSpecBuilder}; @@ -93,7 +94,7 @@ fn build_components( ) -> ComponentsBuilder< Node, OpPoolBuilder, - OpPayloadBuilder, + BasicPayloadServiceBuilder>, OpNetworkBuilder, OpExecutorBuilder, OpConsensusBuilder, @@ -112,10 +113,10 @@ where ComponentsBuilder::default() .node_types::() .pool(OpPoolBuilder::default()) - .payload( + .payload(BasicPayloadServiceBuilder::new( OpPayloadBuilder::new(compute_pending_block) .with_transactions(CustomTxPriority { chain_id }), - ) + )) .network(OpNetworkBuilder { disable_txpool_gossip, disable_discovery_v4: !discovery_v4 }) .executor(OpExecutorBuilder::default()) .consensus(OpConsensusBuilder::default()) diff --git a/crates/rpc/rpc-eth-api/Cargo.toml b/crates/rpc/rpc-eth-api/Cargo.toml index 76d0b92f64..ad631017be 100644 --- a/crates/rpc/rpc-eth-api/Cargo.toml +++ b/crates/rpc/rpc-eth-api/Cargo.toml @@ -31,6 +31,7 @@ reth-rpc-server-types.workspace = true reth-network-api.workspace = true reth-node-api.workspace = true reth-trie-common = { workspace = true, features = ["eip1186"] } +reth-payload-builder.workspace = true # ethereum alloy-rlp.workspace = true diff --git a/crates/rpc/rpc-eth-api/src/node.rs b/crates/rpc/rpc-eth-api/src/node.rs index 538cb2ead8..71ca05ce01 100644 --- a/crates/rpc/rpc-eth-api/src/node.rs +++ b/crates/rpc/rpc-eth-api/src/node.rs @@ -1,6 +1,7 @@ //! Helper trait for interfacing with [`FullNodeComponents`]. -use reth_node_api::FullNodeComponents; +use reth_node_api::{FullNodeComponents, NodeTypesWithEngine}; +use reth_payload_builder::PayloadBuilderHandle; use reth_provider::{BlockReader, ProviderBlock, ProviderReceipt}; use reth_rpc_eth_types::EthStateCache; @@ -47,7 +48,7 @@ where type Pool = T::Pool; type Evm = ::Evm; type Network = ::Network; - type PayloadBuilder = ::PayloadBuilder; + type PayloadBuilder = PayloadBuilderHandle<::Engine>; #[inline] fn pool(&self) -> &Self::Pool { @@ -66,7 +67,7 @@ where #[inline] fn payload_builder(&self) -> &Self::PayloadBuilder { - FullNodeComponents::payload_builder(self) + FullNodeComponents::payload_builder_handle(self) } #[inline] diff --git a/examples/custom-engine-types/src/main.rs b/examples/custom-engine-types/src/main.rs index a487034d1c..47ec3c3d8a 100644 --- a/examples/custom-engine-types/src/main.rs +++ b/examples/custom-engine-types/src/main.rs @@ -31,7 +31,7 @@ use alloy_rpc_types::{ use reth::{ api::{InvalidPayloadAttributesError, PayloadTypes}, builder::{ - components::{ComponentsBuilder, PayloadServiceBuilder}, + components::{BasicPayloadServiceBuilder, ComponentsBuilder, PayloadBuilderBuilder}, node::{NodeTypes, NodeTypesWithEngine}, rpc::{EngineValidatorBuilder, RpcAddOns}, BuilderContext, FullNodeTypes, Node, NodeAdapter, NodeBuilder, NodeComponentsBuilder, @@ -324,7 +324,7 @@ where type ComponentsBuilder = ComponentsBuilder< N, EthereumPoolBuilder, - CustomPayloadServiceBuilder, + BasicPayloadServiceBuilder, EthereumNetworkBuilder, EthereumExecutorBuilder, EthereumConsensusBuilder, @@ -337,7 +337,7 @@ where ComponentsBuilder::default() .node_types::() .pool(EthereumPoolBuilder::default()) - .payload(CustomPayloadServiceBuilder::default()) + .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) .executor(EthereumExecutorBuilder::default()) .consensus(EthereumConsensusBuilder::default()) @@ -351,9 +351,9 @@ where /// A custom payload service builder that supports the custom engine types #[derive(Debug, Default, Clone)] #[non_exhaustive] -pub struct CustomPayloadServiceBuilder; +pub struct CustomPayloadBuilderBuilder; -impl PayloadServiceBuilder for CustomPayloadServiceBuilder +impl PayloadBuilderBuilder for CustomPayloadBuilderBuilder where Node: FullNodeTypes< Types: NodeTypesWithEngine< @@ -369,7 +369,7 @@ where type PayloadBuilder = CustomPayloadBuilder; async fn build_payload_builder( - &self, + self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { diff --git a/examples/custom-evm/src/main.rs b/examples/custom-evm/src/main.rs index 9eda7ae6e5..88ca3ee649 100644 --- a/examples/custom-evm/src/main.rs +++ b/examples/custom-evm/src/main.rs @@ -7,7 +7,7 @@ use alloy_genesis::Genesis; use alloy_primitives::{address, Address, Bytes}; use reth::{ builder::{ - components::{ExecutorBuilder, PayloadServiceBuilder}, + components::{BasicPayloadServiceBuilder, ExecutorBuilder, PayloadBuilderBuilder}, BuilderContext, NodeBuilder, }, payload::{EthBuiltPayload, EthPayloadBuilderAttributes}, @@ -104,7 +104,7 @@ pub struct MyPayloadBuilder { inner: EthereumPayloadBuilder, } -impl PayloadServiceBuilder for MyPayloadBuilder +impl PayloadBuilderBuilder for MyPayloadBuilder where Types: NodeTypesWithEngine, Node: FullNodeTypes, @@ -124,7 +124,7 @@ where >; async fn build_payload_builder( - &self, + self, ctx: &BuilderContext, pool: Pool, ) -> eyre::Result { @@ -224,7 +224,7 @@ async fn main() -> eyre::Result<()> { .with_components( EthereumNode::components() .executor(MyExecutorBuilder::default()) - .payload(MyPayloadBuilder::default()), + .payload(BasicPayloadServiceBuilder::new(MyPayloadBuilder::default())), ) .with_add_ons(EthereumAddOns::default()) .launch() diff --git a/examples/custom-payload-builder/src/main.rs b/examples/custom-payload-builder/src/main.rs index 1f9a7a5151..fdbed068d9 100644 --- a/examples/custom-payload-builder/src/main.rs +++ b/examples/custom-payload-builder/src/main.rs @@ -20,7 +20,7 @@ use reth::{ }; use reth_basic_payload_builder::BasicPayloadJobGeneratorConfig; use reth_chainspec::ChainSpec; -use reth_ethereum_payload_builder::{EthereumBuilderConfig, EthereumPayloadBuilder}; +use reth_ethereum_payload_builder::EthereumBuilderConfig; use reth_node_api::NodeTypesWithEngine; use reth_node_ethereum::{node::EthereumAddOns, EthEngineTypes, EthEvmConfig, EthereumNode}; use reth_payload_builder::{PayloadBuilderHandle, PayloadBuilderService}; @@ -46,29 +46,21 @@ where + Unpin + 'static, { - type PayloadBuilder = EthereumPayloadBuilder; - - async fn build_payload_builder( - &self, + async fn spawn_payload_builder_service( + self, ctx: &BuilderContext, pool: Pool, - ) -> eyre::Result { + ) -> eyre::Result::Engine>> { tracing::info!("Spawning a custom payload builder"); let conf = ctx.payload_builder_config(); - Ok(reth_ethereum_payload_builder::EthereumPayloadBuilder::new( + let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::new( ctx.provider().clone(), pool, EthEvmConfig::new(ctx.chain_spec()), EthereumBuilderConfig::new(conf.extra_data_bytes()), - )) - } + ); - fn spawn_payload_builder_service( - self, - ctx: &BuilderContext, - payload_builder: Self::PayloadBuilder, - ) -> eyre::Result::Engine>> { let conf = ctx.payload_builder_config(); let payload_job_config = BasicPayloadJobGeneratorConfig::default()