kaspa_mining/mempool/
config.rs

1use kaspa_consensus_core::constants::TX_VERSION;
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_MASS: u64 = 100_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.
19pub(crate) const DEFAULT_MINIMUM_RELAY_TRANSACTION_FEE: u64 = 1000;
20
21/// Standard transaction version range might be different from what consensus accepts, therefore
22/// we define separate values in mempool.
23/// However, currently there's exactly one transaction version, so mempool accepts the same version
24/// as consensus.
25pub(crate) const DEFAULT_MINIMUM_STANDARD_TRANSACTION_VERSION: u16 = TX_VERSION;
26pub(crate) const DEFAULT_MAXIMUM_STANDARD_TRANSACTION_VERSION: u16 = TX_VERSION;
27
28#[derive(Clone, Debug)]
29pub struct Config {
30    pub maximum_transaction_count: usize,
31    pub mempool_size_limit: usize,
32    pub maximum_build_block_template_attempts: u64,
33    pub transaction_expire_interval_daa_score: u64,
34    pub transaction_expire_scan_interval_daa_score: u64,
35    pub transaction_expire_scan_interval_milliseconds: u64,
36    pub accepted_transaction_expire_interval_daa_score: u64,
37    pub accepted_transaction_expire_scan_interval_daa_score: u64,
38    pub accepted_transaction_expire_scan_interval_milliseconds: u64,
39    pub orphan_expire_interval_daa_score: u64,
40    pub orphan_expire_scan_interval_daa_score: u64,
41    pub maximum_orphan_transaction_mass: u64,
42    pub maximum_orphan_transaction_count: u64,
43    pub accept_non_standard: bool,
44    pub maximum_mass_per_block: u64,
45    pub minimum_relay_transaction_fee: u64,
46    pub minimum_standard_transaction_version: u16,
47    pub maximum_standard_transaction_version: u16,
48    pub network_blocks_per_second: u64,
49}
50
51impl Config {
52    #[allow(clippy::too_many_arguments)]
53    pub fn new(
54        maximum_transaction_count: usize,
55        mempool_size_limit: usize,
56        maximum_build_block_template_attempts: u64,
57        transaction_expire_interval_daa_score: u64,
58        transaction_expire_scan_interval_daa_score: u64,
59        transaction_expire_scan_interval_milliseconds: u64,
60        accepted_transaction_expire_interval_daa_score: u64,
61        accepted_transaction_expire_scan_interval_daa_score: u64,
62        accepted_transaction_expire_scan_interval_milliseconds: u64,
63        orphan_expire_interval_daa_score: u64,
64        orphan_expire_scan_interval_daa_score: u64,
65        maximum_orphan_transaction_mass: u64,
66        maximum_orphan_transaction_count: u64,
67        accept_non_standard: bool,
68        maximum_mass_per_block: u64,
69        minimum_relay_transaction_fee: u64,
70        minimum_standard_transaction_version: u16,
71        maximum_standard_transaction_version: u16,
72        network_blocks_per_second: u64,
73    ) -> Self {
74        Self {
75            maximum_transaction_count,
76            mempool_size_limit,
77            maximum_build_block_template_attempts,
78            transaction_expire_interval_daa_score,
79            transaction_expire_scan_interval_daa_score,
80            transaction_expire_scan_interval_milliseconds,
81            accepted_transaction_expire_interval_daa_score,
82            accepted_transaction_expire_scan_interval_daa_score,
83            accepted_transaction_expire_scan_interval_milliseconds,
84            orphan_expire_interval_daa_score,
85            orphan_expire_scan_interval_daa_score,
86            maximum_orphan_transaction_mass,
87            maximum_orphan_transaction_count,
88            accept_non_standard,
89            maximum_mass_per_block,
90            minimum_relay_transaction_fee,
91            minimum_standard_transaction_version,
92            maximum_standard_transaction_version,
93            network_blocks_per_second,
94        }
95    }
96
97    /// Build a default config.
98    /// The arguments should be obtained from the current consensus [`kaspa_consensus_core::config::params::Params`] instance.
99    pub const fn build_default(target_milliseconds_per_block: u64, relay_non_std_transactions: bool, max_block_mass: u64) -> Self {
100        Self {
101            maximum_transaction_count: DEFAULT_MAXIMUM_TRANSACTION_COUNT,
102            mempool_size_limit: DEFAULT_MEMPOOL_SIZE_LIMIT,
103            maximum_build_block_template_attempts: DEFAULT_MAXIMUM_BUILD_BLOCK_TEMPLATE_ATTEMPTS,
104            transaction_expire_interval_daa_score: DEFAULT_TRANSACTION_EXPIRE_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
105            transaction_expire_scan_interval_daa_score: DEFAULT_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000
106                / target_milliseconds_per_block,
107            transaction_expire_scan_interval_milliseconds: DEFAULT_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000,
108            accepted_transaction_expire_interval_daa_score: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_INTERVAL_SECONDS * 1000
109                / target_milliseconds_per_block,
110            accepted_transaction_expire_scan_interval_daa_score: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000
111                / target_milliseconds_per_block,
112            accepted_transaction_expire_scan_interval_milliseconds: DEFAULT_ACCEPTED_TRANSACTION_EXPIRE_SCAN_INTERVAL_SECONDS * 1000,
113            orphan_expire_interval_daa_score: DEFAULT_ORPHAN_EXPIRE_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
114            orphan_expire_scan_interval_daa_score: DEFAULT_ORPHAN_EXPIRE_SCAN_INTERVAL_SECONDS * 1000 / target_milliseconds_per_block,
115            maximum_orphan_transaction_mass: DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_MASS,
116            maximum_orphan_transaction_count: DEFAULT_MAXIMUM_ORPHAN_TRANSACTION_COUNT,
117            accept_non_standard: relay_non_std_transactions,
118            maximum_mass_per_block: max_block_mass,
119            minimum_relay_transaction_fee: DEFAULT_MINIMUM_RELAY_TRANSACTION_FEE,
120            minimum_standard_transaction_version: DEFAULT_MINIMUM_STANDARD_TRANSACTION_VERSION,
121            maximum_standard_transaction_version: DEFAULT_MAXIMUM_STANDARD_TRANSACTION_VERSION,
122            network_blocks_per_second: 1000 / target_milliseconds_per_block,
123        }
124    }
125
126    pub fn apply_ram_scale(mut self, ram_scale: f64) -> Self {
127        // Allow only scaling down
128        self.maximum_transaction_count = (self.maximum_transaction_count as f64 * ram_scale.min(1.0)) as usize;
129        self.mempool_size_limit = (self.mempool_size_limit as f64 * ram_scale.min(1.0)) as usize;
130        self
131    }
132
133    /// Returns the minimum standard fee/mass ratio currently required by the mempool
134    pub(crate) fn minimum_feerate(&self) -> f64 {
135        // The parameter minimum_relay_transaction_fee is in sompi/kg units so divide by 1000 to get sompi/gram
136        self.minimum_relay_transaction_fee as f64 / 1000.0
137    }
138}