From 33ec89994eca862dba777b0546942334116fb8be Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Wed, 25 Mar 2026 09:28:56 +0100 Subject: [PATCH] feat(txpool): add TransactionValidationTaskExecutor::spawn (#23196) --- .changelog/warm-slugs-crawl.md | 5 ++++ crates/transaction-pool/src/validate/eth.rs | 24 ++------------------ crates/transaction-pool/src/validate/task.rs | 21 +++++++++++++++++ 3 files changed, 28 insertions(+), 22 deletions(-) create mode 100644 .changelog/warm-slugs-crawl.md diff --git a/.changelog/warm-slugs-crawl.md b/.changelog/warm-slugs-crawl.md new file mode 100644 index 0000000000..69f56e2f86 --- /dev/null +++ b/.changelog/warm-slugs-crawl.md @@ -0,0 +1,5 @@ +--- +reth-transaction-pool: minor +--- + +Added `TransactionValidationTaskExecutor::spawn` as a dedicated constructor that encapsulates spawning validation tasks on a runtime, and refactored `EthTransactionValidatorBuilder::build_with_tasks` to use it. diff --git a/crates/transaction-pool/src/validate/eth.rs b/crates/transaction-pool/src/validate/eth.rs index 20f657b830..be080340c9 100644 --- a/crates/transaction-pool/src/validate/eth.rs +++ b/crates/transaction-pool/src/validate/eth.rs @@ -8,7 +8,7 @@ use crate::{ }, metrics::TxPoolValidationMetrics, traits::TransactionOrigin, - validate::{ValidTransaction, ValidationTask}, + validate::ValidTransaction, Address, BlobTransactionSidecarVariant, EthBlobTransactionSidecar, EthPoolTransaction, LocalTransactionConfig, TransactionValidationOutcome, TransactionValidationTaskExecutor, TransactionValidator, @@ -44,7 +44,6 @@ use std::{ }, time::{Instant, SystemTime}, }; -use tokio::sync::Mutex; /// Additional stateless validation function signature. /// @@ -1324,26 +1323,7 @@ impl EthTransactionValidatorBuilder { { let additional_tasks = self.additional_tasks; let validator = self.build::(blob_store); - - let (tx, task) = ValidationTask::new(); - - // Spawn validation tasks, they are blocking because they perform db lookups - for _ in 0..additional_tasks { - let task = task.clone(); - tasks.spawn_blocking_task(async move { - task.run().await; - }); - } - - // we spawn them on critical tasks because validation, especially for EIP-4844 can be quite - // heavy - tasks.spawn_critical_blocking_task("transaction-validation-service", async move { - task.run().await; - }); - - let to_validation_task = Arc::new(Mutex::new(tx)); - - TransactionValidationTaskExecutor { validator: Arc::new(validator), to_validation_task } + TransactionValidationTaskExecutor::spawn(validator, &tasks, additional_tasks) } } diff --git a/crates/transaction-pool/src/validate/task.rs b/crates/transaction-pool/src/validate/task.rs index 9520f0bbf0..d03b136370 100644 --- a/crates/transaction-pool/src/validate/task.rs +++ b/crates/transaction-pool/src/validate/task.rs @@ -206,6 +206,27 @@ impl TransactionValidationTaskExecutor { task, ) } + + /// Creates a new executor and spawns the validation tasks on the given runtime. + /// + /// This spawns `additional_tasks` extra blocking tasks plus one critical blocking task + /// for the validation service. + pub fn spawn(validator: V, tasks: &Runtime, additional_tasks: usize) -> Self { + let (tx, task) = ValidationTask::new(); + + for _ in 0..additional_tasks { + let task = task.clone(); + tasks.spawn_blocking_task(async move { + task.run().await; + }); + } + + tasks.spawn_critical_blocking_task("transaction-validation-service", async move { + task.run().await; + }); + + Self { validator: Arc::new(validator), to_validation_task: Arc::new(sync::Mutex::new(tx)) } + } } impl TransactionValidator for TransactionValidationTaskExecutor