linera_core/chain_worker/config.rs
1// Copyright (c) Zefchain Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4//! Configuration parameters for the chain worker.
5
6use std::{collections::HashSet, sync::Arc};
7
8use linera_base::{crypto::ValidatorSecretKey, identifiers::ChainId, time::Duration};
9
10use crate::CHAIN_INFO_MAX_RECEIVED_LOG_ENTRIES;
11
12/// Configuration parameters for the chain worker and its owning
13/// [`WorkerState`][`crate::worker::WorkerState`].
14#[derive(Clone)]
15pub struct ChainWorkerConfig {
16 /// A name used for logging.
17 pub nickname: String,
18 /// The signature key pair of the validator. The key may be missing for replicas
19 /// without voting rights (possibly with a partial view of chains).
20 pub key_pair: Option<Arc<ValidatorSecretKey>>,
21 /// Whether inactive chains are allowed in storage.
22 pub allow_inactive_chains: bool,
23 /// Whether new messages from deprecated epochs are allowed.
24 pub allow_messages_from_deprecated_epochs: bool,
25 /// Whether the user application services should be long-lived.
26 pub long_lived_services: bool,
27 /// Blocks with a timestamp this far in the future will still be accepted, but the validator
28 /// will wait until that timestamp before voting.
29 pub block_time_grace_period: Duration,
30 /// Idle chain workers free their memory after this duration without requests.
31 /// `None` means no expiry (handle lives forever).
32 pub ttl: Option<Duration>,
33 /// TTL for sender chains. `None` means no expiry.
34 pub sender_chain_ttl: Option<Duration>,
35 /// The size to truncate receive log entries in chain info responses.
36 pub chain_info_max_received_log_entries: usize,
37 /// Maximum number of entries in the block cache.
38 pub block_cache_size: usize,
39 /// Maximum number of entries in the execution state cache.
40 pub execution_state_cache_size: usize,
41 /// Chain IDs whose incoming bundles should be processed first.
42 pub priority_bundle_origins: HashSet<ChainId>,
43 /// Chain IDs whose incoming bundles should be ignored.
44 pub ignored_bundle_origins: HashSet<ChainId>,
45 /// Maximum estimated serialized size of bundles in a single `UpdateRecipient`
46 /// cross-chain message. When exceeded, the bundles are split into multiple requests.
47 /// Defaults to `usize::MAX` (no chunking).
48 pub cross_chain_message_chunk_limit: usize,
49 /// Whether to attempt recovery via `RevertConfirm` when an inbox gap is detected.
50 pub allow_revert_confirm: bool,
51 /// If set, reset the chain state and re-execute all blocks when the chain
52 /// state is detected to be corrupted — but only if the given duration has
53 /// elapsed since block 0 was last executed (to prevent reset loops).
54 pub reset_on_corrupted_chain_state: Option<Duration>,
55 /// Optional whitelist restricting which chains are eligible for the
56 /// `allow_revert_confirm` and `reset_on_corrupted_chain_state` recovery
57 /// mechanisms. If `None`, every chain is eligible (subject to the
58 /// respective feature flag). If `Some`, only chains in the set are.
59 pub recovery_whitelist: Option<HashSet<ChainId>>,
60}
61
62impl ChainWorkerConfig {
63 /// Configures the `key_pair` in this [`ChainWorkerConfig`].
64 pub fn with_key_pair(mut self, key_pair: Option<ValidatorSecretKey>) -> Self {
65 self.key_pair = key_pair.map(Arc::new);
66 self
67 }
68
69 /// Gets a reference to the [`ValidatorSecretKey`], if available.
70 pub fn key_pair(&self) -> Option<&ValidatorSecretKey> {
71 self.key_pair.as_ref().map(Arc::as_ref)
72 }
73
74 /// Returns whether `chain_id` is allowed to attempt the `RevertConfirm` and
75 /// corrupted-state-reset recovery mechanisms.
76 pub(crate) fn recovery_allowed_for(&self, chain_id: &ChainId) -> bool {
77 self.recovery_whitelist
78 .as_ref()
79 .is_none_or(|set| set.contains(chain_id))
80 }
81}
82
83impl Default for ChainWorkerConfig {
84 fn default() -> Self {
85 Self {
86 nickname: String::new(),
87 key_pair: None,
88 allow_inactive_chains: false,
89 allow_messages_from_deprecated_epochs: false,
90 long_lived_services: false,
91 block_time_grace_period: Default::default(),
92 ttl: None,
93 sender_chain_ttl: None,
94 chain_info_max_received_log_entries: CHAIN_INFO_MAX_RECEIVED_LOG_ENTRIES,
95 block_cache_size: crate::worker::DEFAULT_BLOCK_CACHE_SIZE,
96 execution_state_cache_size: crate::worker::DEFAULT_EXECUTION_STATE_CACHE_SIZE,
97 priority_bundle_origins: HashSet::new(),
98 ignored_bundle_origins: HashSet::new(),
99 cross_chain_message_chunk_limit: usize::MAX,
100 allow_revert_confirm: false,
101 reset_on_corrupted_chain_state: None,
102 recovery_whitelist: None,
103 }
104 }
105}