1use std::{collections::HashMap, path::PathBuf};
5
6use massa_bootstrap::IpType;
7use massa_models::{amount::Amount, config::build_massa_settings, node::NodeId};
8use massa_protocol_exports::PeerCategoryInfo;
9use massa_time::MassaTime;
10use serde::Deserialize;
11use std::net::{IpAddr, SocketAddr};
12
13lazy_static::lazy_static! {
14 pub static ref SETTINGS: Settings = build_massa_settings("massa-node", "MASSA_NODE");
15}
16
17#[derive(Debug, Deserialize, Clone)]
18pub struct LoggingSettings {
19 pub level: usize,
20}
21
22#[derive(Debug, Deserialize, Clone)]
23pub struct CliSettings {
24 pub approved_community_charter_file_path: PathBuf,
25}
26
27#[derive(Clone, Debug, Deserialize)]
28pub struct ExecutionSettings {
29 pub max_final_events: usize,
30 pub readonly_queue_length: usize,
31 pub readonly_starvation_timeout: MassaTime,
32 pub cursor_delay: MassaTime,
33 pub stats_time_window_duration: MassaTime,
34 pub max_read_only_gas: u64,
35 pub abi_gas_costs_file: PathBuf,
36 pub hd_cache_path: PathBuf,
37 pub lru_cache_size: u32,
38 pub hd_cache_size: usize,
39 pub snip_amount: usize,
40 pub broadcast_slot_execution_output_channel_capacity: usize,
42 pub broadcast_slot_execution_traces_channel_capacity: usize,
44 pub execution_traces_limit: usize,
45 pub event_cache_path: PathBuf,
46 pub event_cache_size: usize,
47 pub event_snip_amount: usize,
48 pub max_event_per_query: usize,
49 #[serde(default)]
51 pub query_state_deadline_ms: Option<u64>,
52 pub broadcast_slot_execution_info_channel_capacity: usize,
54}
55
56#[derive(Clone, Debug, Deserialize)]
57pub struct SelectionSettings {
58 pub initial_rolls_path: PathBuf,
59}
60
61#[derive(Clone, Debug, Deserialize)]
62pub struct LedgerSettings {
63 pub initial_ledger_path: PathBuf,
64 pub disk_ledger_path: PathBuf,
65 pub final_history_length: usize,
66 pub initial_deferred_credits_path: Option<PathBuf>,
67 pub ledger_backup_periods_interval: u64,
68 pub max_ledger_backups: u64,
69}
70
71#[derive(Debug, Deserialize, Clone)]
73pub struct BootstrapSettings {
74 pub bootstrap_list: Vec<(SocketAddr, NodeId)>,
75 pub bootstrap_protocol: IpType,
76 pub bootstrap_whitelist_path: PathBuf,
77 pub bootstrap_blacklist_path: PathBuf,
78 pub bind: Option<SocketAddr>,
79 pub connect_timeout: MassaTime,
80 pub read_timeout: MassaTime,
81 pub write_timeout: MassaTime,
82 pub read_error_timeout: MassaTime,
83 pub write_error_timeout: MassaTime,
84 pub retry_delay: MassaTime,
85 pub max_ping: MassaTime,
86 pub max_clock_delta: MassaTime,
87 pub cache_duration: MassaTime,
88 pub max_simultaneous_bootstraps: u32,
89 pub per_ip_min_interval: MassaTime,
90 pub ip_list_max_size: usize,
91 pub rate_limit: u64,
92 pub bootstrap_timeout: MassaTime,
94}
95
96#[derive(Debug, Deserialize, Clone)]
98pub struct FactorySettings {
99 pub initial_delay: MassaTime,
101 pub staking_wallet_path: PathBuf,
103 pub stop_production_when_zero_connections: bool,
105 pub block_delay_warn_threshold: MassaTime,
107 pub block_opt_channel_timeout: MassaTime,
109}
110
111#[allow(dead_code)]
113#[derive(Debug, Deserialize, Clone)]
114pub struct PoolSettings {
115 pub max_operation_pool_size: usize,
116 pub max_operation_pool_excess_items: usize,
117 pub operation_max_future_start_delay: MassaTime,
118 pub operation_pool_refresh_interval: MassaTime,
119 pub operation_pool_swap_interval: MassaTime,
120 pub endorsement_pool_swap_interval: MassaTime,
121 pub denunciation_pool_refresh_interval: MassaTime,
122 pub denunciation_pool_swap_interval: MassaTime,
123 pub max_endorsements_pool_size_per_thread: usize,
124 pub max_item_return_count: usize,
125 pub endorsements_channel_capacity: usize,
127 pub operations_channel_capacity: usize,
129 pub denunciations_channel_capacity: usize,
131 pub broadcast_endorsements_channel_capacity: usize,
133 pub broadcast_operations_channel_capacity: usize,
135 pub minimal_fees: Amount,
137}
138
139#[derive(Debug, Deserialize, Clone)]
141pub struct APISettings {
142 pub draw_lookahead_period_count: u64,
143 pub bind_private: SocketAddr,
144 pub bind_public: SocketAddr,
145 pub bind_api: SocketAddr,
146 pub max_arguments: u64,
147 pub openrpc_spec_path: PathBuf,
148 pub max_request_body_size: u32,
149 pub max_response_body_size: u32,
150 pub max_connections: u32,
151 pub max_subscriptions_per_connection: u32,
152 pub max_log_length: u32,
153 pub allow_hosts: Vec<String>,
154 pub batch_request_limit: u32,
155 pub ping_interval: MassaTime,
156 pub enable_http: bool,
157 pub enable_ws: bool,
158 pub enable_broadcast: bool,
160 pub deferred_credits_delta: MassaTime,
161 pub max_datastore_keys_query: Option<u32>,
162 pub max_addresses_datastore_keys_query: Option<u32>,
163 pub pool_api_timeout: MassaTime,
164}
165
166#[derive(Debug, Deserialize, Clone)]
167pub struct Settings {
168 pub logging: LoggingSettings,
169 pub protocol: ProtocolSettings,
170 pub consensus: ConsensusSettings,
171 pub api: APISettings,
172 pub network: NetworkSettings,
173 pub bootstrap: BootstrapSettings,
174 pub pool: PoolSettings,
175 pub execution: ExecutionSettings,
176 pub ledger: LedgerSettings,
177 pub selector: SelectionSettings,
178 pub factory: FactorySettings,
179 pub grpc: GrpcApiSettings,
180 pub metrics: MetricsSettings,
181 pub versioning: VersioningSettings,
182 pub block_dump: BlockDumpSettings,
183 pub cli: CliSettings,
184}
185
186#[derive(Debug, Deserialize, Clone)]
189pub struct ConsensusSettings {
190 pub max_discarded_blocks: usize,
192 pub max_future_processing_blocks: usize,
194 pub max_dependency_blocks: usize,
196 pub stats_timespan: MassaTime,
198 pub force_keep_final_periods: u64,
200 pub force_keep_final_periods_without_ops: u64,
202 pub block_db_prune_interval: MassaTime,
204 pub broadcast_blocks_headers_channel_capacity: usize,
206 pub broadcast_blocks_channel_capacity: usize,
208 pub broadcast_filled_blocks_channel_capacity: usize,
210}
211
212#[derive(Debug, Deserialize, Clone)]
214pub struct NetworkSettings {
215 pub routable_ip: Option<IpAddr>,
217}
218
219#[derive(Debug, Deserialize, Clone)]
220pub struct MetricsSettings {
221 pub enabled: bool,
223 pub bind: SocketAddr,
225 pub tick_delay: MassaTime,
227}
228
229#[allow(dead_code)]
231#[derive(Debug, Deserialize, Clone)]
232pub struct ProtocolSettings {
233 pub ask_block_timeout: MassaTime,
235 pub max_blocks_kept_for_propagation: usize,
237 pub max_block_propagation_time: MassaTime,
239 pub block_propagation_tick: MassaTime,
241 pub max_known_blocks_size: usize,
243 pub max_node_known_blocks_size: usize,
245 pub max_node_wanted_blocks_size: usize,
247 pub max_known_ops_size: usize,
249 pub asked_operations_buffer_capacity: usize,
251 pub max_node_known_ops_size: usize,
253 pub max_known_endorsements_size: usize,
255 pub max_node_known_endorsements_size: usize,
257 pub max_simultaneous_ask_blocks_per_node: usize,
259 pub max_send_wait: MassaTime,
261 pub operation_batch_buffer_capacity: usize,
264 pub operation_announcement_buffer_capacity: usize,
267 pub operation_batch_proc_period: MassaTime,
269 pub operation_announcement_interval: MassaTime,
271 pub max_operations_per_message: u64,
273 pub max_ops_kept_for_propagation: usize,
275 pub max_endorsements_per_propagation_round: usize,
277 pub max_operations_propagation_time: MassaTime,
279 pub max_endorsements_propagation_time: MassaTime,
281 pub initial_peers_file: PathBuf,
283 pub keypair_file: PathBuf,
285 pub bind: SocketAddr,
287 pub routable_ip: Option<IpAddr>,
289 pub connect_timeout: MassaTime,
291 pub thread_tester_count: u8,
293 pub read_write_limit_bytes_per_second: u64,
295 pub try_connection_timer: MassaTime,
297 pub try_connection_timer_same_peer: MassaTime,
299 pub unban_everyone_timer: MassaTime,
301 pub timeout_connection: MassaTime,
303 pub message_timeout: MassaTime,
305 pub tester_timeout: MassaTime,
307 pub max_in_connections: usize,
309 pub peers_categories: HashMap<String, PeerCategoryInfo>,
311 pub default_category_info: PeerCategoryInfo,
313 pub test_oldest_peer_cooldown: MassaTime,
315 pub rate_limit: u64,
317}
318
319#[derive(Debug, Deserialize, Clone)]
322pub struct GrpcSettings {
323 pub enabled: bool,
325 pub accept_http1: bool,
327 pub enable_cors: bool,
329 pub enable_health: bool,
331 pub enable_reflection: bool,
333 pub enable_tls: bool,
335 pub enable_mtls: bool,
337 pub generate_self_signed_certificates: bool,
339 pub subject_alt_names: Vec<String>,
341 pub bind: SocketAddr,
343 pub accept_compressed: Option<String>,
345 pub send_compressed: Option<String>,
347 pub max_decoding_message_size: usize,
349 pub max_encoding_message_size: usize,
351 pub max_channel_size: usize,
353 pub concurrency_limit_per_connection: usize,
355 pub timeout: MassaTime,
357 pub initial_stream_window_size: Option<u32>,
359 pub initial_connection_window_size: Option<u32>,
361 pub max_concurrent_streams: Option<u32>,
363 pub max_arguments: u64,
365 pub tcp_keepalive: Option<MassaTime>,
367 pub tcp_nodelay: bool,
369 pub http2_keepalive_interval: Option<MassaTime>,
371 pub http2_keepalive_timeout: Option<MassaTime>,
373 pub http2_adaptive_window: Option<bool>,
375 pub max_frame_size: Option<u32>,
377 pub draw_lookahead_period_count: u64,
379 pub max_block_ids_per_request: u32,
381 pub max_addresses_per_request: u32,
383 pub max_slot_ranges_per_request: u32,
385 pub max_endorsement_ids_per_request: u32,
387 pub max_operation_ids_per_request: u32,
389 pub max_datastore_entries_per_request: u64,
391 pub max_filters_per_request: u32,
393 pub max_query_items_per_request: u32,
395 pub certificate_authority_root_path: PathBuf,
397 pub server_certificate_path: PathBuf,
399 pub server_private_key_path: PathBuf,
401 pub client_certificate_authority_root_path: PathBuf,
403 pub client_certificate_path: PathBuf,
405 pub client_private_key_path: PathBuf,
407 pub max_datastore_keys_query: Option<u32>,
409 pub unidirectional_stream_interval_check: u64,
411}
412
413#[derive(Debug, Deserialize, Clone)]
415pub struct GrpcApiSettings {
416 pub public: GrpcSettings,
418 pub private: GrpcSettings,
420}
421
422#[derive(Debug, Deserialize, Clone)]
423pub struct VersioningSettings {
424 pub(crate) mip_stats_warn_announced_version: u32,
426}
427
428#[derive(Debug, Deserialize, Clone)]
429pub struct BlockDumpSettings {
430 pub(crate) block_dump_folder_path: PathBuf,
432 #[cfg(feature = "dump-block")]
433 pub(crate) max_blocks: u64,
435}
436
437#[cfg(test)]
438#[test]
439fn test_load_node_config() {
440 let _ = *SETTINGS;
441}