tycho_core/
global_config.rs1use std::path::Path;
2
3use anyhow::Result;
4use serde::{Deserialize, Serialize};
5use tycho_network::{OverlayId, PeerInfo};
6use tycho_types::cell::HashBytes;
7use tycho_types::models::{BlockId, ConsensusConfig, GenesisInfo, ShardIdent};
8
9use crate::proto::blockchain::OverlayIdData;
10
11#[derive(Default, Clone, Debug, Serialize, Deserialize)]
12pub struct GlobalConfig {
13 pub bootstrap_peers: Vec<PeerInfo>,
14 pub zerostate: ZerostateId,
15 #[serde(default)]
16 pub mempool: Option<MempoolGlobalConfig>,
17}
18
19impl GlobalConfig {
20 pub fn from_file<P: AsRef<Path>>(path: P) -> Result<Self> {
21 tycho_util::serde_helpers::load_json_from_file(path)
22 }
23
24 pub fn validate(&self, now: u32) -> Result<()> {
25 for peer in &self.bootstrap_peers {
26 anyhow::ensure!(peer.verify(now), "invalid peer info for {}", peer.id);
27 }
28 Ok(())
29 }
30}
31
32#[derive(Default, Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
33pub struct ZerostateId {
34 #[serde(default)]
35 pub seqno: u32,
36 pub root_hash: HashBytes,
37 pub file_hash: HashBytes,
38}
39
40impl ZerostateId {
41 pub fn as_block_id(&self) -> BlockId {
42 BlockId {
43 shard: ShardIdent::MASTERCHAIN,
44 seqno: self.seqno,
45 root_hash: self.root_hash,
46 file_hash: self.file_hash,
47 }
48 }
49
50 pub fn compute_public_overlay_id(&self) -> OverlayId {
51 OverlayId(tl_proto::hash(OverlayIdData {
52 zerostate_root_hash: self.root_hash.0,
53 zerostate_file_hash: self.file_hash.0,
54 }))
55 }
56}
57
58#[derive(Clone, Debug, Serialize, Deserialize)]
64pub struct MempoolGlobalConfig {
65 #[serde(flatten)]
69 pub genesis_info: GenesisInfo,
70 #[serde(flatten)]
81 pub consensus_config: Option<ConsensusConfig>,
82}