diff --git a/bin/reth/src/commands/debug_cmd/build_block.rs b/bin/reth/src/commands/debug_cmd/build_block.rs index 55acbaa37..063af9fc3 100644 --- a/bin/reth/src/commands/debug_cmd/build_block.rs +++ b/bin/reth/src/commands/debug_cmd/build_block.rs @@ -286,8 +286,11 @@ impl Command { ); #[cfg(feature = "optimism")] - let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new(self.chain.clone()) - .compute_pending_block(); + let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new( + self.chain.clone(), + reth_node_optimism::OptimismEvmConfig::default(), + ) + .compute_pending_block(); #[cfg(not(feature = "optimism"))] let payload_builder = reth_ethereum_payload_builder::EthereumPayloadBuilder::default(); diff --git a/bin/reth/src/commands/debug_cmd/replay_engine.rs b/bin/reth/src/commands/debug_cmd/replay_engine.rs index 6c5cfa98f..d1b99f074 100644 --- a/bin/reth/src/commands/debug_cmd/replay_engine.rs +++ b/bin/reth/src/commands/debug_cmd/replay_engine.rs @@ -161,7 +161,10 @@ impl Command { // Optimism's payload builder is implemented on the OptimismPayloadBuilder type. #[cfg(feature = "optimism")] - let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new(self.chain.clone()); + let payload_builder = reth_node_optimism::OptimismPayloadBuilder::new( + self.chain.clone(), + reth_node_optimism::OptimismEvmConfig::default(), + ); let payload_generator = BasicPayloadJobGenerator::with_builder( blockchain_db.clone(), diff --git a/crates/node-builder/src/builder.rs b/crates/node-builder/src/builder.rs index db1849024..919426856 100644 --- a/crates/node-builder/src/builder.rs +++ b/crates/node-builder/src/builder.rs @@ -547,7 +547,15 @@ where let blockchain_db = BlockchainProvider::new(provider_factory.clone(), blockchain_tree.clone())?; - let ctx = BuilderContext::new(head, blockchain_db, executor, data_dir, config, reth_config); + let ctx = BuilderContext::new( + head, + blockchain_db, + executor, + data_dir, + config, + reth_config, + evm_config.clone(), + ); debug!(target: "reth::cli", "creating components"); let NodeComponents { transaction_pool, network, payload_builder } = @@ -1119,18 +1127,8 @@ pub struct BuilderContext { config: NodeConfig, /// loaded config reth_config: reth_config::Config, -} - -impl std::fmt::Debug for BuilderContext { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("BuilderContext") - .field("head", &self.head) - .field("provider", &std::any::type_name::()) - .field("executor", &self.executor) - .field("data_dir", &self.data_dir) - .field("config", &self.config) - .finish() - } + /// EVM config of the node + evm_config: Node::Evm, } impl BuilderContext { @@ -1142,8 +1140,9 @@ impl BuilderContext { data_dir: ChainPath, config: NodeConfig, reth_config: reth_config::Config, + evm_config: Node::Evm, ) -> Self { - Self { head, provider, executor, data_dir, config, reth_config } + Self { head, provider, executor, data_dir, config, reth_config, evm_config } } /// Returns the configured provider to interact with the blockchain. @@ -1151,6 +1150,11 @@ impl BuilderContext { &self.provider } + /// Returns the configured evm. + pub fn evm_config(&self) -> &Node::Evm { + &self.evm_config + } + /// Returns the current head of the blockchain at launch. pub fn head(&self) -> Head { self.head @@ -1254,6 +1258,18 @@ impl BuilderContext { } } +impl std::fmt::Debug for BuilderContext { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("BuilderContext") + .field("head", &self.head) + .field("provider", &std::any::type_name::()) + .field("executor", &self.executor) + .field("data_dir", &self.data_dir) + .field("config", &self.config) + .finish() + } +} + /// The initial state of the node builder process. #[derive(Debug, Default)] #[non_exhaustive] diff --git a/crates/node-optimism/src/node.rs b/crates/node-optimism/src/node.rs index a2b84c932..0c365ccc7 100644 --- a/crates/node-optimism/src/node.rs +++ b/crates/node-optimism/src/node.rs @@ -182,9 +182,11 @@ where ctx: &BuilderContext, pool: Pool, ) -> eyre::Result> { - let payload_builder = - reth_optimism_payload_builder::OptimismPayloadBuilder::new(ctx.chain_spec()) - .set_compute_pending_block(self.compute_pending_block); + let payload_builder = reth_optimism_payload_builder::OptimismPayloadBuilder::new( + ctx.chain_spec(), + ctx.evm_config().clone(), + ) + .set_compute_pending_block(self.compute_pending_block); let conf = ctx.payload_builder_config(); let payload_job_config = BasicPayloadJobGeneratorConfig::default() diff --git a/crates/payload/optimism/src/builder.rs b/crates/payload/optimism/src/builder.rs index 062240cb0..06583af32 100644 --- a/crates/payload/optimism/src/builder.rs +++ b/crates/payload/optimism/src/builder.rs @@ -5,6 +5,7 @@ use crate::{ payload::{OptimismBuiltPayload, OptimismPayloadBuilderAttributes}, }; use reth_basic_payload_builder::*; +use reth_node_api::ConfigureEvm; use reth_payload_builder::error::PayloadBuilderError; use reth_primitives::{ constants::{BEACON_NONCE, EMPTY_RECEIPTS, EMPTY_TRANSACTIONS}, @@ -27,18 +28,20 @@ use tracing::{debug, trace, warn}; /// Optimism's payload builder #[derive(Debug, Clone, PartialEq, Eq)] -pub struct OptimismPayloadBuilder { +pub struct OptimismPayloadBuilder { /// The rollup's compute pending block configuration option. // TODO(clabby): Implement this feature. compute_pending_block: bool, /// The rollup's chain spec. chain_spec: Arc, + + evm_config: EvmConfig, } -impl OptimismPayloadBuilder { +impl OptimismPayloadBuilder { /// OptimismPayloadBuilder constructor. - pub fn new(chain_spec: Arc) -> Self { - Self { compute_pending_block: true, chain_spec } + pub fn new(chain_spec: Arc, evm_config: EvmConfig) -> Self { + Self { compute_pending_block: true, chain_spec, evm_config } } /// Sets the rollup's compute pending block configuration option. @@ -65,10 +68,11 @@ impl OptimismPayloadBuilder { } /// Implementation of the [PayloadBuilder] trait for [OptimismPayloadBuilder]. -impl PayloadBuilder for OptimismPayloadBuilder +impl PayloadBuilder for OptimismPayloadBuilder where Client: StateProviderFactory, Pool: TransactionPool, + EvmConfig: ConfigureEvm, { type Attributes = OptimismPayloadBuilderAttributes; type BuiltPayload = OptimismBuiltPayload; @@ -77,7 +81,7 @@ where &self, args: BuildArguments, ) -> Result, PayloadBuilderError> { - optimism_payload_builder(args, self.compute_pending_block) + optimism_payload_builder(self.evm_config.clone(), args, self.compute_pending_block) } fn on_missing_payload( @@ -219,11 +223,13 @@ where /// and configuration, this function creates a transaction payload. Returns /// a result indicating success with the payload or an error in case of failure. #[inline] -pub(crate) fn optimism_payload_builder( +pub(crate) fn optimism_payload_builder( + evm_config: EvmConfig, args: BuildArguments, _compute_pending_block: bool, ) -> Result, PayloadBuilderError> where + EvmConfig: ConfigureEvm, Client: StateProviderFactory, Pool: TransactionPool, { @@ -325,14 +331,13 @@ where )) })?; - let mut evm = revm::Evm::builder() - .with_db(&mut db) - .with_env_with_handler_cfg(EnvWithHandlerCfg::new_with_cfg_env( - initialized_cfg.clone(), - initialized_block_env.clone(), - tx_env_with_recovered(&sequencer_tx), - )) - .build(); + let env = EnvWithHandlerCfg::new_with_cfg_env( + initialized_cfg.clone(), + initialized_block_env.clone(), + tx_env_with_recovered(&sequencer_tx), + ); + + let mut evm = evm_config.evm_with_env(&mut db, env); let ResultAndState { result, state } = match evm.transact() { Ok(res) => res, @@ -407,16 +412,14 @@ where // convert tx to a signed transaction let tx = pool_tx.to_recovered_transaction(); + let env = EnvWithHandlerCfg::new_with_cfg_env( + initialized_cfg.clone(), + initialized_block_env.clone(), + tx_env_with_recovered(&tx), + ); // Configure the environment for the block. - let mut evm = revm::Evm::builder() - .with_db(&mut db) - .with_env_with_handler_cfg(EnvWithHandlerCfg::new_with_cfg_env( - initialized_cfg.clone(), - initialized_block_env.clone(), - tx_env_with_recovered(&tx), - )) - .build(); + let mut evm = evm_config.evm_with_env(&mut db, env); let ResultAndState { result, state } = match evm.transact() { Ok(res) => res,