From c867812793ea3adcd3807b6e792033267129c9df Mon Sep 17 00:00:00 2001 From: Ishika Choudhury <117741714+Rimeeeeee@users.noreply.github.com> Date: Fri, 25 Apr 2025 06:59:01 +0530 Subject: [PATCH] feat: exposed EvmConfig to PayloadServiceBuilder (#15887) Co-authored-by: Arsenii Kulikov --- Cargo.lock | 1 - crates/ethereum/node/src/node.rs | 2 +- crates/ethereum/node/src/payload.rs | 72 ++++++------------ crates/exex/test-utils/src/lib.rs | 2 +- crates/node/builder/src/components/builder.rs | 10 ++- crates/node/builder/src/components/payload.rs | 26 +++++-- crates/optimism/node/src/node.rs | 74 +++++++------------ crates/optimism/node/tests/it/priority.rs | 2 +- examples/custom-engine-types/src/main.rs | 7 +- examples/custom-evm/Cargo.toml | 1 - examples/custom-evm/src/main.rs | 57 ++------------ examples/custom-payload-builder/src/main.rs | 5 +- 12 files changed, 89 insertions(+), 170 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 099a33098e..57c1b92358 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3442,7 +3442,6 @@ dependencies = [ "eyre", "reth", "reth-ethereum", - "reth-ethereum-payload-builder", "reth-tracing", "tokio", ] diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 2d38ba19f0..8b3fa875ea 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -70,9 +70,9 @@ impl EthereumNode { ComponentsBuilder::default() .node_types::() .pool(EthereumPoolBuilder::default()) + .executor(EthereumExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) - .executor(EthereumExecutorBuilder::default()) .consensus(EthereumConsensusBuilder::default()) } diff --git a/crates/ethereum/node/src/payload.rs b/crates/ethereum/node/src/payload.rs index 9ca4c10f87..c7a9b5318c 100644 --- a/crates/ethereum/node/src/payload.rs +++ b/crates/ethereum/node/src/payload.rs @@ -7,7 +7,6 @@ use reth_ethereum_engine_primitives::{ use reth_ethereum_payload_builder::EthereumBuilderConfig; use reth_ethereum_primitives::EthPrimitives; use reth_evm::ConfigureEvm; -use reth_evm_ethereum::EthEvmConfig; use reth_node_api::{FullNodeTypes, NodeTypes, PrimitivesTy, TxTy}; use reth_node_builder::{ components::PayloadBuilderBuilder, BuilderContext, PayloadBuilderConfig, PayloadTypes, @@ -19,30 +18,32 @@ use reth_transaction_pool::{PoolTransaction, TransactionPool}; #[non_exhaustive] pub struct EthereumPayloadBuilder; -impl EthereumPayloadBuilder { - /// A helper method initializing [`reth_ethereum_payload_builder::EthereumPayloadBuilder`] with - /// the given EVM config. - pub fn build( +impl PayloadBuilderBuilder for EthereumPayloadBuilder +where + Types: NodeTypes, + Node: FullNodeTypes, + Pool: TransactionPool>> + + Unpin + + 'static, + Evm: ConfigureEvm< + Primitives = PrimitivesTy, + NextBlockEnvCtx = reth_evm::NextBlockEnvAttributes, + > + 'static, + Types::Payload: PayloadTypes< + BuiltPayload = EthBuiltPayload, + PayloadAttributes = EthPayloadAttributes, + PayloadBuilderAttributes = EthPayloadBuilderAttributes, + >, +{ + type PayloadBuilder = + reth_ethereum_payload_builder::EthereumPayloadBuilder; + + async fn build_payload_builder( self, - evm_config: Evm, ctx: &BuilderContext, pool: Pool, - ) -> eyre::Result< - reth_ethereum_payload_builder::EthereumPayloadBuilder, - > - where - Types: NodeTypes, - Node: FullNodeTypes, - Evm: ConfigureEvm>, - Pool: TransactionPool>> - + Unpin - + 'static, - Types::Payload: PayloadTypes< - BuiltPayload = EthBuiltPayload, - PayloadAttributes = EthPayloadAttributes, - PayloadBuilderAttributes = EthPayloadBuilderAttributes, - >, - { + evm_config: Evm, + ) -> eyre::Result { let conf = ctx.payload_builder_config(); Ok(reth_ethereum_payload_builder::EthereumPayloadBuilder::new( ctx.provider().clone(), @@ -52,30 +53,3 @@ impl EthereumPayloadBuilder { )) } } - -impl PayloadBuilderBuilder for EthereumPayloadBuilder -where - Types: NodeTypes, - Node: FullNodeTypes, - Pool: TransactionPool>> - + Unpin - + 'static, - Types::Payload: PayloadTypes< - BuiltPayload = EthBuiltPayload, - PayloadAttributes = EthPayloadAttributes, - PayloadBuilderAttributes = EthPayloadBuilderAttributes, - >, -{ - type PayloadBuilder = - reth_ethereum_payload_builder::EthereumPayloadBuilder; - - async fn build_payload_builder( - self, - ctx: &BuilderContext, - pool: Pool, - ) -> eyre::Result { - let evm_config = EthEvmConfig::new(ctx.chain_spec()) - .with_extra_data(ctx.payload_builder_config().extra_data_bytes()); - self.build(evm_config, ctx, pool) - } -} diff --git a/crates/exex/test-utils/src/lib.rs b/crates/exex/test-utils/src/lib.rs index 37472a1d40..11278594ec 100644 --- a/crates/exex/test-utils/src/lib.rs +++ b/crates/exex/test-utils/src/lib.rs @@ -151,9 +151,9 @@ where ComponentsBuilder::default() .node_types::() .pool(TestPoolBuilder::default()) + .executor(TestExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) - .executor(TestExecutorBuilder::default()) .consensus(TestConsensusBuilder::default()) } diff --git a/crates/node/builder/src/components/builder.rs b/crates/node/builder/src/components/builder.rs index 0e4d0d88fd..2c73aa75e0 100644 --- a/crates/node/builder/src/components/builder.rs +++ b/crates/node/builder/src/components/builder.rs @@ -211,7 +211,8 @@ where payload_builder: PB, ) -> ComponentsBuilder where - PB: PayloadServiceBuilder, + ExecB: ExecutorBuilder, + PB: PayloadServiceBuilder, { let Self { pool_builder, @@ -312,7 +313,7 @@ where Block = BlockTy, >, >, - PayloadB: PayloadServiceBuilder, + PayloadB: PayloadServiceBuilder, ExecB: ExecutorBuilder, ConsB: ConsensusBuilder, { @@ -341,8 +342,9 @@ 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_handle = - payload_builder.spawn_payload_builder_service(context, pool.clone()).await?; + let payload_builder_handle = payload_builder + .spawn_payload_builder_service(context, pool.clone(), evm_config.clone()) + .await?; let consensus = consensus_builder.build_consensus(context).await?; Ok(Components { diff --git a/crates/node/builder/src/components/payload.rs b/crates/node/builder/src/components/payload.rs index 87b7f7782a..2edc3b5e82 100644 --- a/crates/node/builder/src/components/payload.rs +++ b/crates/node/builder/src/components/payload.rs @@ -9,7 +9,9 @@ use reth_transaction_pool::TransactionPool; use std::future::Future; /// A type that knows how to spawn the payload service. -pub trait PayloadServiceBuilder: Send + Sized { +pub trait PayloadServiceBuilder: + Send + Sized +{ /// 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 @@ -18,15 +20,16 @@ pub trait PayloadServiceBuilder: Sen self, ctx: &BuilderContext, pool: Pool, + evm_config: EvmConfig, ) -> impl Future::Payload>>> + Send; } -impl PayloadServiceBuilder for F +impl PayloadServiceBuilder for F where Node: FullNodeTypes, Pool: TransactionPool, - F: Fn(&BuilderContext, Pool) -> Fut + Send, + F: Fn(&BuilderContext, Pool, EvmConfig) -> Fut + Send, Fut: Future::Payload>>> + Send, { @@ -34,14 +37,17 @@ where self, ctx: &BuilderContext, pool: Pool, + evm_config: EvmConfig, ) -> impl Future::Payload>>> { - self(ctx, pool) + self(ctx, pool, evm_config) } } /// A type that knows how to build a payload builder to plug into [`BasicPayloadServiceBuilder`]. -pub trait PayloadBuilderBuilder: Send + Sized { +pub trait PayloadBuilderBuilder: + Send + Sized +{ /// Payload builder implementation. type PayloadBuilder: PayloadBuilderFor + Unpin + 'static; @@ -52,6 +58,7 @@ pub trait PayloadBuilderBuilder: Sen self, ctx: &BuilderContext, pool: Pool, + evm_config: EvmConfig, ) -> impl Future> + Send; } @@ -66,18 +73,21 @@ impl BasicPayloadServiceBuilder { } } -impl PayloadServiceBuilder for BasicPayloadServiceBuilder +impl PayloadServiceBuilder + for BasicPayloadServiceBuilder where Node: FullNodeTypes, Pool: TransactionPool, - PB: PayloadBuilderBuilder, + EvmConfig: Send, + PB: PayloadBuilderBuilder, { async fn spawn_payload_builder_service( self, ctx: &BuilderContext, pool: Pool, + evm_config: EvmConfig, ) -> eyre::Result::Payload>> { - let payload_builder = self.0.build_payload_builder(ctx, pool).await?; + let payload_builder = self.0.build_payload_builder(ctx, pool, evm_config).await?; let conf = ctx.config().builder.clone(); diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index 4b73e01e0b..eb4a2fd7a2 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -122,6 +122,7 @@ impl OpNode { self.args.supervisor_safety_level, ), ) + .executor(OpExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::new( OpPayloadBuilder::new(compute_pending_block).with_da_config(self.da_config.clone()), )) @@ -129,7 +130,6 @@ impl OpNode { disable_txpool_gossip, disable_discovery_v4: !discovery_v4, }) - .executor(OpExecutorBuilder::default()) .consensus(OpConsensusBuilder::default()) } @@ -708,29 +708,36 @@ impl OpPayloadBuilder { let Self { compute_pending_block, da_config, .. } = self; OpPayloadBuilder { compute_pending_block, best_transactions, da_config } } +} - /// A helper method to initialize [`reth_optimism_payload_builder::OpPayloadBuilder`] with the - /// given EVM config. - pub fn build( +impl PayloadBuilderBuilder for OpPayloadBuilder +where + Node: FullNodeTypes< + Types: NodeTypes< + Payload = OpEngineTypes, + ChainSpec = OpChainSpec, + Primitives = OpPrimitives, + >, + >, + Evm: ConfigureEvm< + Primitives = PrimitivesTy, + NextBlockEnvCtx = OpNextBlockEnvAttributes, + > + 'static, + Pool: TransactionPool>> + + Unpin + + 'static, + Txs: OpPayloadTransactions, + ::Transaction: OpPooledTx, +{ + type PayloadBuilder = + reth_optimism_payload_builder::OpPayloadBuilder; + + async fn build_payload_builder( self, - evm_config: Evm, ctx: &BuilderContext, pool: Pool, - ) -> eyre::Result> - where - Node: FullNodeTypes< - Types: NodeTypes< - Payload = OpEngineTypes, - ChainSpec = OpChainSpec, - Primitives = OpPrimitives, - >, - >, - Pool: TransactionPool>> - + Unpin - + 'static, - Evm: ConfigureEvm>, - Txs: OpPayloadTransactions, - { + evm_config: Evm, + ) -> eyre::Result { let payload_builder = reth_optimism_payload_builder::OpPayloadBuilder::with_builder_config( pool, ctx.provider().clone(), @@ -743,33 +750,6 @@ impl OpPayloadBuilder { } } -impl PayloadBuilderBuilder for OpPayloadBuilder -where - Node: FullNodeTypes< - Types: NodeTypes< - Payload = OpEngineTypes, - ChainSpec = OpChainSpec, - Primitives = OpPrimitives, - >, - >, - Pool: TransactionPool>> - + Unpin - + 'static, - Txs: OpPayloadTransactions, - ::Transaction: OpPooledTx, -{ - type PayloadBuilder = - reth_optimism_payload_builder::OpPayloadBuilder; - - async fn build_payload_builder( - self, - ctx: &BuilderContext, - pool: Pool, - ) -> eyre::Result { - self.build(OpEvmConfig::optimism(ctx.chain_spec()), ctx, pool) - } -} - /// A basic optimism network builder. #[derive(Debug, Default, Clone)] pub struct OpNetworkBuilder { diff --git a/crates/optimism/node/tests/it/priority.rs b/crates/optimism/node/tests/it/priority.rs index 5bc03144d8..0a178a6d01 100644 --- a/crates/optimism/node/tests/it/priority.rs +++ b/crates/optimism/node/tests/it/priority.rs @@ -111,12 +111,12 @@ where ComponentsBuilder::default() .node_types::() .pool(OpPoolBuilder::default()) + .executor(OpExecutorBuilder::default()) .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/examples/custom-engine-types/src/main.rs b/examples/custom-engine-types/src/main.rs index da67a3cfb1..4f146073ef 100644 --- a/examples/custom-engine-types/src/main.rs +++ b/examples/custom-engine-types/src/main.rs @@ -323,9 +323,9 @@ where ComponentsBuilder::default() .node_types::() .pool(EthereumPoolBuilder::default()) + .executor(EthereumExecutorBuilder::default()) .payload(BasicPayloadServiceBuilder::default()) .network(EthereumNetworkBuilder::default()) - .executor(EthereumExecutorBuilder::default()) .consensus(EthereumConsensusBuilder::default()) } @@ -339,7 +339,7 @@ where #[non_exhaustive] pub struct CustomPayloadBuilderBuilder; -impl PayloadBuilderBuilder for CustomPayloadBuilderBuilder +impl PayloadBuilderBuilder for CustomPayloadBuilderBuilder where Node: FullNodeTypes< Types: NodeTypes< @@ -358,12 +358,13 @@ where self, ctx: &BuilderContext, pool: Pool, + evm_config: EthEvmConfig, ) -> eyre::Result { let payload_builder = CustomPayloadBuilder { inner: reth_ethereum_payload_builder::EthereumPayloadBuilder::new( ctx.provider().clone(), pool, - EthEvmConfig::new(ctx.provider().chain_spec().clone()), + evm_config, EthereumBuilderConfig::new(), ), }; diff --git a/examples/custom-evm/Cargo.toml b/examples/custom-evm/Cargo.toml index 01f4352d6d..c3a14e5657 100644 --- a/examples/custom-evm/Cargo.toml +++ b/examples/custom-evm/Cargo.toml @@ -7,7 +7,6 @@ license.workspace = true [dependencies] reth.workspace = true -reth-ethereum-payload-builder.workspace = true reth-ethereum = { workspace = true, features = ["test-utils", "node", "evm", "pool"] } reth-tracing.workspace = true alloy-evm.workspace = true diff --git a/examples/custom-evm/src/main.rs b/examples/custom-evm/src/main.rs index 4a57b6bd87..4cdce6859f 100644 --- a/examples/custom-evm/src/main.rs +++ b/examples/custom-evm/src/main.rs @@ -6,12 +6,7 @@ use alloy_evm::{eth::EthEvmContext, EvmFactory}; use alloy_genesis::Genesis; use alloy_primitives::{address, Address, Bytes}; use reth::{ - builder::{ - components::{BasicPayloadServiceBuilder, ExecutorBuilder, PayloadBuilderBuilder}, - BuilderContext, NodeBuilder, - }, - payload::{EthBuiltPayload, EthPayloadBuilderAttributes}, - rpc::types::engine::PayloadAttributes, + builder::{components::ExecutorBuilder, BuilderContext, NodeBuilder}, tasks::TaskManager, }; use reth_ethereum::{ @@ -34,13 +29,12 @@ use reth_ethereum::{ EthEvm, EthEvmConfig, }, node::{ - api::{FullNodeTypes, NodeTypes, PayloadTypes}, + api::{FullNodeTypes, NodeTypes}, core::{args::RpcServerArgs, node_config::NodeConfig}, - node::{EthereumAddOns, EthereumPayloadBuilder}, + node::EthereumAddOns, BasicBlockExecutorProvider, EthereumNode, }, - pool::{PoolTransaction, TransactionPool}, - EthPrimitives, TransactionSigned, + EthPrimitives, }; use reth_tracing::{RethTracer, Tracer}; use std::sync::OnceLock; @@ -102,43 +96,6 @@ where } } -/// Builds a regular ethereum block executor that uses the custom EVM. -#[derive(Debug, Default, Clone)] -#[non_exhaustive] -pub struct MyPayloadBuilder { - inner: EthereumPayloadBuilder, -} - -impl PayloadBuilderBuilder for MyPayloadBuilder -where - Types: NodeTypes, - Node: FullNodeTypes, - Pool: TransactionPool> - + Unpin - + 'static, - Types::Payload: PayloadTypes< - BuiltPayload = EthBuiltPayload, - PayloadAttributes = PayloadAttributes, - PayloadBuilderAttributes = EthPayloadBuilderAttributes, - >, -{ - type PayloadBuilder = reth_ethereum_payload_builder::EthereumPayloadBuilder< - Pool, - Node::Provider, - EthEvmConfig, - >; - - async fn build_payload_builder( - self, - ctx: &BuilderContext, - pool: Pool, - ) -> eyre::Result { - let evm_config = - EthEvmConfig::new_with_evm_factory(ctx.chain_spec(), MyEvmFactory::default()); - self.inner.build(evm_config, ctx, pool) - } -} - /// A custom precompile that contains static precompiles. #[derive(Clone)] pub struct CustomPrecompiles { @@ -228,11 +185,7 @@ async fn main() -> eyre::Result<()> { // configure the node with regular ethereum types .with_types::() // use default ethereum components but with our executor - .with_components( - EthereumNode::components() - .executor(MyExecutorBuilder::default()) - .payload(BasicPayloadServiceBuilder::new(MyPayloadBuilder::default())), - ) + .with_components(EthereumNode::components().executor(MyExecutorBuilder::default())) .with_add_ons(EthereumAddOns::default()) .launch() .await diff --git a/examples/custom-payload-builder/src/main.rs b/examples/custom-payload-builder/src/main.rs index 73b6d270b5..73798d20ea 100644 --- a/examples/custom-payload-builder/src/main.rs +++ b/examples/custom-payload-builder/src/main.rs @@ -37,7 +37,7 @@ pub mod job; #[non_exhaustive] pub struct CustomPayloadBuilder; -impl PayloadServiceBuilder for CustomPayloadBuilder +impl PayloadServiceBuilder for CustomPayloadBuilder where Node: FullNodeTypes< Types: NodeTypes< @@ -54,13 +54,14 @@ where self, ctx: &BuilderContext, pool: Pool, + evm_config: EthEvmConfig, ) -> eyre::Result::Payload>> { tracing::info!("Spawning a custom payload builder"); let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::new( ctx.provider().clone(), pool, - EthEvmConfig::new(ctx.chain_spec()), + evm_config, EthereumBuilderConfig::new(), );