From 937527432afcb4dd8c8e0257ca447cc2d19a7dc8 Mon Sep 17 00:00:00 2001 From: Dafna Matsry Date: Wed, 19 Feb 2025 11:23:52 +0200 Subject: [PATCH] feat(starknet_mempool): define the mempool config to be a SerializeConfig --- Cargo.lock | 3 ++ crates/starknet_mempool/Cargo.toml | 3 ++ crates/starknet_mempool/src/communication.rs | 3 +- crates/starknet_mempool/src/config.rs | 55 ++++++++++++++++++++ crates/starknet_mempool/src/lib.rs | 1 + crates/starknet_mempool/src/mempool.rs | 27 ++-------- crates/starknet_mempool/src/mempool_test.rs | 12 +++-- 7 files changed, 75 insertions(+), 29 deletions(-) create mode 100644 crates/starknet_mempool/src/config.rs diff --git a/Cargo.lock b/Cargo.lock index 2823dd3a236..0c6c9b0feee 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -11328,11 +11328,13 @@ dependencies = [ "itertools 0.12.1", "mempool_test_utils", "mockall", + "papyrus_config", "papyrus_network", "papyrus_network_types", "papyrus_test_utils", "pretty_assertions", "rstest", + "serde", "starknet-types-core", "starknet_api", "starknet_mempool_p2p_types", @@ -11340,6 +11342,7 @@ dependencies = [ "starknet_sequencer_infra", "tokio", "tracing", + "validator", ] [[package]] diff --git a/crates/starknet_mempool/Cargo.toml b/crates/starknet_mempool/Cargo.toml index db30761cc6e..fa983487a30 100644 --- a/crates/starknet_mempool/Cargo.toml +++ b/crates/starknet_mempool/Cargo.toml @@ -12,8 +12,10 @@ workspace = true async-trait.workspace = true derive_more.workspace = true mempool_test_utils = { workspace = true, optional = true } +papyrus_config.workspace = true papyrus_network_types.workspace = true pretty_assertions = { workspace = true, optional = true } +serde.workspace = true starknet-types-core = { workspace = true, optional = true } starknet_api.workspace = true starknet_sequencer_infra.workspace = true @@ -21,6 +23,7 @@ starknet_mempool_p2p_types.workspace = true starknet_mempool_types.workspace = true tokio.workspace = true tracing.workspace = true +validator.workspace = true [dev-dependencies] assert_matches.workspace = true diff --git a/crates/starknet_mempool/src/communication.rs b/crates/starknet_mempool/src/communication.rs index 072ec70b317..29fe70d6702 100644 --- a/crates/starknet_mempool/src/communication.rs +++ b/crates/starknet_mempool/src/communication.rs @@ -16,6 +16,7 @@ use starknet_mempool_types::mempool_types::{CommitBlockArgs, MempoolResult}; use starknet_sequencer_infra::component_definitions::{ComponentRequestHandler, ComponentStarter}; use starknet_sequencer_infra::component_server::{LocalComponentServer, RemoteComponentServer}; +use crate::config::MempoolConfig; use crate::mempool::Mempool; use crate::utils::InstantClock; @@ -27,7 +28,7 @@ pub fn create_mempool( mempool_p2p_propagator_client: SharedMempoolP2pPropagatorClient, ) -> MempoolCommunicationWrapper { MempoolCommunicationWrapper::new( - Mempool::new(Arc::new(InstantClock)), + Mempool::new(MempoolConfig::default(), Arc::new(InstantClock)), mempool_p2p_propagator_client, ) } diff --git a/crates/starknet_mempool/src/config.rs b/crates/starknet_mempool/src/config.rs new file mode 100644 index 00000000000..3b7a755aa26 --- /dev/null +++ b/crates/starknet_mempool/src/config.rs @@ -0,0 +1,55 @@ +use std::collections::BTreeMap; +use std::time::Duration; + +use papyrus_config::converters::deserialize_seconds_to_duration; +use papyrus_config::dumping::{ser_param, SerializeConfig}; +use papyrus_config::{ParamPath, ParamPrivacyInput, SerializedParam}; +use serde::{Deserialize, Serialize}; +use validator::Validate; + +#[derive(Debug, Deserialize, Serialize, Clone, PartialEq, Validate)] +pub struct MempoolConfig { + pub enable_fee_escalation: bool, + // TODO(AlonH): consider adding validations; should be bounded? + // Percentage increase for tip and max gas price to enable transaction replacement. + pub fee_escalation_percentage: u8, // E.g., 10 for a 10% increase. + // Time-to-live for transactions in the mempool, in seconds. + // Transactions older than this value will be lazily removed. + #[serde(deserialize_with = "deserialize_seconds_to_duration")] + pub transaction_ttl: Duration, +} + +impl Default for MempoolConfig { + fn default() -> Self { + MempoolConfig { + enable_fee_escalation: true, + fee_escalation_percentage: 10, + transaction_ttl: Duration::from_secs(60), // 1 minute. + } + } +} + +impl SerializeConfig for MempoolConfig { + fn dump(&self) -> BTreeMap { + BTreeMap::from_iter([ + ser_param( + "enable_fee_escalation", + &self.enable_fee_escalation, + "If true, transactions can be replaced with higher fee transactions.", + ParamPrivacyInput::Public, + ), + ser_param( + "fee_escalation_percentage", + &self.fee_escalation_percentage, + "Percentage increase for tip and max gas price to enable transaction replacement.", + ParamPrivacyInput::Public, + ), + ser_param( + "transaction_ttl", + &self.transaction_ttl, + "Time-to-live for transactions in the mempool, in seconds.", + ParamPrivacyInput::Public, + ), + ]) + } +} diff --git a/crates/starknet_mempool/src/lib.rs b/crates/starknet_mempool/src/lib.rs index 2ff3401218a..1e0266885ea 100644 --- a/crates/starknet_mempool/src/lib.rs +++ b/crates/starknet_mempool/src/lib.rs @@ -1,4 +1,5 @@ pub mod communication; +pub mod config; pub mod mempool; pub(crate) mod suspended_transaction_pool; pub(crate) mod transaction_pool; diff --git a/crates/starknet_mempool/src/mempool.rs b/crates/starknet_mempool/src/mempool.rs index 1749ebc851e..3786dc60734 100644 --- a/crates/starknet_mempool/src/mempool.rs +++ b/crates/starknet_mempool/src/mempool.rs @@ -1,6 +1,5 @@ use std::collections::HashMap; use std::sync::Arc; -use std::time::Duration; use starknet_api::block::NonzeroGasPrice; use starknet_api::core::{ContractAddress, Nonce}; @@ -16,6 +15,7 @@ use starknet_mempool_types::mempool_types::{ }; use tracing::{debug, info, instrument}; +use crate::config::MempoolConfig; use crate::transaction_pool::TransactionPool; use crate::transaction_queue::TransactionQueue; use crate::utils::{try_increment_nonce, Clock}; @@ -24,27 +24,6 @@ use crate::utils::{try_increment_nonce, Clock}; #[path = "mempool_test.rs"] pub mod mempool_test; -#[derive(Debug, Clone)] -pub struct MempoolConfig { - enable_fee_escalation: bool, - // TODO(AlonH): consider adding validations; should be bounded? - // Percentage increase for tip and max gas price to enable transaction replacement. - fee_escalation_percentage: u8, // E.g., 10 for a 10% increase. - // Time-to-live for transactions in the mempool, in seconds. - // Transactions older than this value will be lazily removed. - transaction_ttl: Duration, -} - -impl Default for MempoolConfig { - fn default() -> Self { - MempoolConfig { - enable_fee_escalation: true, - fee_escalation_percentage: 10, - transaction_ttl: Duration::from_secs(60), // 1 minute. - } - } -} - type AddressToNonce = HashMap; /// Represents the state tracked by the mempool. @@ -155,9 +134,9 @@ pub struct Mempool { } impl Mempool { - pub fn new(clock: Arc) -> Self { + pub fn new(config: MempoolConfig, clock: Arc) -> Self { Mempool { - config: MempoolConfig::default(), + config, tx_pool: TransactionPool::new(clock.clone()), tx_queue: TransactionQueue::default(), state: MempoolState::default(), diff --git a/crates/starknet_mempool/src/mempool_test.rs b/crates/starknet_mempool/src/mempool_test.rs index bc5bb3df374..78a1363668f 100644 --- a/crates/starknet_mempool/src/mempool_test.rs +++ b/crates/starknet_mempool/src/mempool_test.rs @@ -927,8 +927,10 @@ fn tx_from_address_exists(#[case] state: MempoolState, #[case] expected_result: fn add_tx_old_transactions_cleanup() { // Create a mempool with a fake clock. let fake_clock = Arc::new(FakeClock::default()); - let mut mempool = Mempool::new(fake_clock.clone()); - mempool.config.transaction_ttl = Duration::from_secs(60); + let mut mempool = Mempool::new( + MempoolConfig { transaction_ttl: Duration::from_secs(60), ..Default::default() }, + fake_clock.clone(), + ); // Add a new transaction to the mempool. let first_tx = @@ -968,8 +970,10 @@ fn add_tx_old_transactions_cleanup() { fn get_txs_old_transactions_cleanup() { // Create a mempool with a fake clock. let fake_clock = Arc::new(FakeClock::default()); - let mut mempool = Mempool::new(fake_clock.clone()); - mempool.config.transaction_ttl = Duration::from_secs(60); + let mut mempool = Mempool::new( + MempoolConfig { transaction_ttl: Duration::from_secs(60), ..Default::default() }, + fake_clock.clone(), + ); // Add a new transaction to the mempool. let first_tx =