ckb_app_config/legacy/
tx_pool.rs1use ckb_chain_spec::consensus::TWO_IN_TWO_OUT_CYCLES;
2use ckb_jsonrpc_types::FeeRateDef;
3use ckb_types::core::{Cycle, FeeRate};
4use serde::Deserialize;
5use std::cmp;
6use std::path::PathBuf;
7
8const DEFAULT_MIN_FEE_RATE: FeeRate = FeeRate::from_u64(1000);
10const DEFAULT_MIN_RBF_RATE: FeeRate = FeeRate::from_u64(1500);
12const DEFAULT_MAX_TX_VERIFY_CYCLES: Cycle = TWO_IN_TWO_OUT_CYCLES * 20;
14const DEFAULT_MAX_ANCESTORS_COUNT: usize = 2_000;
16const DEFAULT_EXPIRY_HOURS: u8 = 12;
18const DEFAULT_MAX_TX_POOL_SIZE: usize = 180_000_000;
20
21#[derive(Clone, Debug, Deserialize)]
22#[serde(deny_unknown_fields)]
23#[allow(dead_code)]
24pub(crate) struct TxPoolConfig {
25 #[serde(default = "default_max_tx_pool_size")]
26 max_tx_pool_size: usize,
27 max_mem_size: Option<usize>,
28 max_cycles: Option<Cycle>,
29 pub(crate) max_verify_cache_size: Option<usize>,
30 pub(crate) max_conflict_cache_size: Option<usize>,
31 pub(crate) max_committed_txs_hash_cache_size: Option<usize>,
32 #[serde(default = "default_keep_rejected_tx_hashes_days")]
33 keep_rejected_tx_hashes_days: u8,
34 #[serde(default = "default_keep_rejected_tx_hashes_count")]
35 keep_rejected_tx_hashes_count: u64,
36 #[serde(with = "FeeRateDef")]
37 min_fee_rate: FeeRate,
38 #[serde(with = "FeeRateDef", default = "default_min_rbf_rate")]
39 min_rbf_rate: FeeRate,
40 max_tx_verify_cycles: Cycle,
41 max_ancestors_count: usize,
42 #[serde(default)]
43 persisted_data: PathBuf,
44 #[serde(default)]
45 recent_reject: PathBuf,
46 #[serde(default = "default_expiry_hours")]
47 expiry_hours: u8,
48}
49
50fn default_keep_rejected_tx_hashes_days() -> u8 {
51 7
52}
53
54fn default_keep_rejected_tx_hashes_count() -> u64 {
55 10_000_000
56}
57
58fn default_expiry_hours() -> u8 {
59 DEFAULT_EXPIRY_HOURS
60}
61
62fn default_max_tx_pool_size() -> usize {
63 DEFAULT_MAX_TX_POOL_SIZE
64}
65
66fn default_min_rbf_rate() -> FeeRate {
67 DEFAULT_MIN_RBF_RATE
68}
69
70impl Default for crate::TxPoolConfig {
71 fn default() -> Self {
72 TxPoolConfig::default().into()
73 }
74}
75
76impl Default for TxPoolConfig {
77 fn default() -> Self {
78 Self {
79 max_mem_size: None,
80 max_tx_pool_size: DEFAULT_MAX_TX_POOL_SIZE,
81 max_cycles: None,
82 max_verify_cache_size: None,
83 max_conflict_cache_size: None,
84 max_committed_txs_hash_cache_size: None,
85 keep_rejected_tx_hashes_days: default_keep_rejected_tx_hashes_days(),
86 keep_rejected_tx_hashes_count: default_keep_rejected_tx_hashes_count(),
87 min_fee_rate: DEFAULT_MIN_FEE_RATE,
88 min_rbf_rate: DEFAULT_MIN_RBF_RATE,
89 max_tx_verify_cycles: DEFAULT_MAX_TX_VERIFY_CYCLES,
90 max_ancestors_count: DEFAULT_MAX_ANCESTORS_COUNT,
91 persisted_data: Default::default(),
92 recent_reject: Default::default(),
93 expiry_hours: DEFAULT_EXPIRY_HOURS,
94 }
95 }
96}
97
98impl From<TxPoolConfig> for crate::TxPoolConfig {
99 fn from(input: TxPoolConfig) -> Self {
100 let TxPoolConfig {
101 max_mem_size: _,
102 max_tx_pool_size,
103 max_cycles: _,
104 max_verify_cache_size: _,
105 max_conflict_cache_size: _,
106 max_committed_txs_hash_cache_size: _,
107 keep_rejected_tx_hashes_days,
108 keep_rejected_tx_hashes_count,
109 min_fee_rate,
110 min_rbf_rate,
111 max_tx_verify_cycles,
112 max_ancestors_count,
113 persisted_data,
114 recent_reject,
115 expiry_hours,
116 } = input;
117
118 Self {
119 max_tx_pool_size,
120 min_fee_rate,
121 min_rbf_rate,
122 max_tx_verify_cycles,
123 max_ancestors_count: cmp::max(DEFAULT_MAX_ANCESTORS_COUNT, max_ancestors_count),
124 keep_rejected_tx_hashes_days,
125 keep_rejected_tx_hashes_count,
126 persisted_data,
127 recent_reject,
128 expiry_hours,
129 }
130 }
131}