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
17pub(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 #[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 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 pub(crate) fn minimum_feerate(&self) -> f64 {
139 self.minimum_relay_transaction_fee as f64 / 1000.0
141 }
142}