diff --git a/crates/ethereum/node/src/node.rs b/crates/ethereum/node/src/node.rs index 95ff807253..da93390154 100644 --- a/crates/ethereum/node/src/node.rs +++ b/crates/ethereum/node/src/node.rs @@ -18,7 +18,7 @@ use reth_evm::{ }; use reth_network::{primitives::BasicNetworkPrimitives, NetworkHandle, PeersInfo}; use reth_node_api::{ - AddOnsContext, FullNodeComponents, HeaderTy, NodeAddOns, NodePrimitives, + AddOnsContext, BlockTy, FullNodeComponents, HeaderTy, NodeAddOns, NodePrimitives, PayloadAttributesBuilder, PrimitivesTy, TxTy, }; use reth_node_builder::{ @@ -53,8 +53,8 @@ use reth_rpc_eth_types::{error::FromEvmError, EthApiError}; use reth_rpc_server_types::RethRpcModule; use reth_tracing::tracing::{debug, info}; use reth_transaction_pool::{ - blobstore::DiskFileBlobStore, EthTransactionPool, PoolPooledTx, PoolTransaction, - TransactionPool, TransactionValidationTaskExecutor, + blobstore::DiskFileBlobStore, EthPooledTransaction, EthTransactionPool, PoolPooledTx, + PoolTransaction, TransactionPool, TransactionValidationTaskExecutor, }; use revm::context::TxEnv; use std::{marker::PhantomData, sync::Arc, time::SystemTime}; @@ -464,7 +464,8 @@ where >, Node: FullNodeTypes, { - type Pool = EthTransactionPool; + type Pool = + EthTransactionPool>; async fn build_pool(self, ctx: &BuilderContext) -> eyre::Result { let pool_config = ctx.pool_config(); diff --git a/crates/node/builder/src/components/pool.rs b/crates/node/builder/src/components/pool.rs index bb88c54b9f..9f32b27915 100644 --- a/crates/node/builder/src/components/pool.rs +++ b/crates/node/builder/src/components/pool.rs @@ -4,7 +4,7 @@ use crate::{BuilderContext, FullNodeTypes}; use alloy_primitives::Address; use reth_chain_state::CanonStateSubscriptions; use reth_chainspec::EthereumHardforks; -use reth_node_api::{NodeTypes, TxTy}; +use reth_node_api::{BlockTy, NodeTypes, TxTy}; use reth_transaction_pool::{ blobstore::DiskFileBlobStore, BlobStore, CoinbaseTipOrdering, PoolConfig, PoolTransaction, SubPoolLimit, TransactionPool, TransactionValidationTaskExecutor, TransactionValidator, @@ -129,7 +129,7 @@ impl<'a, Node: FullNodeTypes, V> TxPoolBuilder<'a, Node, V> { impl<'a, Node, V> TxPoolBuilder<'a, Node, TransactionValidationTaskExecutor> where Node: FullNodeTypes>, - V: TransactionValidator + 'static, + V: TransactionValidator> + 'static, V::Transaction: PoolTransaction> + reth_transaction_pool::EthPoolTransaction, { @@ -248,7 +248,7 @@ fn spawn_pool_maintenance_task( ) -> eyre::Result<()> where Node: FullNodeTypes>, - Pool: reth_transaction_pool::TransactionPoolExt + Clone + 'static, + Pool: reth_transaction_pool::TransactionPoolExt> + Clone + 'static, Pool::Transaction: PoolTransaction>, { let chain_events = ctx.provider().canonical_state_stream(); @@ -280,7 +280,7 @@ pub fn spawn_maintenance_tasks( ) -> eyre::Result<()> where Node: FullNodeTypes>, - Pool: reth_transaction_pool::TransactionPoolExt + Clone + 'static, + Pool: reth_transaction_pool::TransactionPoolExt> + Clone + 'static, Pool::Transaction: PoolTransaction>, { spawn_local_backup_task(ctx, pool.clone())?; diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs index dd68ab8a8e..6ee024ace9 100644 --- a/crates/optimism/node/src/node.rs +++ b/crates/optimism/node/src/node.rs @@ -16,7 +16,7 @@ use reth_network::{ PeersInfo, }; use reth_node_api::{ - AddOnsContext, BuildNextEnv, EngineTypes, FullNodeComponents, HeaderTy, NodeAddOns, + AddOnsContext, BlockTy, BuildNextEnv, EngineTypes, FullNodeComponents, HeaderTy, NodeAddOns, NodePrimitives, PayloadAttributesBuilder, PayloadTypes, PrimitivesTy, TxTy, }; use reth_node_builder::{ @@ -962,7 +962,7 @@ where Node: FullNodeTypes>, T: EthPoolTransaction> + OpPooledTx, { - type Pool = OpTransactionPool; + type Pool = OpTransactionPool>; async fn build_pool(self, ctx: &BuilderContext) -> eyre::Result { let Self { pool_config_overrides, .. } = self; diff --git a/crates/optimism/txpool/src/lib.rs b/crates/optimism/txpool/src/lib.rs index 43421ed3b3..b2c240abe1 100644 --- a/crates/optimism/txpool/src/lib.rs +++ b/crates/optimism/txpool/src/lib.rs @@ -9,6 +9,7 @@ #![cfg_attr(docsrs, feature(doc_cfg))] mod validator; +use op_alloy_consensus::OpBlock; pub use validator::{OpL1BlockInfo, OpTransactionValidator}; pub mod conditional; @@ -24,8 +25,8 @@ pub mod estimated_da_size; use reth_transaction_pool::{CoinbaseTipOrdering, Pool, TransactionValidationTaskExecutor}; /// Type alias for default optimism transaction pool -pub type OpTransactionPool = Pool< - TransactionValidationTaskExecutor>, +pub type OpTransactionPool = Pool< + TransactionValidationTaskExecutor>, CoinbaseTipOrdering, S, >; diff --git a/crates/optimism/txpool/src/transaction.rs b/crates/optimism/txpool/src/transaction.rs index 6cbc645fe5..fa2ec80e4d 100644 --- a/crates/optimism/txpool/src/transaction.rs +++ b/crates/optimism/txpool/src/transaction.rs @@ -325,10 +325,11 @@ mod tests { #[tokio::test] async fn validate_optimism_transaction() { let client = MockEthProvider::default().with_chain_spec(OP_MAINNET.clone()); - let validator = EthTransactionValidatorBuilder::new(client) - .no_shanghai() - .no_cancun() - .build(InMemoryBlobStore::default()); + let validator = + EthTransactionValidatorBuilder::new(client) + .no_shanghai() + .no_cancun() + .build::<_, _, reth_optimism_primitives::OpBlock>(InMemoryBlobStore::default()); let validator = OpTransactionValidator::new(validator); let origin = TransactionOrigin::External; diff --git a/crates/optimism/txpool/src/validator.rs b/crates/optimism/txpool/src/validator.rs index 8a715fc47c..900a005d85 100644 --- a/crates/optimism/txpool/src/validator.rs +++ b/crates/optimism/txpool/src/validator.rs @@ -1,5 +1,6 @@ use crate::{supervisor::SupervisorClient, InvalidCrossTx, OpPooledTx}; use alloy_consensus::{BlockHeader, Transaction}; +use op_alloy_consensus::OpBlock; use op_revm::L1BlockInfo; use parking_lot::RwLock; use reth_chainspec::ChainSpecProvider; @@ -39,9 +40,9 @@ impl OpL1BlockInfo { /// Validator for Optimism transactions. #[derive(Debug, Clone)] -pub struct OpTransactionValidator { +pub struct OpTransactionValidator { /// The type that performs the actual validation. - inner: Arc>, + inner: Arc>, /// Additional block info required for validation. block_info: Arc, /// If true, ensure that the transaction's sender has enough balance to cover the L1 gas fee @@ -54,7 +55,7 @@ pub struct OpTransactionValidator { fork_tracker: Arc, } -impl OpTransactionValidator { +impl OpTransactionValidator { /// Returns the configured chain spec pub fn chain_spec(&self) -> Arc where @@ -86,14 +87,15 @@ impl OpTransactionValidator { } } -impl OpTransactionValidator +impl OpTransactionValidator where Client: ChainSpecProvider + StateProviderFactory + BlockReaderIdExt + Sync, Tx: EthPoolTransaction + OpPooledTx, + B: Block, { /// Create a new [`OpTransactionValidator`]. - pub fn new(inner: EthTransactionValidator) -> Self { + pub fn new(inner: EthTransactionValidator) -> Self { let this = Self::with_block_info(inner, OpL1BlockInfo::default()); if let Ok(Some(block)) = this.inner.client().block_by_number_or_tag(alloy_eips::BlockNumberOrTag::Latest) @@ -112,7 +114,7 @@ where /// Create a new [`OpTransactionValidator`] with the given [`OpL1BlockInfo`]. pub fn with_block_info( - inner: EthTransactionValidator, + inner: EthTransactionValidator, block_info: OpL1BlockInfo, ) -> Self { Self { @@ -288,13 +290,15 @@ where } } -impl TransactionValidator for OpTransactionValidator +impl TransactionValidator for OpTransactionValidator where Client: ChainSpecProvider + StateProviderFactory + BlockReaderIdExt + Sync, Tx: EthPoolTransaction + OpPooledTx, + B: Block, { type Transaction = Tx; + type Block = B; async fn validate_transaction( &self, @@ -325,10 +329,7 @@ where .await } - fn on_new_head_block(&self, new_tip_block: &SealedBlock) - where - B: Block, - { + fn on_new_head_block(&self, new_tip_block: &SealedBlock) { self.inner.on_new_head_block(new_tip_block); self.update_l1_block_info( new_tip_block.header(), diff --git a/crates/transaction-pool/src/lib.rs b/crates/transaction-pool/src/lib.rs index 1dca5c33d0..7fbdda5f29 100644 --- a/crates/transaction-pool/src/lib.rs +++ b/crates/transaction-pool/src/lib.rs @@ -303,7 +303,7 @@ use aquamarine as _; use reth_chainspec::{ChainSpecProvider, EthereumHardforks}; use reth_eth_wire_types::HandleMempoolData; use reth_execution_types::ChangedAccount; -use reth_primitives_traits::{Block, Recovered}; +use reth_primitives_traits::Recovered; use reth_storage_api::StateProviderFactory; use std::{collections::HashSet, sync::Arc}; use tokio::sync::mpsc::Receiver; @@ -328,8 +328,13 @@ mod traits; pub mod test_utils; /// Type alias for default ethereum transaction pool -pub type EthTransactionPool = Pool< - TransactionValidationTaskExecutor>, +pub type EthTransactionPool< + Client, + S, + T = EthPooledTransaction, + B = reth_ethereum_primitives::Block, +> = Pool< + TransactionValidationTaskExecutor>, CoinbaseTipOrdering, S, >; @@ -776,16 +781,15 @@ where T: TransactionOrdering::Transaction>, S: BlobStore, { + type Block = V::Block; + #[instrument(skip(self), target = "txpool")] fn set_block_info(&self, info: BlockInfo) { trace!(target: "txpool", "updating pool block info"); self.pool.set_block_info(info) } - fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, B>) - where - B: Block, - { + fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, Self::Block>) { self.pool.on_canonical_state_change(update); } diff --git a/crates/transaction-pool/src/maintain.rs b/crates/transaction-pool/src/maintain.rs index c58a5151da..ca4546e789 100644 --- a/crates/transaction-pool/src/maintain.rs +++ b/crates/transaction-pool/src/maintain.rs @@ -107,7 +107,8 @@ where + ChainSpecProvider + EthereumHardforks> + Clone + 'static, - P: TransactionPoolExt> + 'static, + P: TransactionPoolExt, Block = N::Block> + + 'static, St: Stream> + Send + Unpin + 'static, Tasks: TaskSpawner + Clone + 'static, { @@ -133,7 +134,8 @@ pub async fn maintain_transaction_pool( + ChainSpecProvider + EthereumHardforks> + Clone + 'static, - P: TransactionPoolExt> + 'static, + P: TransactionPoolExt, Block = N::Block> + + 'static, St: Stream> + Send + Unpin + 'static, Tasks: TaskSpawner + Clone + 'static, { @@ -855,7 +857,8 @@ mod tests { use super::*; use crate::{ blobstore::InMemoryBlobStore, validate::EthTransactionValidatorBuilder, - CoinbaseTipOrdering, EthPooledTransaction, Pool, TransactionOrigin, + CoinbaseTipOrdering, EthPooledTransaction, EthTransactionValidator, Pool, + TransactionOrigin, }; use alloy_eips::eip2718::Decodable2718; use alloy_primitives::{hex, U256}; @@ -889,7 +892,8 @@ mod tests { let sender = hex!("1f9090aaE28b8a3dCeaDf281B0F12828e676c326").into(); provider.add_account(sender, ExtendedAccount::new(42, U256::MAX)); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider).build(blob_store.clone()); + let validator: EthTransactionValidator<_, _, reth_ethereum_primitives::Block> = + EthTransactionValidatorBuilder::new(provider).build(blob_store.clone()); let txpool = Pool::new( validator, diff --git a/crates/transaction-pool/src/noop.rs b/crates/transaction-pool/src/noop.rs index 8dabdbbbfa..ac37d896ff 100644 --- a/crates/transaction-pool/src/noop.rs +++ b/crates/transaction-pool/src/noop.rs @@ -373,6 +373,7 @@ pub struct MockTransactionValidator { impl TransactionValidator for MockTransactionValidator { type Transaction = T; + type Block = reth_ethereum_primitives::Block; async fn validate_transaction( &self, diff --git a/crates/transaction-pool/src/pool/mod.rs b/crates/transaction-pool/src/pool/mod.rs index 27c63ed8ac..07f5085a00 100644 --- a/crates/transaction-pool/src/pool/mod.rs +++ b/crates/transaction-pool/src/pool/mod.rs @@ -114,7 +114,6 @@ pub use events::{FullTransactionEvent, NewTransactionEvent, TransactionEvent}; pub use listener::{AllTransactionsEvents, TransactionEvents, TransactionListenerKind}; pub use parked::{BasefeeOrd, ParkedOrd, ParkedPool, QueuedOrd}; pub use pending::PendingPool; -use reth_primitives_traits::Block; mod best; pub use best::BestTransactions; @@ -504,10 +503,7 @@ where } /// Updates the entire pool after a new block was executed. - pub fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, B>) - where - B: Block, - { + pub fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, V::Block>) { trace!(target: "txpool", ?update, "updating pool on canonical state change"); let block_info = update.block_info(); diff --git a/crates/transaction-pool/src/test_utils/okvalidator.rs b/crates/transaction-pool/src/test_utils/okvalidator.rs index fc15dce74e..27959a30e4 100644 --- a/crates/transaction-pool/src/test_utils/okvalidator.rs +++ b/crates/transaction-pool/src/test_utils/okvalidator.rs @@ -4,6 +4,7 @@ use crate::{ validate::ValidTransaction, EthPooledTransaction, PoolTransaction, TransactionOrigin, TransactionValidationOutcome, TransactionValidator, }; +use reth_ethereum_primitives::Block; /// A transaction validator that determines all transactions to be valid. #[derive(Debug)] @@ -33,6 +34,7 @@ where T: PoolTransaction, { type Transaction = T; + type Block = Block; async fn validate_transaction( &self, diff --git a/crates/transaction-pool/src/traits.rs b/crates/transaction-pool/src/traits.rs index f70e74f783..24acfcac2d 100644 --- a/crates/transaction-pool/src/traits.rs +++ b/crates/transaction-pool/src/traits.rs @@ -667,6 +667,9 @@ pub trait TransactionPool: Clone + Debug + Send + Sync { /// Extension for [`TransactionPool`] trait that allows to set the current block info. #[auto_impl::auto_impl(&, Arc)] pub trait TransactionPoolExt: TransactionPool { + /// The block type used for chain tip updates. + type Block: Block; + /// Sets the current block info for the pool. fn set_block_info(&self, info: BlockInfo); @@ -685,9 +688,7 @@ pub trait TransactionPoolExt: TransactionPool { /// sidecar must not be removed from the blob store. Only after a blob transaction is /// finalized, its sidecar is removed from the blob store. This ensures that in case of a reorg, /// the sidecar is still available. - fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, B>) - where - B: Block; + fn on_canonical_state_change(&self, update: CanonicalStateUpdate<'_, Self::Block>); /// Updates the accounts in the pool fn update_accounts(&self, accounts: Vec); diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index da3e8680e5..1775387c68 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -28,7 +28,7 @@ use alloy_eips::{ use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks}; use reth_primitives_traits::{ constants::MAX_TX_GAS_LIMIT_OSAKA, transaction::error::InvalidTransactionError, Account, Block, - GotExpected, SealedBlock, + GotExpected, }; use reth_storage_api::{AccountInfoReader, BytecodeReader, StateProviderFactory}; use reth_tasks::TaskSpawner; @@ -58,7 +58,7 @@ use tokio::sync::Mutex; /// /// And adheres to the configured [`LocalTransactionConfig`]. #[derive(Debug)] -pub struct EthTransactionValidator { +pub struct EthTransactionValidator { /// This type fetches account info from the db client: Client, /// Blobstore used for fetching re-injected blob transactions. @@ -90,14 +90,14 @@ pub struct EthTransactionValidator { /// Disable balance checks during transaction validation disable_balance_check: bool, /// Marker for the transaction type - _marker: PhantomData, + _marker: PhantomData<(T, B)>, /// Metrics for tsx pool validation validation_metrics: TxPoolValidationMetrics, /// Bitmap of custom transaction types that are allowed. other_tx_types: U256, } -impl EthTransactionValidator { +impl EthTransactionValidator { /// Returns the configured chain spec pub fn chain_spec(&self) -> Arc where @@ -176,7 +176,7 @@ impl EthTransactionValidator { } } -impl EthTransactionValidator +impl EthTransactionValidator where Client: ChainSpecProvider + StateProviderFactory, Tx: EthPoolTransaction, @@ -799,12 +799,14 @@ where } } -impl TransactionValidator for EthTransactionValidator +impl TransactionValidator for EthTransactionValidator where Client: ChainSpecProvider + StateProviderFactory, Tx: EthPoolTransaction, + B: Block, { type Transaction = Tx; + type Block = B; async fn validate_transaction( &self, @@ -829,11 +831,8 @@ where self.validate_batch_with_origin(origin, transactions) } - fn on_new_head_block(&self, new_tip_block: &SealedBlock) - where - B: Block, - { - self.on_new_head_block(new_tip_block.header()) + fn on_new_head_block(&self, new_tip_block: &reth_primitives_traits::SealedBlock) { + Self::on_new_head_block(self, new_tip_block.header()) } } @@ -1105,9 +1104,10 @@ impl EthTransactionValidatorBuilder { } /// Builds a the [`EthTransactionValidator`] without spawning validator tasks. - pub fn build(self, blob_store: S) -> EthTransactionValidator + pub fn build(self, blob_store: S) -> EthTransactionValidator where S: BlobStore, + B: Block, { let Self { client, @@ -1170,17 +1170,18 @@ impl EthTransactionValidatorBuilder { /// The validator will spawn `additional_tasks` additional tasks for validation. /// /// By default this will spawn 1 additional task. - pub fn build_with_tasks( + pub fn build_with_tasks( self, tasks: T, blob_store: S, - ) -> TransactionValidationTaskExecutor> + ) -> TransactionValidationTaskExecutor> where T: TaskSpawner, S: BlobStore, + B: Block, { let additional_tasks = self.additional_tasks; - let validator = self.build(blob_store); + let validator = self.build::(blob_store); let (tx, task) = ValidationTask::new(); @@ -1341,7 +1342,8 @@ mod tests { ExtendedAccount::new(transaction.nonce(), U256::MAX), ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider).build(blob_store.clone()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider).build(blob_store.clone()); let outcome = validator.validate_one(TransactionOrigin::External, transaction.clone()); @@ -1368,9 +1370,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .set_block_gas_limit(1_000_000) // tx gas limit is 1_015_288 - .build(blob_store.clone()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .set_block_gas_limit(1_000_000) // tx gas limit is 1_015_288 + .build(blob_store.clone()); let outcome = validator.validate_one(TransactionOrigin::External, transaction.clone()); @@ -1401,9 +1404,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .set_tx_fee_cap(100) // 100 wei cap - .build(blob_store.clone()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .set_tx_fee_cap(100) // 100 wei cap + .build(blob_store.clone()); let outcome = validator.validate_one(TransactionOrigin::Local, transaction.clone()); assert!(outcome.is_invalid()); @@ -1438,9 +1442,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .set_tx_fee_cap(0) // no cap - .build(blob_store); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .set_tx_fee_cap(0) // no cap + .build(blob_store); let outcome = validator.validate_one(TransactionOrigin::Local, transaction); assert!(outcome.is_valid()); @@ -1456,9 +1461,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .set_tx_fee_cap(2e18 as u128) // 2 ETH cap - .build(blob_store); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .set_tx_fee_cap(2e18 as u128) // 2 ETH cap + .build(blob_store); let outcome = validator.validate_one(TransactionOrigin::Local, transaction); assert!(outcome.is_valid()); @@ -1474,9 +1480,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .with_max_tx_gas_limit(Some(500_000)) // Set limit lower than transaction gas limit (1_015_288) - .build(blob_store.clone()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .with_max_tx_gas_limit(Some(500_000)) // Set limit lower than transaction gas limit (1_015_288) + .build(blob_store.clone()); let outcome = validator.validate_one(TransactionOrigin::External, transaction.clone()); assert!(outcome.is_invalid()); @@ -1506,9 +1513,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .with_max_tx_gas_limit(None) // disabled - .build(blob_store); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .with_max_tx_gas_limit(None) // disabled + .build(blob_store); let outcome = validator.validate_one(TransactionOrigin::External, transaction); assert!(outcome.is_valid()); @@ -1524,9 +1532,10 @@ mod tests { ); let blob_store = InMemoryBlobStore::default(); - let validator = EthTransactionValidatorBuilder::new(provider) - .with_max_tx_gas_limit(Some(2_000_000)) // Set limit higher than transaction gas limit (1_015_288) - .build(blob_store); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .with_max_tx_gas_limit(Some(2_000_000)) // Set limit higher than transaction gas limit (1_015_288) + .build(blob_store); let outcome = validator.validate_one(TransactionOrigin::External, transaction); assert!(outcome.is_valid()); @@ -1727,8 +1736,9 @@ mod tests { ); // Validate with balance check enabled - let validator = EthTransactionValidatorBuilder::new(provider.clone()) - .build(InMemoryBlobStore::default()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider.clone()) + .build(InMemoryBlobStore::default()); let outcome = validator.validate_one(TransactionOrigin::External, transaction.clone()); let expected_cost = *transaction.cost(); @@ -1743,9 +1753,10 @@ mod tests { } // Validate with balance check disabled - let validator = EthTransactionValidatorBuilder::new(provider) - .disable_balance_check() // This should allow the transaction through despite zero balance - .build(InMemoryBlobStore::default()); + let validator: EthTransactionValidator<_, _> = + EthTransactionValidatorBuilder::new(provider) + .disable_balance_check() + .build(InMemoryBlobStore::default()); let outcome = validator.validate_one(TransactionOrigin::External, transaction); assert!(outcome.is_valid()); // Should be valid because balance check is disabled diff --git a/crates/transaction-pool/src/validate/mod.rs b/crates/transaction-pool/src/validate/mod.rs index 59e187dd1c..d3ec6b3616 100644 --- a/crates/transaction-pool/src/validate/mod.rs +++ b/crates/transaction-pool/src/validate/mod.rs @@ -9,7 +9,7 @@ use crate::{ use alloy_eips::{eip7594::BlobTransactionSidecarVariant, eip7702::SignedAuthorization}; use alloy_primitives::{Address, TxHash, B256, U256}; use futures_util::future::Either; -use reth_primitives_traits::{Recovered, SealedBlock}; +use reth_primitives_traits::{Block, Recovered, SealedBlock}; use std::{fmt, fmt::Debug, future::Future, time::Instant}; mod constants; @@ -24,7 +24,6 @@ pub use task::{TransactionValidationTaskExecutor, ValidationTask}; pub use constants::{ DEFAULT_MAX_TX_INPUT_BYTES, MAX_CODE_BYTE_SIZE, MAX_INIT_CODE_BYTE_SIZE, TX_SLOT_BYTE_SIZE, }; -use reth_primitives_traits::Block; /// A Result type returned after checking a transaction's validity. #[derive(Debug)] @@ -174,6 +173,9 @@ pub trait TransactionValidator: Debug + Send + Sync { /// The transaction type to validate. type Transaction: PoolTransaction; + /// The block type used for new head block notifications. + type Block: Block; + /// Validates the transaction and returns a [`TransactionValidationOutcome`] describing the /// validity of the given transaction. /// @@ -236,19 +238,16 @@ pub trait TransactionValidator: Debug + Send + Sync { /// Invoked when the head block changes. /// /// This can be used to update fork specific values (timestamp). - fn on_new_head_block(&self, _new_tip_block: &SealedBlock) - where - B: Block, - { - } + fn on_new_head_block(&self, _new_tip_block: &SealedBlock) {} } impl TransactionValidator for Either where A: TransactionValidator, - B: TransactionValidator, + B: TransactionValidator, { type Transaction = A::Transaction; + type Block = A::Block; async fn validate_transaction( &self, @@ -282,10 +281,7 @@ where } } - fn on_new_head_block(&self, new_tip_block: &SealedBlock) - where - Bl: Block, - { + fn on_new_head_block(&self, new_tip_block: &SealedBlock) { match self { Self::Left(v) => v.on_new_head_block(new_tip_block), Self::Right(v) => v.on_new_head_block(new_tip_block), diff --git a/crates/transaction-pool/src/validate/task.rs b/crates/transaction-pool/src/validate/task.rs index 0959d5b3fd..39ae41bc3d 100644 --- a/crates/transaction-pool/src/validate/task.rs +++ b/crates/transaction-pool/src/validate/task.rs @@ -8,7 +8,7 @@ use crate::{ TransactionValidator, }; use futures_util::{lock::Mutex, StreamExt}; -use reth_primitives_traits::{Block, SealedBlock}; +use reth_primitives_traits::SealedBlock; use reth_tasks::TaskSpawner; use std::{future::Future, pin::Pin, sync::Arc}; use tokio::{ @@ -171,7 +171,7 @@ impl TransactionValidationTaskExecutor(tasks, blob_store) + .build_with_tasks(tasks, blob_store) } } @@ -197,6 +197,7 @@ where V: TransactionValidator + 'static, { type Transaction = ::Transaction; + type Block = V::Block; async fn validate_transaction( &self, @@ -284,10 +285,7 @@ where self.validate_transactions(transactions.into_iter().map(|tx| (origin, tx)).collect()).await } - fn on_new_head_block(&self, new_tip_block: &SealedBlock) - where - B: Block, - { + fn on_new_head_block(&self, new_tip_block: &SealedBlock) { self.validator.on_new_head_block(new_tip_block) } } @@ -307,6 +305,7 @@ mod tests { impl TransactionValidator for NoopValidator { type Transaction = MockTransaction; + type Block = reth_ethereum_primitives::Block; async fn validate_transaction( &self, diff --git a/examples/custom-node-components/src/main.rs b/examples/custom-node-components/src/main.rs index b6b8fb3cdf..2150118173 100644 --- a/examples/custom-node-components/src/main.rs +++ b/examples/custom-node-components/src/main.rs @@ -6,14 +6,14 @@ use reth_ethereum::{ chainspec::ChainSpec, cli::interface::Cli, node::{ - api::{FullNodeTypes, NodeTypes}, + api::{BlockTy, FullNodeTypes, NodeTypes}, builder::{components::PoolBuilder, BuilderContext}, node::EthereumAddOns, EthereumNode, }, pool::{ - blobstore::InMemoryBlobStore, EthTransactionPool, PoolConfig, - TransactionValidationTaskExecutor, + blobstore::InMemoryBlobStore, CoinbaseTipOrdering, EthPooledTransaction, + EthTransactionPool, Pool, PoolConfig, TransactionValidationTaskExecutor, }, provider::CanonStateSubscriptions, EthPrimitives, @@ -53,7 +53,12 @@ impl PoolBuilder for CustomPoolBuilder where Node: FullNodeTypes>, { - type Pool = EthTransactionPool; + type Pool = EthTransactionPool< + Node::Provider, + InMemoryBlobStore, + EthPooledTransaction, + BlockTy, + >; async fn build_pool(self, ctx: &BuilderContext) -> eyre::Result { let data_dir = ctx.config().datadir(); @@ -62,10 +67,13 @@ where .with_head_timestamp(ctx.head().timestamp) .kzg_settings(ctx.kzg_settings()?) .with_additional_tasks(ctx.config().txpool.additional_validation_tasks) - .build_with_tasks(ctx.task_executor().clone(), blob_store.clone()); + .build_with_tasks::<_, _, _, BlockTy>( + ctx.task_executor().clone(), + blob_store.clone(), + ); let transaction_pool = - reth_ethereum::pool::Pool::eth_pool(validator, blob_store, self.pool_config); + Pool::new(validator, CoinbaseTipOrdering::default(), blob_store, self.pool_config); info!(target: "reth::cli", "Transaction pool initialized"); let transactions_path = data_dir.txpool_transactions();