mirror of
https://github.com/paradigmxyz/reth.git
synced 2026-01-29 09:08:05 -05:00
feat(bin/args): enhance transactionpool with --txpool.nolocals Flag (#5538)
Co-authored-by: Matthias Seitz <matthias.seitz@outlook.de>
This commit is contained in:
committed by
GitHub
parent
8e6fb6b5d1
commit
8667c336a1
@@ -2,9 +2,9 @@
|
||||
|
||||
use clap::Args;
|
||||
use reth_transaction_pool::{
|
||||
PoolConfig, PriceBumpConfig, SubPoolLimit, DEFAULT_PRICE_BUMP, REPLACE_BLOB_PRICE_BUMP,
|
||||
TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER, TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
|
||||
TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
|
||||
LocalTransactionConfig, PoolConfig, PriceBumpConfig, SubPoolLimit, DEFAULT_PRICE_BUMP,
|
||||
REPLACE_BLOB_PRICE_BUMP, TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
|
||||
TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT, TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
|
||||
};
|
||||
|
||||
/// Parameters for debugging purposes
|
||||
@@ -43,12 +43,16 @@ pub struct TxPoolArgs {
|
||||
/// Price bump percentage to replace an already existing blob transaction
|
||||
#[arg(long = "blobpool.pricebump", default_value_t = REPLACE_BLOB_PRICE_BUMP)]
|
||||
pub blob_transaction_price_bump: u128,
|
||||
/// Flag to disable local transaction exemptions.
|
||||
#[arg(long = "txpool.nolocals")]
|
||||
pub no_locals: bool,
|
||||
}
|
||||
|
||||
impl TxPoolArgs {
|
||||
/// Returns transaction pool configuration.
|
||||
pub fn pool_config(&self) -> PoolConfig {
|
||||
PoolConfig {
|
||||
local_transactions_config: LocalTransactionConfig { no_exemptions: self.no_locals },
|
||||
pending_limit: SubPoolLimit {
|
||||
max_txs: self.pending_max_count,
|
||||
max_size: self.pending_max_size * 1024 * 1024,
|
||||
|
||||
@@ -30,6 +30,9 @@ pub struct PoolConfig {
|
||||
pub max_account_slots: usize,
|
||||
/// Price bump (in %) for the transaction pool underpriced check.
|
||||
pub price_bumps: PriceBumpConfig,
|
||||
/// How to handle locally received transactions:
|
||||
/// [TransactionOrigin::Local](crate::TransactionOrigin).
|
||||
pub local_transactions_config: LocalTransactionConfig,
|
||||
}
|
||||
|
||||
impl Default for PoolConfig {
|
||||
@@ -40,6 +43,7 @@ impl Default for PoolConfig {
|
||||
queued_limit: Default::default(),
|
||||
max_account_slots: TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
|
||||
price_bumps: Default::default(),
|
||||
local_transactions_config: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -99,3 +103,24 @@ impl Default for PriceBumpConfig {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Configuration options for the locally received transactions:
|
||||
/// [TransactionOrigin::Local](crate::TransactionOrigin)
|
||||
#[derive(Debug, Clone, Eq, PartialEq, Default)]
|
||||
pub struct LocalTransactionConfig {
|
||||
/// Apply no exemptions to the locally received transactions.
|
||||
///
|
||||
/// This includes:
|
||||
/// - available slots are limited to the configured `max_account_slots` of [PoolConfig]
|
||||
/// - no price exemptions
|
||||
/// - no eviction exemptions
|
||||
pub no_exemptions: bool,
|
||||
}
|
||||
|
||||
impl LocalTransactionConfig {
|
||||
/// Returns whether local transactions are not exempt from the configured limits.
|
||||
#[inline]
|
||||
pub fn no_local_exemptions(&self) -> bool {
|
||||
self.no_exemptions
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,9 +155,9 @@ use tracing::{instrument, trace};
|
||||
pub use crate::{
|
||||
blobstore::{BlobStore, BlobStoreError},
|
||||
config::{
|
||||
PoolConfig, PriceBumpConfig, SubPoolLimit, DEFAULT_PRICE_BUMP, REPLACE_BLOB_PRICE_BUMP,
|
||||
TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER, TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT,
|
||||
TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
|
||||
LocalTransactionConfig, PoolConfig, PriceBumpConfig, SubPoolLimit, DEFAULT_PRICE_BUMP,
|
||||
REPLACE_BLOB_PRICE_BUMP, TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
|
||||
TXPOOL_SUBPOOL_MAX_SIZE_MB_DEFAULT, TXPOOL_SUBPOOL_MAX_TXS_DEFAULT,
|
||||
},
|
||||
error::PoolResult,
|
||||
ordering::{CoinbaseTipOrdering, Priority, TransactionOrdering},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//! The internal transaction pool implementation.
|
||||
use crate::{
|
||||
config::TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER,
|
||||
config::{LocalTransactionConfig, TXPOOL_MAX_ACCOUNT_SLOTS_PER_SENDER},
|
||||
error::{Eip4844PoolTransactionError, InvalidPoolTransactionError, PoolError, PoolErrorKind},
|
||||
identifier::{SenderId, TransactionId},
|
||||
metrics::TxPoolMetrics,
|
||||
@@ -918,6 +918,8 @@ pub(crate) struct AllTransactions<T: PoolTransaction> {
|
||||
pending_fees: PendingFees,
|
||||
/// Configured price bump settings for replacements
|
||||
price_bumps: PriceBumpConfig,
|
||||
/// How to handle [TransactionOrigin::Local](crate::TransactionOrigin) transactions.
|
||||
local_transactions_config: LocalTransactionConfig,
|
||||
}
|
||||
|
||||
impl<T: PoolTransaction> AllTransactions<T> {
|
||||
@@ -926,6 +928,7 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
||||
Self {
|
||||
max_account_slots: config.max_account_slots,
|
||||
price_bumps: config.price_bumps,
|
||||
local_transactions_config: config.local_transactions_config.clone(),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
@@ -1274,7 +1277,7 @@ impl<T: PoolTransaction> AllTransactions<T> {
|
||||
&self,
|
||||
transaction: ValidPoolTransaction<T>,
|
||||
) -> Result<ValidPoolTransaction<T>, InsertErr<T>> {
|
||||
if !transaction.origin.is_local() {
|
||||
if !transaction.origin.is_local() || self.local_transactions_config.no_local_exemptions() {
|
||||
let current_txs =
|
||||
self.tx_counter.get(&transaction.sender_id()).copied().unwrap_or_default();
|
||||
if current_txs >= self.max_account_slots {
|
||||
@@ -1664,6 +1667,7 @@ impl<T: PoolTransaction> Default for AllTransactions<T> {
|
||||
last_seen_block_hash: Default::default(),
|
||||
pending_fees: Default::default(),
|
||||
price_bumps: Default::default(),
|
||||
local_transactions_config: Default::default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,8 +5,8 @@ use crate::{
|
||||
error::{Eip4844PoolTransactionError, InvalidPoolTransactionError},
|
||||
traits::TransactionOrigin,
|
||||
validate::{ValidTransaction, ValidationTask, MAX_INIT_CODE_SIZE, TX_MAX_SIZE},
|
||||
EthBlobTransactionSidecar, EthPoolTransaction, PoolTransaction, TransactionValidationOutcome,
|
||||
TransactionValidationTaskExecutor, TransactionValidator,
|
||||
EthBlobTransactionSidecar, EthPoolTransaction, LocalTransactionConfig, PoolTransaction,
|
||||
TransactionValidationOutcome, TransactionValidationTaskExecutor, TransactionValidator,
|
||||
};
|
||||
use reth_primitives::{
|
||||
constants::{
|
||||
@@ -124,6 +124,8 @@ where
|
||||
propagate_local_transactions: bool,
|
||||
/// Stores the setup and parameters needed for validating KZG proofs.
|
||||
kzg_settings: Arc<KzgSettings>,
|
||||
/// How to handle [TransactionOrigin::Local](TransactionOrigin) transactions.
|
||||
local_transactions_config: LocalTransactionConfig,
|
||||
/// Marker for the transaction type
|
||||
_marker: PhantomData<T>,
|
||||
}
|
||||
@@ -235,7 +237,7 @@ where
|
||||
|
||||
// Drop non-local transactions with a fee lower than the configured fee for acceptance into
|
||||
// the pool.
|
||||
if !origin.is_local() &&
|
||||
if (!origin.is_local() || self.local_transactions_config.no_local_exemptions()) &&
|
||||
transaction.is_eip1559() &&
|
||||
transaction.max_priority_fee_per_gas() < self.minimum_priority_fee
|
||||
{
|
||||
@@ -484,6 +486,8 @@ pub struct EthTransactionValidatorBuilder {
|
||||
|
||||
/// Stores the setup and parameters needed for validating KZG proofs.
|
||||
kzg_settings: Arc<KzgSettings>,
|
||||
/// How to handle [TransactionOrigin::Local](TransactionOrigin) transactions.
|
||||
local_transactions_config: LocalTransactionConfig,
|
||||
}
|
||||
|
||||
impl EthTransactionValidatorBuilder {
|
||||
@@ -500,6 +504,7 @@ impl EthTransactionValidatorBuilder {
|
||||
// default to true, can potentially take this as a param in the future
|
||||
propagate_local_transactions: true,
|
||||
kzg_settings: Arc::clone(&MAINNET_KZG_TRUSTED_SETUP),
|
||||
local_transactions_config: Default::default(),
|
||||
|
||||
// by default all transaction types are allowed
|
||||
eip2718: true,
|
||||
@@ -519,6 +524,15 @@ impl EthTransactionValidatorBuilder {
|
||||
self.set_cancun(false)
|
||||
}
|
||||
|
||||
/// Whether to allow exemptions for local transaction exemptions.
|
||||
pub fn set_local_transactions_config(
|
||||
mut self,
|
||||
local_transactions_config: LocalTransactionConfig,
|
||||
) -> Self {
|
||||
self.local_transactions_config = local_transactions_config;
|
||||
self
|
||||
}
|
||||
|
||||
/// Set the Cancun fork.
|
||||
pub fn set_cancun(mut self, cancun: bool) -> Self {
|
||||
self.cancun = cancun;
|
||||
@@ -624,6 +638,7 @@ impl EthTransactionValidatorBuilder {
|
||||
minimum_priority_fee,
|
||||
propagate_local_transactions,
|
||||
kzg_settings,
|
||||
local_transactions_config,
|
||||
..
|
||||
} = self;
|
||||
|
||||
@@ -642,6 +657,7 @@ impl EthTransactionValidatorBuilder {
|
||||
propagate_local_transactions,
|
||||
blob_store: Box::new(blob_store),
|
||||
kzg_settings,
|
||||
local_transactions_config,
|
||||
_marker: Default::default(),
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user