//! Configuration for semantic verification which is run in parallel. use serde::{Deserialize, Serialize}; /// Configuration for parallel semantic verification: /// #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] #[serde( deny_unknown_fields, default, from = "InnerConfig", into = "InnerConfig" )] pub struct Config { /// Should Zebra make sure that it follows the consensus chain while syncing? /// This is a developer-only option. /// /// # Security /// /// Disabling this option leaves your node vulnerable to some kinds of chain-based attacks. /// Zebra regularly updates its checkpoints to ensure nodes are following the best chain. /// /// # Details /// /// This option is `true` by default, because it prevents some kinds of chain attacks. /// /// Disabling this option makes Zebra start full validation earlier. /// It is slower and less secure. /// /// Zebra requires some checkpoints to simplify validation of legacy network upgrades. /// Required checkpoints are always active, even when this option is `false`. /// /// # Deprecation /// /// For security reasons, this option might be deprecated or ignored in a future Zebra /// release. pub checkpoint_sync: bool, } impl From for Config { fn from( InnerConfig { checkpoint_sync, .. }: InnerConfig, ) -> Self { Self { checkpoint_sync } } } impl From for InnerConfig { fn from(Config { checkpoint_sync }: Config) -> Self { Self { checkpoint_sync, _debug_skip_parameter_preload: false, } } } /// Inner consensus configuration for backwards compatibility with older `zebrad.toml` files, /// which contain fields that have been removed. /// /// Rust API callers should use [`Config`]. #[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)] #[serde(deny_unknown_fields, default)] pub struct InnerConfig { /// See [`Config`] for more details. pub checkpoint_sync: bool, #[serde(skip_serializing, rename = "debug_skip_parameter_preload")] /// Unused config field for backwards compatibility. pub _debug_skip_parameter_preload: bool, } // we like our default configs to be explicit #[allow(unknown_lints)] #[allow(clippy::derivable_impls)] impl Default for Config { fn default() -> Self { Self { checkpoint_sync: true, } } } impl Default for InnerConfig { fn default() -> Self { Self { checkpoint_sync: Config::default().checkpoint_sync, _debug_skip_parameter_preload: false, } } }