diff --git a/crates/rbuilder/src/building/evm.rs b/crates/rbuilder/src/building/evm.rs index f49c15661..25bedd7a4 100644 --- a/crates/rbuilder/src/building/evm.rs +++ b/crates/rbuilder/src/building/evm.rs @@ -1,21 +1,47 @@ use crate::building::precompile_cache::{PrecompileCache, WrappedPrecompile}; use parking_lot::Mutex; use reth_evm::{ - eth::EthEvmContext, EthEvm, EthEvmFactory, Evm, EvmEnv, EvmFactory as RethEvmFactory, + eth::EthEvmContext, EthEvm, EthEvmFactory, Evm as RethEvm, EvmEnv, + EvmFactory as RethEvmFactory, IntoTxEnv, }; use revm::{ context::{ - result::{EVMError, HaltReason}, + result::{EVMError, HaltReason, ResultAndState}, TxEnv, }, handler::EthPrecompiles, - inspector::NoOpInspector, interpreter::interpreter::EthInterpreter, primitives::hardfork::SpecId, Database, Inspector, }; use std::sync::Arc; +pub trait Evm { + fn transact( + &mut self, + tx: impl IntoTxEnv, + ) -> Result, EVMError>; +} + +impl Evm for EVM +where + DB: Database, + EVM: RethEvm< + DB = DB, + Tx = TxEnv, + Error = EVMError, + HaltReason = HaltReason, + Spec = SpecId, + >, +{ + fn transact( + &mut self, + tx: impl IntoTxEnv, + ) -> Result, EVMError> { + EVM::transact(self, tx) + } +} + /// Custom trait to abstract over EVM construction with a cleaner and more concrete /// interface than the `Evm` trait from `alloy-revm`. /// @@ -31,29 +57,13 @@ use std::sync::Arc; /// See [`EthCachedEvmFactory`] for an implementation that integrates precompile /// caching and uses `reth_evm::EthEvm` internally. pub trait EvmFactory { - type Evm: Evm< - DB = DB, - Tx = TxEnv, - HaltReason = HaltReason, - Error = EVMError, - Spec = SpecId, - > - where - DB: Database, - I: Inspector>; - /// Create an EVM instance with default (no-op) inspector. - fn create_evm(&self, db: DB, env: EvmEnv) -> Self::Evm + fn create_evm(&self, db: DB, env: EvmEnv) -> impl Evm where DB: Database; /// Create an EVM instance with a provided inspector. - fn create_evm_with_inspector( - &self, - db: DB, - env: EvmEnv, - inspector: I, - ) -> Self::Evm + fn create_evm_with_inspector(&self, db: DB, env: EvmEnv, inspector: I) -> impl Evm where DB: Database, I: Inspector, EthInterpreter>; @@ -73,13 +83,7 @@ pub struct EthCachedEvmFactory { /// It also integrates precompile caching using the [`PrecompileCache`] and /// [`WrappedPrecompile`] types. impl EvmFactory for EthCachedEvmFactory { - type Evm - = EthEvm> - where - DB: Database, - I: Inspector>; - - fn create_evm(&self, db: DB, env: EvmEnv) -> Self::Evm + fn create_evm(&self, db: DB, env: EvmEnv) -> impl Evm where DB: Database, { @@ -95,21 +99,21 @@ impl EvmFactory for EthCachedEvmFactory { EthEvm::new(evm, false) } - fn create_evm_with_inspector( - &self, - db: DB, - input: EvmEnv, - inspector: I, - ) -> Self::Evm + fn create_evm_with_inspector(&self, db: DB, env: EvmEnv, inspector: I) -> impl Evm where DB: Database, I: Inspector, EthInterpreter>, { - EthEvm::new( - self.create_evm(db, input) - .into_inner() - .with_inspector(inspector), - true, - ) + let evm = self + .evm_factory + .create_evm(db, env) + .into_inner() + .with_precompiles(WrappedPrecompile::new( + EthPrecompiles::default(), + self.cache.clone(), + )) + .with_inspector(inspector); + + EthEvm::new(evm, true) } } diff --git a/crates/rbuilder/src/building/order_commit.rs b/crates/rbuilder/src/building/order_commit.rs index 6d9d0b323..1c333cfac 100644 --- a/crates/rbuilder/src/building/order_commit.rs +++ b/crates/rbuilder/src/building/order_commit.rs @@ -7,7 +7,7 @@ use super::{ use crate::{ building::{ estimate_payout_gas_limit, - evm::EvmFactory, + evm::{Evm, EvmFactory}, evm_inspector::{RBuilderEVMInspector, UsedStateTrace}, }, primitives::{ @@ -22,7 +22,7 @@ use alloy_eips::eip4844::{DATA_GAS_PER_BLOB, MAX_DATA_GAS_PER_BLOCK}; use alloy_primitives::{Address, B256, U256}; use reth::revm::database::StateProviderDatabase; use reth_errors::ProviderError; -use reth_evm::{Evm, EvmEnv}; +use reth_evm::EvmEnv; use reth_primitives::Receipt; use reth_provider::{StateProvider, StateProviderBox}; use revm::{ @@ -1243,17 +1243,14 @@ fn update_nonce_list_with_updates( /// /// Gas checks must be done before calling this methods /// thats why it can't return `TransactionErr::GasLeft` and `TransactionErr::BlobGasLeft` -fn execute_evm( - evm_factory: &Factory, +fn execute_evm( + evm_factory: &impl EvmFactory, evm_env: EvmEnv, tx_with_blobs: &TransactionSignedEcRecoveredWithBlobs, used_state_tracer: Option<&mut UsedStateTrace>, db: impl Database, blocklist: &HashSet
, -) -> Result, CriticalCommitOrderError> -where - Factory: EvmFactory, -{ +) -> Result, CriticalCommitOrderError> { let tx = tx_with_blobs.internal_tx_unsecure(); let mut rbuilder_inspector = RBuilderEVMInspector::new(tx, used_state_tracer); diff --git a/crates/rbuilder/src/building/payout_tx.rs b/crates/rbuilder/src/building/payout_tx.rs index 7785d099b..eec033116 100644 --- a/crates/rbuilder/src/building/payout_tx.rs +++ b/crates/rbuilder/src/building/payout_tx.rs @@ -1,10 +1,12 @@ -use super::{evm::EvmFactory, BlockBuildingContext, BlockState, ThreadBlockBuildingContext}; +use super::{ + evm::{Evm, EvmFactory}, + BlockBuildingContext, BlockState, ThreadBlockBuildingContext, +}; use crate::utils::Signer; use alloy_consensus::{constants::KECCAK_EMPTY, TxEip1559}; use alloy_primitives::{Address, TxKind as TransactionKind, U256}; use reth_chainspec::ChainSpec; use reth_errors::ProviderError; -use reth_evm::Evm; use reth_primitives::{Recovered, Transaction, TransactionSigned}; use revm::context::result::{EVMError, ExecutionResult}; @@ -70,11 +72,12 @@ pub fn insert_test_payout_tx( )?; let mut db = state.new_db_ref(&ctx.shared_cached_reads, &mut local_ctx.cached_reads); - let mut evm = ctx.evm_factory.create_evm(db.as_mut(), ctx.evm_env.clone()); + let cache_account = db.as_mut().load_cache_account(builder_signer.address)?; - let cache_account = evm.db_mut().load_cache_account(builder_signer.address)?; cache_account.increment_balance(tx_value * 2); // double to cover tx value and fee + let mut evm = ctx.evm_factory.create_evm(db.as_mut(), ctx.evm_env.clone()); + let res = evm.transact(&tx)?; match res.result { ExecutionResult::Success { diff --git a/crates/rbuilder/src/building/testing/evm_inspector_tests/setup.rs b/crates/rbuilder/src/building/testing/evm_inspector_tests/setup.rs index aea8d0d47..466dc0f02 100644 --- a/crates/rbuilder/src/building/testing/evm_inspector_tests/setup.rs +++ b/crates/rbuilder/src/building/testing/evm_inspector_tests/setup.rs @@ -1,12 +1,11 @@ use crate::building::{ cached_reads::LocalCachedReads, - evm::EvmFactory, + evm::{Evm, EvmFactory}, evm_inspector::{RBuilderEVMInspector, UsedStateTrace}, testing::test_chain_state::{BlockArgs, NamedAddr, TestChainState, TestContracts, TxArgs}, BlockState, }; use alloy_primitives::Address; -use reth_evm::Evm; use reth_primitives::{Recovered, TransactionSigned}; #[derive(Debug)]