From c8c771df2cd1543e77ad051799610823b4319ce8 Mon Sep 17 00:00:00 2001 From: Arsenii Kulikov Date: Thu, 30 Jan 2025 16:20:18 +0400 Subject: [PATCH] review fixes --- crates/engine/util/src/reorg.rs | 2 +- crates/evm/src/error.rs | 49 ++++++++++++++++++++++++++ crates/evm/src/lib.rs | 49 +++----------------------- crates/optimism/payload/src/builder.rs | 2 +- 4 files changed, 55 insertions(+), 47 deletions(-) create mode 100644 crates/evm/src/error.rs diff --git a/crates/engine/util/src/reorg.rs b/crates/engine/util/src/reorg.rs index 74e9fe5c2b6a..3120264f56b8 100644 --- a/crates/engine/util/src/reorg.rs +++ b/crates/engine/util/src/reorg.rs @@ -327,7 +327,7 @@ where let tx_env = evm_config.tx_env(&tx_recovered, tx_recovered.signer()); let exec_result = match evm.transact(tx_env) { Ok(result) => result, - Err(err) if err.as_invalid_tx_err().is_some() => { + Err(err) if err.is_invalid_tx_err() => { trace!(target: "engine::stream::reorg", hash = %tx.tx_hash(), ?err, "Error executing transaction from next block"); continue } diff --git a/crates/evm/src/error.rs b/crates/evm/src/error.rs new file mode 100644 index 000000000000..55dac3b577fa --- /dev/null +++ b/crates/evm/src/error.rs @@ -0,0 +1,49 @@ +use revm_primitives::{EVMError, InvalidTransaction}; + +/// Abstraction over transaction validation error. +pub trait InvalidTxError: core::error::Error + Send + Sync + 'static { + /// Returns whether the error cause by transaction having a nonce lower than expected. + fn is_nonce_too_low(&self) -> bool; +} + +impl InvalidTxError for InvalidTransaction { + fn is_nonce_too_low(&self) -> bool { + matches!(self, Self::NonceTooLow { .. }) + } +} + +/// Abstraction over errors that can occur during EVM execution. +/// +/// It's assumed that errors can occur either because of an invalid transaction, meaning that other +/// transaction might still result in successful execution, or because of a general EVM +/// misconfiguration. +/// +/// If caller occurs a error different from [`EvmError::InvalidTransaction`], it should most likely +/// be treated as fatal error flagging some EVM misconfiguration. +pub trait EvmError: core::error::Error + Send + Sync + 'static { + /// Errors which might occur as a result of an invalid transaction. i.e unrelated to general EVM + /// configuration. + type InvalidTransaction: InvalidTxError; + + /// Returns the [`EvmError::InvalidTransaction`] if the error is an invalid transaction error. + fn as_invalid_tx_err(&self) -> Option<&Self::InvalidTransaction>; + + /// Returns `true` if the error is an invalid transaction error. + fn is_invalid_tx_err(&self) -> bool { + self.as_invalid_tx_err().is_some() + } +} + +impl EvmError for EVMError +where + DBError: core::error::Error + Send + Sync + 'static, +{ + type InvalidTransaction = InvalidTransaction; + + fn as_invalid_tx_err(&self) -> Option<&Self::InvalidTransaction> { + match self { + Self::Transaction(err) => Some(err), + _ => None, + } + } +} diff --git a/crates/evm/src/lib.rs b/crates/evm/src/lib.rs index 001169f4fa91..f116e11b74f5 100644 --- a/crates/evm/src/lib.rs +++ b/crates/evm/src/lib.rs @@ -23,11 +23,14 @@ use alloy_primitives::{Address, Bytes, B256, U256}; use core::fmt::Debug; use reth_primitives_traits::{BlockHeader, SignedTransaction}; use revm::{DatabaseCommit, GetInspector}; -use revm_primitives::{BlockEnv, EVMError, InvalidTransaction, ResultAndState, TxEnv, TxKind}; +use revm_primitives::{BlockEnv, ResultAndState, TxEnv, TxKind}; pub mod either; /// EVM environment configuration. pub mod env; +/// EVM error types. +mod error; +pub use error::*; pub mod execute; pub use env::EvmEnv; @@ -82,50 +85,6 @@ pub trait Evm { Ok(result) } } - -/// Abstraction over transaction validation error. -pub trait InvalidTxError: core::error::Error + Send + Sync + 'static { - /// Returns whether the error cause by transaction having a nonce lower than expected. - fn is_nonce_too_low(&self) -> bool; -} - -impl InvalidTxError for InvalidTransaction { - fn is_nonce_too_low(&self) -> bool { - matches!(self, Self::NonceTooLow { .. }) - } -} - -/// Abstraction over errors that can occur during EVM execution. -/// -/// It's assumed that errors can occur either because of an invalid transaction, meaning that other -/// transaction might still result in successful execution, or because of a general EVM -/// misconfiguration. -/// -/// If caller occurs a error different from [`EvmError::InvalidTransaction`], it should most likely -/// be treated as fatal error flagging some EVM misconfiguration. -pub trait EvmError: core::error::Error + Send + Sync + 'static { - /// Errors which might occur as a result of an invalid transaction. i.e unrelated to general EVM - /// configuration. - type InvalidTransaction: InvalidTxError; - - /// Returns the [`EvmError::InvalidTransaction`] if the error is an invalid transaction error. - fn as_invalid_tx_err(&self) -> Option<&Self::InvalidTransaction>; -} - -impl EvmError for EVMError -where - DBError: core::error::Error + Send + Sync + 'static, -{ - type InvalidTransaction = InvalidTransaction; - - fn as_invalid_tx_err(&self) -> Option<&Self::InvalidTransaction> { - match self { - Self::Transaction(err) => Some(err), - _ => None, - } - } -} - /// Helper trait to bound [`revm::Database::Error`] with common requirements. pub trait Database: revm::Database {} impl Database for T where T: revm::Database {} diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index f7ae10276a3e..15a3501909ee 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -818,7 +818,7 @@ where let ResultAndState { result, state } = match evm.transact(tx_env) { Ok(res) => res, Err(err) => { - if err.as_invalid_tx_err().is_some() { + if err.is_invalid_tx_err() { trace!(target: "payload_builder", %err, ?sequencer_tx, "Error in sequencer transaction, skipping."); continue }