saito_core/core/util/
configuration.rs1use 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}