Skip to main content

kaspa_mining/mempool/
config.rs

1use kaspa_consensus_core::mass::{BlockLaneLimits, BlockMassLimits, MassCofactors};
2
3pub(crate) const DEFAULT_MAXIMUM_TRANSACTION_COUNT: usize = 1_000_000;
4pub(crate) const DEFAULT_MEMPOOL_SIZE_LIMIT: usize = 1_000_000_000;
5pub(crate) const DEFAULT_MAXIMUM_BUILD_BLOCK_TEMPLATE_ATTEMPTS: u64 = 5;
6
7pub(crate) const DEFAULT_TRANSACTION_EXPIRE_INTERVAL_SECONDS: u64 = 24 * 60 * 60;
8pub(crate) const DEFAULT_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS: u64 = 60;
9pub(crate) const DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_INTERVAL_SECONDS: u64 = 120;
10pub(crate) const DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS: u64 = 10;
11pub(crate) const DEFAULT_ORPHAN_EXPIRE_INTERVAL_SECONDS: u64 = 60;
12pub(crate) const DEFAULT_ORPHAN_EXPIRE_SCAN_INTERVAL_SECONDS: u64 = 10;
13
14pub(crate) const DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_NORMALIZED_MASS: u64 = 500_000;
15pub(crate) const DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_COUNT: u64 = 500;
16
17/// DEFAULT_MINIMUM_RELAY_TRANSACTION_FEE specifies the minimum transaction fee for a transaction to be accepted to
18/// the mempool and relayed. It is specified in sompi per 1kg (or 1000 grams) of transaction mass.
19/// The default is 100 sompi per gram.
20pub(crate) const DEFAULT_MINIMUM_RELAY_TRANSACTION_FEE: u64 = 100_000;
21
22#[derive(Clone, Debug)]
23pub struct Config {
24    pub maximum_transaction_count: usize,
25    pub mempool_size_limit: usize,
26    pub maximum_build_block_template_attempts: u64,
27    pub transaction_expire_interval_daa_score: u64,
28    pub transaction_expire_scan_interval_daa_score: u64,
29    pub transaction_expire_scan_interval_milliseconds: u64,
30    pub accepted_transaction_expire_interval_daa_score: u64,
31    pub accepted_transaction_expire_scan_interval_daa_score: u64,
32    pub accepted_transaction_expire_scan_interval_milliseconds: u64,
33    pub orphan_expire_interval_daa_score: u64,
34    pub orphan_expire_scan_interval_daa_score: u64,
35    pub maximum_orphan_transaction_normalized_mass: u64,
36    pub maximum_orphan_transaction_count: u64,
37    pub accept_non_standard: bool,
38    pub mempool_block_mass_limits: BlockMassLimits,
39    pub mempool_mass_cofactors: MassCofactors,
40    pub block_lane_limits: BlockLaneLimits,
41    pub minimum_relay_transaction_fee: u64,
42    pub network_blocks_per_second: u64,
43}
44
45impl Config {
46    #[allow(clippy::too_many_arguments)]
47    pub fn new(
48        maximum_transaction_count: usize,
49        mempool_size_limit: usize,
50        maximum_build_block_template_attempts: u64,
51        transaction_expire_interval_daa_score: u64,
52        transaction_expire_scan_interval_daa_score: u64,
53        transaction_expire_scan_interval_milliseconds: u64,
54        accepted_transaction_expire_interval_daa_score: u64,
55        accepted_transaction_expire_scan_interval_daa_score: u64,
56        accepted_transaction_expire_scan_interval_milliseconds: u64,
57        orphan_expire_interval_daa_score: u64,
58        orphan_expire_scan_interval_daa_score: u64,
59        maximum_orphan_transaction_normalized_mass: u64,
60        maximum_orphan_transaction_count: u64,
61        accept_non_standard: bool,
62        mempool_block_mass_limits: BlockMassLimits,
63        block_lane_limits: BlockLaneLimits,
64        minimum_relay_transaction_fee: u64,
65        network_blocks_per_second: u64,
66    ) -> Self {
67        let mempool_mass_cofactors = mempool_block_mass_limits.cofactors();
68        Self {
69            maximum_transaction_count,
70            mempool_size_limit,
71            maximum_build_block_template_attempts,
72            transaction_expire_interval_daa_score,
73            transaction_expire_scan_interval_daa_score,
74            transaction_expire_scan_interval_milliseconds,
75            accepted_transaction_expire_interval_daa_score,
76            accepted_transaction_expire_scan_interval_daa_score,
77            accepted_transaction_expire_scan_interval_milliseconds,
78            orphan_expire_interval_daa_score,
79            orphan_expire_scan_interval_daa_score,
80            maximum_orphan_transaction_normalized_mass,
81            maximum_orphan_transaction_count,
82            accept_non_standard,
83            mempool_block_mass_limits,
84            mempool_mass_cofactors,
85            block_lane_limits,
86            minimum_relay_transaction_fee,
87            network_blocks_per_second,
88        }
89    }
90
91    /// Build a default config.
92    /// The mass limits should be obtained from [`kaspa_consensus_core::config::params::Params::block_mass_limits`].
93    #[allow(
94        clippy::arithmetic_side_effects,
95        reason = "If there's an overflow, the program will panic on startup, which is acceptable since it indicates a misconfiguration."
96    )]
97    pub const fn build_default(
98        target_milliseconds_per_block: u64,
99        relay_non_std_transactions: bool,
100        mempool_block_mass_limits: BlockMassLimits,
101        block_lane_limits: BlockLaneLimits,
102    ) -> Self {
103        let mempool_mass_cofactors = mempool_block_mass_limits.cofactors();
104        Self {
105            maximum_transaction_count: DEFAULT_MAXIMUM_TRANSACTION_COUNT,
106            mempool_size_limit: DEFAULT_MEMPOOL_SIZE_LIMIT,
107            maximum_build_block_template_attempts: DEFAULT_MAXIMUM_BUILD_BLOCK_TEMPLATE_ATTEMPTS,
108            transaction_expire_interval_daa_score: DEFAULT_TRANSACTION_EXPIRE_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
109            transaction_expire_scan_interval_daa_score: DEFAULT_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000
110                / target_milliseconds_per_block,
111            transaction_expire_scan_interval_milliseconds: DEFAULT_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000,
112            accepted_transaction_expire_interval_daa_score: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_INTERVAL_SECONDS * 1000
113                / target_milliseconds_per_block,
114            accepted_transaction_expire_scan_interval_daa_score: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000
115                / target_milliseconds_per_block,
116            accepted_transaction_expire_scan_interval_milliseconds: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000,
117            orphan_expire_interval_daa_score: DEFAULT_ORPHAN_EXPIRE_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
118            orphan_expire_scan_interval_daa_score: DEFAULT_ORPHAN_EXPIRE_SCAN_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
119            maximum_orphan_transaction_normalized_mass: DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_NORMALIZED_MASS,
120            maximum_orphan_transaction_count: DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_COUNT,
121            accept_non_standard: relay_non_std_transactions,
122            mempool_block_mass_limits,
123            mempool_mass_cofactors,
124            block_lane_limits,
125            minimum_relay_transaction_fee: DEFAULT_MINIMUM_RELAY_TRANSACTION_FEE,
126            network_blocks_per_second: 1000 / target_milliseconds_per_block,
127        }
128    }
129
130    pub fn apply_ram_scale(mut self, ram_scale: f64) -> Self {
131        // Allow only scaling down
132        self.maximum_transaction_count = (self.maximum_transaction_count as f64 * ram_scale.min(1.0)) as usize;
133        self.mempool_size_limit = (self.mempool_size_limit as f64 * ram_scale.min(1.0)) as usize;
134        self
135    }
136
137    /// Returns the minimum standard fee/mass ratio currently required by the mempool
138    pub(crate) fn minimum_feerate(&self) -> f64 {
139        // The parameter minimum_relay_transaction_fee is in sompi/kg units so divide by 1000 to get sompi/gram
140        self.minimum_relay_transaction_fee as f64 / 1000.0
141    }
142}