consensus_config/
parameters.rs1use std::{path::PathBuf, time::Duration};
5
6use mysten_network::Multiaddr;
7use serde::{Deserialize, Serialize};
8
9use crate::NetworkPublicKey;
10
11#[derive(Clone, Debug, Deserialize, Serialize)]
19pub struct Parameters {
20 #[serde(skip)]
23 pub db_path: PathBuf,
24
25 #[serde(default = "Parameters::default_leader_timeout")]
28 pub leader_timeout: Duration,
29
30 #[serde(default = "Parameters::default_min_round_delay")]
35 pub min_round_delay: Duration,
36
37 #[serde(default = "Parameters::default_max_forward_time_drift")]
39 pub max_forward_time_drift: Duration,
40
41 #[serde(default = "Parameters::default_max_blocks_per_sync")]
48 pub max_blocks_per_sync: usize,
49
50 #[serde(default = "Parameters::default_max_blocks_per_fetch")]
52 pub max_blocks_per_fetch: usize,
53
54 #[serde(default = "Parameters::default_sync_last_known_own_block_timeout")]
58 pub sync_last_known_own_block_timeout: Duration,
59
60 #[serde(default = "Parameters::default_round_prober_interval_ms")]
62 pub round_prober_interval_ms: u64,
63
64 #[serde(default = "Parameters::default_round_prober_request_timeout_ms")]
66 pub round_prober_request_timeout_ms: u64,
67
68 #[serde(default = "Parameters::default_propagation_delay_stop_proposal_threshold")]
72 pub propagation_delay_stop_proposal_threshold: u32,
73
74 #[serde(default = "Parameters::default_dag_state_cached_rounds")]
80 pub dag_state_cached_rounds: u32,
81
82 #[serde(default = "Parameters::default_commit_sync_parallel_fetches")]
85 pub commit_sync_parallel_fetches: usize,
86
87 #[serde(default = "Parameters::default_commit_sync_batch_size")]
91 pub commit_sync_batch_size: u32,
92
93 #[serde(default = "Parameters::default_commit_sync_batches_ahead")]
96 pub commit_sync_batches_ahead: usize,
97
98 #[serde(default = "Parameters::default_commit_sync_request_timeout")]
101 pub commit_sync_request_timeout: Duration,
102
103 #[serde(default = "Parameters::default_commit_sync_probe_timeout")]
106 pub commit_sync_probe_timeout: Duration,
107
108 #[serde(default = "TonicParameters::default")]
110 pub tonic: TonicParameters,
111
112 #[serde(default = "ObserverParameters::default")]
114 pub observer: ObserverParameters,
115
116 #[serde(default = "InternalParameters::default")]
118 pub internal: InternalParameters,
119
120 #[serde(skip)]
123 pub listen_address_override: Option<Multiaddr>,
124}
125
126impl Parameters {
127 pub(crate) fn default_leader_timeout() -> Duration {
128 Duration::from_millis(200)
129 }
130
131 pub(crate) fn default_min_round_delay() -> Duration {
132 if cfg!(msim) || std::env::var("__TEST_ONLY_CONSENSUS_USE_LONG_MIN_ROUND_DELAY").is_ok() {
133 Duration::from_millis(400)
137 } else if cfg!(test) {
138 Duration::from_millis(250)
140 } else {
141 Duration::from_millis(50)
142 }
143 }
144
145 pub(crate) fn default_max_forward_time_drift() -> Duration {
146 Duration::from_millis(500)
147 }
148
149 pub(crate) fn default_max_blocks_per_sync() -> usize {
150 if cfg!(msim) {
151 4
153 } else {
154 32
155 }
156 }
157
158 pub(crate) fn default_max_blocks_per_fetch() -> usize {
159 if cfg!(msim) {
160 10
162 } else {
163 1000
164 }
165 }
166
167 pub(crate) fn default_sync_last_known_own_block_timeout() -> Duration {
168 if cfg!(msim) {
169 Duration::from_millis(500)
170 } else {
171 Duration::from_secs(5)
174 }
175 }
176
177 pub(crate) fn default_round_prober_interval_ms() -> u64 {
178 if cfg!(msim) { 1000 } else { 5000 }
179 }
180
181 pub(crate) fn default_round_prober_request_timeout_ms() -> u64 {
182 if cfg!(msim) { 800 } else { 4000 }
183 }
184
185 pub(crate) fn default_propagation_delay_stop_proposal_threshold() -> u32 {
186 if cfg!(msim) { 2 } else { 5 }
188 }
189
190 pub(crate) fn default_dag_state_cached_rounds() -> u32 {
191 if cfg!(msim) {
192 5
194 } else {
195 500
196 }
197 }
198
199 pub(crate) fn default_commit_sync_parallel_fetches() -> usize {
200 8
201 }
202
203 pub(crate) fn default_commit_sync_batch_size() -> u32 {
204 if cfg!(msim) {
205 5
207 } else {
208 100
209 }
210 }
211
212 pub(crate) fn default_commit_sync_request_timeout() -> Duration {
213 Duration::from_secs(10)
214 }
215
216 pub(crate) fn default_commit_sync_probe_timeout() -> Duration {
217 Duration::from_secs(2)
218 }
219
220 pub(crate) fn default_commit_sync_batches_ahead() -> usize {
221 32
224 }
225}
226
227impl Default for Parameters {
228 fn default() -> Self {
229 Self {
230 db_path: PathBuf::default(),
231 leader_timeout: Parameters::default_leader_timeout(),
232 min_round_delay: Parameters::default_min_round_delay(),
233 max_forward_time_drift: Parameters::default_max_forward_time_drift(),
234 max_blocks_per_sync: Parameters::default_max_blocks_per_sync(),
235 max_blocks_per_fetch: Parameters::default_max_blocks_per_fetch(),
236 sync_last_known_own_block_timeout:
237 Parameters::default_sync_last_known_own_block_timeout(),
238 round_prober_interval_ms: Parameters::default_round_prober_interval_ms(),
239 round_prober_request_timeout_ms: Parameters::default_round_prober_request_timeout_ms(),
240 propagation_delay_stop_proposal_threshold:
241 Parameters::default_propagation_delay_stop_proposal_threshold(),
242 dag_state_cached_rounds: Parameters::default_dag_state_cached_rounds(),
243 commit_sync_parallel_fetches: Parameters::default_commit_sync_parallel_fetches(),
244 commit_sync_batch_size: Parameters::default_commit_sync_batch_size(),
245 commit_sync_batches_ahead: Parameters::default_commit_sync_batches_ahead(),
246 commit_sync_request_timeout: Parameters::default_commit_sync_request_timeout(),
247 commit_sync_probe_timeout: Parameters::default_commit_sync_probe_timeout(),
248 tonic: TonicParameters::default(),
249 observer: ObserverParameters::default(),
250 internal: InternalParameters::default(),
251 listen_address_override: None,
252 }
253 }
254}
255
256#[derive(Clone, Debug, Deserialize, Serialize)]
258pub struct PeerRecord {
259 #[serde(
261 serialize_with = "serialize_public_key_as_hex",
262 deserialize_with = "deserialize_public_key_from_hex"
263 )]
264 pub public_key: NetworkPublicKey,
265 pub address: Multiaddr,
267}
268
269fn serialize_public_key_as_hex<S>(key: &NetworkPublicKey, serializer: S) -> Result<S::Ok, S::Error>
270where
271 S: serde::Serializer,
272{
273 use fastcrypto::encoding::Encoding;
274 let hex_str = fastcrypto::encoding::Hex::encode(key.to_bytes());
275 serializer.serialize_str(&hex_str)
276}
277
278fn deserialize_public_key_from_hex<'de, D>(deserializer: D) -> Result<NetworkPublicKey, D::Error>
279where
280 D: serde::Deserializer<'de>,
281{
282 use fastcrypto::{encoding::Encoding, traits::ToFromBytes};
283 let hex_str = String::deserialize(deserializer)?;
284 let bytes = fastcrypto::encoding::Hex::decode(&hex_str).map_err(serde::de::Error::custom)?;
285 let inner_key = fastcrypto::ed25519::Ed25519PublicKey::from_bytes(bytes.as_ref())
286 .map_err(serde::de::Error::custom)?;
287 Ok(NetworkPublicKey::new(inner_key))
288}
289
290#[derive(Clone, Debug, Deserialize, Serialize)]
291pub struct TonicParameters {
292 #[serde(default = "TonicParameters::default_keepalive_interval")]
296 pub keepalive_interval: Duration,
297
298 #[serde(default = "TonicParameters::default_connection_buffer_size")]
302 pub connection_buffer_size: usize,
303
304 #[serde(default = "TonicParameters::default_excessive_message_size")]
308 pub excessive_message_size: usize,
309
310 #[serde(default = "TonicParameters::default_message_size_limit")]
316 pub message_size_limit: usize,
317}
318
319impl TonicParameters {
320 fn default_keepalive_interval() -> Duration {
321 Duration::from_secs(10)
322 }
323
324 fn default_connection_buffer_size() -> usize {
325 32 << 20
326 }
327
328 fn default_excessive_message_size() -> usize {
329 16 << 20
330 }
331
332 fn default_message_size_limit() -> usize {
333 64 << 20
334 }
335}
336
337impl Default for TonicParameters {
338 fn default() -> Self {
339 Self {
340 keepalive_interval: TonicParameters::default_keepalive_interval(),
341 connection_buffer_size: TonicParameters::default_connection_buffer_size(),
342 excessive_message_size: TonicParameters::default_excessive_message_size(),
343 message_size_limit: TonicParameters::default_message_size_limit(),
344 }
345 }
346}
347
348#[derive(Clone, Debug, Deserialize, Serialize)]
350pub struct ObserverParameters {
351 #[serde(default = "ObserverParameters::default_server_port")]
355 pub server_port: Option<u16>,
356
357 #[serde(default = "ObserverParameters::default_allowlist")]
362 pub allowlist: Vec<String>,
363
364 #[serde(default = "ObserverParameters::default_peers")]
369 pub peers: Vec<PeerRecord>,
370}
371
372impl ObserverParameters {
373 pub fn is_server_enabled(&self) -> bool {
374 self.server_port.is_some()
375 }
376
377 fn default_server_port() -> Option<u16> {
378 None
379 }
380
381 fn default_allowlist() -> Vec<String> {
382 Vec::new()
383 }
384
385 fn default_peers() -> Vec<PeerRecord> {
386 Vec::new()
387 }
388}
389
390impl Default for ObserverParameters {
391 fn default() -> Self {
392 Self {
393 server_port: ObserverParameters::default_server_port(),
394 allowlist: ObserverParameters::default_allowlist(),
395 peers: ObserverParameters::default_peers(),
396 }
397 }
398}
399
400#[derive(Clone, Debug, Deserialize, Serialize)]
402pub struct InternalParameters {
403 #[serde(default = "InternalParameters::default_skip_equivocation_validation")]
405 pub skip_equivocation_validation: bool,
406}
407
408impl InternalParameters {
409 fn default_skip_equivocation_validation() -> bool {
410 false
411 }
412}
413
414impl Default for InternalParameters {
415 fn default() -> Self {
416 Self {
417 skip_equivocation_validation: InternalParameters::default_skip_equivocation_validation(
418 ),
419 }
420 }
421}