use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct NetworkMessageLimits {
#[serde(default = "default_max_addr_addresses")]
pub max_addr_addresses: usize,
#[serde(default = "default_max_inv_items")]
pub max_inv_items: usize,
#[serde(default = "default_max_headers")]
pub max_headers: usize,
#[serde(default = "default_max_user_agent_length")]
pub max_user_agent_length: usize,
}
fn default_max_addr_addresses() -> usize {
1000
}
fn default_max_inv_items() -> usize {
50000
}
fn default_max_headers() -> usize {
2000
}
fn default_max_user_agent_length() -> usize {
256
}
impl Default for NetworkMessageLimits {
fn default() -> Self {
Self {
max_addr_addresses: 1000,
max_inv_items: 50000,
max_headers: 2000,
max_user_agent_length: 256,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BlockValidationConfig {
#[serde(default)]
pub assume_valid_height: u64,
#[serde(default)]
pub assume_valid_hash: Option<[u8; 32]>,
#[serde(default)]
pub n_minimum_chain_work: u128,
#[serde(default = "default_median_time_past_headers")]
pub median_time_past_headers: usize,
#[serde(default = "default_true")]
pub enable_parallel_validation: bool,
#[serde(default)]
pub coinbase_maturity_override: u64,
#[serde(default)]
pub max_block_sigops_cost_override: u64,
}
fn default_median_time_past_headers() -> usize {
11
}
fn default_true() -> bool {
true
}
impl Default for BlockValidationConfig {
fn default() -> Self {
Self {
assume_valid_height: 938343,
assume_valid_hash: None,
n_minimum_chain_work: 0,
median_time_past_headers: 11,
enable_parallel_validation: true,
coinbase_maturity_override: 0,
max_block_sigops_cost_override: 0,
}
}
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct MempoolConfig {
#[serde(default = "default_max_mempool_mb")]
pub max_mempool_mb: u64,
#[serde(default = "default_max_mempool_txs")]
pub max_mempool_txs: usize,
#[serde(default = "default_mempool_expiry_hours")]
pub mempool_expiry_hours: u64,
#[serde(default = "default_min_relay_fee_rate")]
pub min_relay_fee_rate: u64,
#[serde(default = "default_min_tx_fee")]
pub min_tx_fee: i64,
#[serde(default = "default_rbf_fee_increment")]
pub rbf_fee_increment: i64,
#[serde(default = "default_max_op_return_size")]
pub max_op_return_size: u32,
#[serde(default = "default_max_op_return_outputs")]
pub max_op_return_outputs: u32,
#[serde(default = "default_reject_multiple_op_return")]
pub reject_multiple_op_return: bool,
#[serde(default = "default_max_standard_script_size")]
pub max_standard_script_size: u32,
#[serde(default = "default_reject_envelope_protocol")]
pub reject_envelope_protocol: bool,
#[serde(default = "default_reject_spam_in_mempool")]
pub reject_spam_in_mempool: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub spam_filter_config: Option<serde_json::Value>,
#[serde(default = "default_min_fee_rate_large_tx")]
pub min_fee_rate_large_tx: u64,
#[serde(default = "default_large_tx_threshold_bytes")]
pub large_tx_threshold_bytes: u64,
}
fn default_rbf_fee_increment() -> i64 {
1000
}
fn default_max_mempool_mb() -> u64 {
300
}
fn default_max_mempool_txs() -> usize {
100_000
}
fn default_mempool_expiry_hours() -> u64 {
336 }
fn default_min_relay_fee_rate() -> u64 {
1 }
fn default_min_tx_fee() -> i64 {
1000
}
fn default_max_op_return_size() -> u32 {
80
}
fn default_max_op_return_outputs() -> u32 {
1
}
fn default_reject_multiple_op_return() -> bool {
true
}
fn default_max_standard_script_size() -> u32 {
200
}
fn default_reject_envelope_protocol() -> bool {
true
}
fn default_reject_spam_in_mempool() -> bool {
false
}
fn default_min_fee_rate_large_tx() -> u64 {
2 }
fn default_large_tx_threshold_bytes() -> u64 {
1000 }
impl Default for MempoolConfig {
fn default() -> Self {
Self {
max_mempool_mb: 300,
max_mempool_txs: 100_000,
mempool_expiry_hours: 336,
min_relay_fee_rate: 1,
min_tx_fee: 1000,
rbf_fee_increment: 1000,
max_op_return_size: 80,
max_op_return_outputs: 1,
reject_multiple_op_return: true,
max_standard_script_size: 200,
reject_envelope_protocol: true,
reject_spam_in_mempool: false,
spam_filter_config: None,
min_fee_rate_large_tx: 2,
large_tx_threshold_bytes: 1000,
}
}
}
fn default_false() -> bool {
false
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UtxoCommitmentConfig {
#[serde(default = "default_max_utxo_commitment_set_mb")]
pub max_utxo_commitment_set_mb: u64,
#[serde(default = "default_max_utxo_count")]
pub max_utxo_count: u64,
#[serde(default = "default_max_historical_commitments")]
pub max_historical_commitments: usize,
#[serde(default = "default_true")]
pub enable_incremental_updates: bool,
}
fn default_max_utxo_commitment_set_mb() -> u64 {
512
}
fn default_max_utxo_count() -> u64 {
100_000_000
}
fn default_max_historical_commitments() -> usize {
1000
}
impl Default for UtxoCommitmentConfig {
fn default() -> Self {
Self {
max_utxo_commitment_set_mb: 512,
max_utxo_count: 100_000_000,
max_historical_commitments: 1000,
enable_incremental_updates: true,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PerformanceConfig {
#[serde(default)]
pub script_verification_threads: usize,
#[serde(default = "default_parallel_batch_size")]
pub parallel_batch_size: usize,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ibd_chunk_threshold: Option<usize>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub ibd_min_chunk_size: Option<usize>,
#[serde(default = "default_true")]
pub enable_simd_optimizations: bool,
#[serde(default = "default_true")]
pub enable_cache_optimizations: bool,
#[serde(default = "default_true")]
pub enable_batch_utxo_lookups: bool,
}
fn default_parallel_batch_size() -> usize {
8
}
impl Default for PerformanceConfig {
fn default() -> Self {
Self {
script_verification_threads: 0, parallel_batch_size: 8,
ibd_chunk_threshold: None,
ibd_min_chunk_size: None,
enable_simd_optimizations: true,
enable_cache_optimizations: true,
enable_batch_utxo_lookups: true,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
pub struct DebugConfig {
#[serde(default = "default_false")]
pub enable_runtime_assertions: bool,
#[serde(default = "default_false")]
pub enable_runtime_invariants: bool,
#[serde(default = "default_false")]
pub enable_verbose_logging: bool,
#[serde(default = "default_false")]
pub enable_performance_profiling: bool,
#[serde(default = "default_false")]
pub log_rejections: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FeatureFlagsConfig {
#[serde(default = "default_false")]
pub enable_experimental_optimizations: bool,
#[serde(default = "default_true")]
pub enable_bounds_check_optimizations: bool,
#[serde(default = "default_false")]
pub enable_reference_checks: bool,
#[serde(default = "default_true")]
pub enable_aggressive_caching: bool,
#[serde(default = "default_true")]
pub enable_batch_tx_id_computation: bool,
#[serde(default = "default_true")]
pub enable_simd_hash_operations: bool,
}
impl Default for FeatureFlagsConfig {
fn default() -> Self {
Self {
enable_experimental_optimizations: false,
enable_bounds_check_optimizations: true,
enable_reference_checks: false,
enable_aggressive_caching: true,
enable_batch_tx_id_computation: true,
enable_simd_hash_operations: true,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AdvancedConfig {
#[serde(default)]
pub custom_checkpoints: Vec<u64>,
#[serde(default = "default_max_reorg_depth")]
pub max_reorg_depth: u64,
#[serde(default = "default_false")]
pub strict_mode: bool,
#[serde(default)]
pub max_block_size_override: usize,
#[serde(default = "default_true")]
pub enable_rbf: bool,
}
fn default_max_reorg_depth() -> u64 {
100
}
impl Default for AdvancedConfig {
fn default() -> Self {
Self {
custom_checkpoints: Vec::new(),
max_reorg_depth: 100,
strict_mode: false,
max_block_size_override: 0,
enable_rbf: true,
}
}
}