saito_core/core/util/
configuration.rs

1use std::fmt::Debug;
2
3use crate::core::defs::Currency;
4use crate::core::defs::{BlockId, Timestamp};
5use serde::Deserialize;
6use serde::Serialize;
7
8#[derive(Deserialize, Serialize, Debug, Clone, Eq, PartialEq)]
9pub struct PeerConfig {
10    pub host: String,
11    pub port: u16,
12    pub protocol: String,
13    pub synctype: String,
14}
15
16#[derive(Deserialize, Serialize, Debug, Clone)]
17pub struct Endpoint {
18    pub host: String,
19    pub port: u16,
20    pub protocol: String,
21}
22fn get_default_genesis_period() -> Timestamp {
23    #[cfg(test)]
24    return 10;
25
26    #[cfg(not(test))]
27    return 100_000;
28}
29fn get_default_heartbeat_period_ms() -> Timestamp {
30    5_000
31}
32fn get_default_prune_after_blocks() -> u64 {
33    8
34}
35fn get_default_max_staker_recursions() -> BlockId {
36    3
37}
38fn get_default_block_fetch_batch_size() -> u64 {
39    1000
40}
41fn get_default_thread_sleep_time() -> Timestamp {
42    5_000
43}
44fn get_default_reconnection_wait_time() -> Timestamp {
45    10_000
46}
47fn get_default_stat_timer() -> Timestamp {
48    5_000
49}
50fn get_default_social_stake() -> Timestamp {
51    return 0;
52}
53fn get_default_social_stake_period() -> Timestamp {
54    return 60;
55}
56#[derive(Deserialize, Serialize, Debug, Clone)]
57pub struct Server {
58    #[serde(default)]
59    pub host: String,
60    #[serde(default)]
61    pub port: u16,
62    #[serde(default)]
63    pub protocol: String,
64    pub endpoint: Endpoint,
65    #[serde(default)]
66    pub verification_threads: u16,
67    #[serde(default)]
68    pub channel_size: u64,
69    #[serde(default = "get_default_stat_timer")]
70    pub stat_timer_in_ms: Timestamp,
71    #[serde(default = "get_default_thread_sleep_time")]
72    pub thread_sleep_time_in_ms: Timestamp,
73    #[serde(default = "get_default_block_fetch_batch_size")]
74    pub block_fetch_batch_size: u64,
75    #[serde(default = "get_default_reconnection_wait_time")]
76    pub reconnection_wait_time: Timestamp,
77}
78
79#[derive(Deserialize, Debug, Clone, Serialize, Default)]
80pub struct BlockchainConfig {
81    #[serde(default)]
82    pub last_block_hash: String,
83    #[serde(default)]
84    pub last_block_id: BlockId,
85    #[serde(default)]
86    pub last_timestamp: Timestamp,
87    #[serde(default)]
88    pub genesis_block_id: BlockId,
89    #[serde(default)]
90    pub genesis_timestamp: Timestamp,
91    #[serde(default)]
92    pub lowest_acceptable_timestamp: Timestamp,
93    #[serde(default)]
94    pub lowest_acceptable_block_hash: String,
95    #[serde(default)]
96    pub lowest_acceptable_block_id: BlockId,
97    #[serde(default)]
98    pub fork_id: String,
99    #[serde(skip)]
100    pub initial_loading_completed: bool,
101    #[serde(default = "get_default_issuance_writing_block_interval")]
102    pub issuance_writing_block_interval: BlockId,
103}
104
105pub fn get_default_issuance_writing_block_interval() -> BlockId {
106    10
107}
108
109#[derive(Deserialize, Debug, Clone, Serialize)]
110pub struct ConsensusConfig {
111    #[serde(default = "get_default_genesis_period")]
112    pub genesis_period: Timestamp,
113    #[serde(default = "get_default_heartbeat_period_ms")]
114    pub heartbeat_interval: Timestamp,
115    #[serde(default = "get_default_prune_after_blocks")]
116    pub prune_after_blocks: u64,
117    #[serde(default = "get_default_max_staker_recursions")]
118    pub max_staker_recursions: BlockId,
119    #[serde(default = "get_default_social_stake")]
120    pub default_social_stake: Currency,
121    #[serde(default = "get_default_social_stake_period")]
122    pub default_social_stake_period: BlockId,
123}
124
125impl Default for ConsensusConfig {
126    fn default() -> Self {
127        ConsensusConfig {
128            genesis_period: get_default_genesis_period(),
129            heartbeat_interval: get_default_heartbeat_period_ms(),
130            prune_after_blocks: 8,
131            max_staker_recursions: 3,
132            default_social_stake: get_default_social_stake(),
133            default_social_stake_period: get_default_social_stake_period(),
134        }
135    }
136}
137
138pub trait Configuration: Debug {
139    fn get_server_configs(&self) -> Option<&Server>;
140    fn get_peer_configs(&self) -> &Vec<PeerConfig>;
141    fn get_blockchain_configs(&self) -> &BlockchainConfig;
142    fn get_block_fetch_url(&self) -> String;
143    fn is_spv_mode(&self) -> bool;
144    fn is_browser(&self) -> bool;
145    fn replace(&mut self, config: &dyn Configuration);
146    fn get_consensus_config(&self) -> Option<&ConsensusConfig>;
147}
148
149impl ConsensusConfig {
150    pub fn get_ring_buffer_length(&self) -> BlockId {
151        self.genesis_period * 2
152    }
153}