1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
use ckb_jsonrpc_types::{FeeRateDef, JsonBytes, ScriptHashType};
use ckb_types::H256;
use ckb_types::core::{Cycle, FeeRate};
use serde::{Deserialize, Serialize};
use std::path::{Path, PathBuf};
use url::Url;
// The default values are set in the legacy version.
/// Transaction pool configuration
#[derive(Clone, Debug, Serialize)]
pub struct TxPoolConfig {
/// Keep the transaction pool below <max_tx_pool_size> mb
pub max_tx_pool_size: usize,
/// txs with lower fee rate than this will not be relayed or be mined
#[serde(with = "FeeRateDef")]
pub min_fee_rate: FeeRate,
/// txs need to pay larger fee rate than this for RBF
#[serde(with = "FeeRateDef")]
pub min_rbf_rate: FeeRate,
/// tx pool rejects txs that cycles greater than max_tx_verify_cycles
pub max_tx_verify_cycles: Cycle,
/// max tx verify workers, default is 3/4 of cpu cores
#[serde(default = "default_max_tx_verify_workers")]
pub max_tx_verify_workers: usize,
/// max ancestors size limit for a single tx
pub max_ancestors_count: usize,
/// rejected tx time to live by days
pub keep_rejected_tx_hashes_days: u8,
/// rejected tx count limit
pub keep_rejected_tx_hashes_count: u64,
/// The file to persist the tx pool on the disk when tx pool have been shutdown.
///
/// By default, it is a subdirectory of 'tx-pool' subdirectory under the data directory.
#[serde(default)]
pub persisted_data: PathBuf,
/// The recent reject record database directory path.
///
/// By default, it is a subdirectory of 'tx-pool' subdirectory under the data directory.
#[serde(default)]
pub recent_reject: PathBuf,
/// The expiration time for pool transactions in hours
pub expiry_hours: u8,
}
/// default max tx verify workers is 3/4 of cpu cores
pub fn default_max_tx_verify_workers() -> usize {
std::cmp::max(num_cpus::get() * 3 / 4, 1)
}
/// Block assembler config options.
///
/// The block assembler section tells CKB how to claim the miner rewards.
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Eq)]
#[serde(deny_unknown_fields)]
pub struct BlockAssemblerConfig {
/// The miner lock script code hash.
pub code_hash: H256,
/// The miner lock script args.
pub args: JsonBytes,
/// An arbitrary message to be added into the cellbase transaction.
pub message: JsonBytes,
/// The miner lock script hash type.
pub hash_type: ScriptHashType,
/// Use ckb binary version as message prefix to identify the block miner client (default true, false to disable it).
#[serde(default = "default_use_binary_version_as_message_prefix")]
pub use_binary_version_as_message_prefix: bool,
/// A field to store the block miner client version, non-configurable options.
#[serde(skip)]
pub binary_version: String,
/// A field to control update interval millis
#[serde(default = "default_update_interval_millis")]
pub update_interval_millis: u64,
/// Notify url
#[serde(default)]
pub notify: Vec<Url>,
/// Notify scripts
#[serde(default)]
pub notify_scripts: Vec<String>,
/// Notify timeout
#[serde(default = "default_notify_timeout_millis")]
pub notify_timeout_millis: u64,
}
const fn default_use_binary_version_as_message_prefix() -> bool {
true
}
const fn default_update_interval_millis() -> u64 {
800
}
const fn default_notify_timeout_millis() -> u64 {
800
}
impl TxPoolConfig {
/// Canonicalizes paths in the config options.
///
/// If `self.persisted_data` is not set, set it to `data_dir / tx_pool_persisted_data`.
///
/// If `self.path` is relative, convert them to absolute path using
/// `root_dir` as current working directory.
pub fn adjust<P: AsRef<Path>>(&mut self, root_dir: &Path, tx_pool_dir: P) {
_adjust(
root_dir,
tx_pool_dir.as_ref(),
&mut self.persisted_data,
"persisted_data",
);
_adjust(
root_dir,
tx_pool_dir.as_ref(),
&mut self.recent_reject,
"recent_reject",
);
}
}
fn _adjust(root_dir: &Path, tx_pool_dir: &Path, target: &mut PathBuf, sub: &str) {
if target.to_str().is_none() || target.to_str() == Some("") {
*target = tx_pool_dir.to_path_buf().join(sub);
} else if target.is_relative() {
*target = root_dir.to_path_buf().join(&target)
}
}