From ae3d79c0cc9f6c12873cc622cb74e9c3d6ee2586 Mon Sep 17 00:00:00 2001 From: Thomas Coratger Date: Wed, 23 Oct 2024 15:51:29 +0200 Subject: [PATCH] tx-pool: mv ensure_intrinsic_gas impl to EthPoolTransaction trait --- crates/transaction-pool/src/traits.rs | 33 ++++++++++- crates/transaction-pool/src/validate/eth.rs | 65 ++++++++++----------- 2 files changed, 63 insertions(+), 35 deletions(-) diff --git a/crates/transaction-pool/src/traits.rs b/crates/transaction-pool/src/traits.rs index cedec56063ba..44c51a3bbe43 100644 --- a/crates/transaction-pool/src/traits.rs +++ b/crates/transaction-pool/src/traits.rs @@ -4,7 +4,7 @@ use crate::{ blobstore::BlobStoreError, error::{InvalidPoolTransactionError, PoolResult}, pool::{state::SubPool, BestTransactionFilter, TransactionEvents}, - validate::ValidPoolTransaction, + validate::{ForkTracker, ValidPoolTransaction}, AllTransactionsEvents, }; use alloy_consensus::{ @@ -21,6 +21,7 @@ use reth_primitives::{ BlobTransactionValidationError, PooledTransactionsElement, PooledTransactionsElementEcRecovered, SealedBlock, Transaction, TransactionSignedEcRecovered, }; +use revm::{interpreter::gas::validate_initial_tx_gas, primitives::SpecId}; #[cfg(feature = "serde")] use serde::{Deserialize, Serialize}; use std::{ @@ -1005,6 +1006,36 @@ pub trait EthPoolTransaction: /// Returns the number of authorizations this transaction has. fn authorization_count(&self) -> usize; + + /// Ensures that gas limit of the transaction exceeds the intrinsic gas of the transaction. + /// + /// Caution: This only checks past the Merge hardfork. + fn ensure_intrinsic_gas( + &self, + fork_tracker: &ForkTracker, + ) -> Result<(), InvalidPoolTransactionError> { + let spec_id = if fork_tracker.is_prague_activated() { + SpecId::PRAGUE + } else if fork_tracker.is_shanghai_activated() { + SpecId::SHANGHAI + } else { + SpecId::MERGE + }; + + let gas_after_merge = validate_initial_tx_gas( + spec_id, + self.input(), + self.kind().is_create(), + self.access_list().map(|list| list.0.as_slice()).unwrap_or(&[]), + self.authorization_count() as u64, + ); + + if self.gas_limit() < gas_after_merge { + Err(InvalidPoolTransactionError::IntrinsicGasTooLow) + } else { + Ok(()) + } + } } /// The default [`PoolTransaction`] for the [Pool](crate::Pool) for Ethereum. diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index bf7749fb85c3..45735c73c5e3 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -21,10 +21,7 @@ use reth_primitives::{ }; use reth_storage_api::{AccountReader, StateProviderFactory}; use reth_tasks::TaskSpawner; -use revm::{ - interpreter::gas::validate_initial_tx_gas, - primitives::{EnvKzgSettings, SpecId}, -}; +use revm::primitives::EnvKzgSettings; use std::{ marker::PhantomData, sync::{atomic::AtomicBool, Arc}, @@ -287,7 +284,7 @@ where } } - if let Err(err) = ensure_intrinsic_gas(&transaction, &self.fork_tracker) { + if let Err(err) = transaction.ensure_intrinsic_gas(&self.fork_tracker) { return TransactionValidationOutcome::Invalid(transaction, err) } @@ -783,35 +780,35 @@ impl ForkTracker { } } -/// Ensures that gas limit of the transaction exceeds the intrinsic gas of the transaction. -/// -/// Caution: This only checks past the Merge hardfork. -pub fn ensure_intrinsic_gas( - transaction: &T, - fork_tracker: &ForkTracker, -) -> Result<(), InvalidPoolTransactionError> { - let spec_id = if fork_tracker.is_prague_activated() { - SpecId::PRAGUE - } else if fork_tracker.is_shanghai_activated() { - SpecId::SHANGHAI - } else { - SpecId::MERGE - }; - - let gas_after_merge = validate_initial_tx_gas( - spec_id, - transaction.input(), - transaction.kind().is_create(), - transaction.access_list().map(|list| list.0.as_slice()).unwrap_or(&[]), - transaction.authorization_count() as u64, - ); - - if transaction.gas_limit() < gas_after_merge { - Err(InvalidPoolTransactionError::IntrinsicGasTooLow) - } else { - Ok(()) - } -} +// /// Ensures that gas limit of the transaction exceeds the intrinsic gas of the transaction. +// /// +// /// Caution: This only checks past the Merge hardfork. +// pub fn ensure_intrinsic_gas( +// transaction: &T, +// fork_tracker: &ForkTracker, +// ) -> Result<(), InvalidPoolTransactionError> { +// let spec_id = if fork_tracker.is_prague_activated() { +// SpecId::PRAGUE +// } else if fork_tracker.is_shanghai_activated() { +// SpecId::SHANGHAI +// } else { +// SpecId::MERGE +// }; + +// let gas_after_merge = validate_initial_tx_gas( +// spec_id, +// transaction.input(), +// transaction.kind().is_create(), +// transaction.access_list().map(|list| list.0.as_slice()).unwrap_or(&[]), +// transaction.authorization_count() as u64, +// ); + +// if transaction.gas_limit() < gas_after_merge { +// Err(InvalidPoolTransactionError::IntrinsicGasTooLow) +// } else { +// Ok(()) +// } +// } #[cfg(test)] mod tests {