Skip to main content

tycho_core/node/
config.rs

1use std::net::{IpAddr, Ipv4Addr};
2use std::path::Path;
3
4use serde::{Deserialize, Serialize};
5use tycho_network::{DhtConfig, NetworkConfig, OverlayConfig, PeerResolverConfig};
6use tycho_storage::StorageConfig;
7use tycho_util::config::PartialConfig;
8
9use crate::block_strider::{
10    ArchiveBlockProviderConfig, BlockchainBlockProviderConfig, StarterConfig,
11};
12use crate::blockchain_rpc::{BlockchainRpcClientConfig, BlockchainRpcServiceConfig};
13use crate::overlay_client::PublicOverlayClientConfig;
14#[cfg(feature = "s3")]
15use crate::s3::S3ClientConfig;
16use crate::storage::CoreStorageConfig;
17
18#[derive(Debug, Clone, Serialize, Deserialize, PartialConfig)]
19#[serde(default)]
20pub struct NodeBaseConfig {
21    /// Public IP address of the node.
22    ///
23    /// Default: resolved automatically.
24    #[important]
25    pub public_ip: Option<IpAddr>,
26
27    /// Ip address to listen on.
28    ///
29    /// Default: 0.0.0.0
30    #[important]
31    pub local_ip: IpAddr,
32
33    /// Default: 30000.
34    #[important]
35    pub port: u16,
36
37    pub network: NetworkConfig,
38
39    pub dht: DhtConfig,
40
41    pub peer_resolver: PeerResolverConfig,
42
43    pub overlay: OverlayConfig,
44
45    pub public_overlay_client: PublicOverlayClientConfig,
46
47    #[partial]
48    pub storage: StorageConfig,
49
50    #[partial]
51    pub core_storage: CoreStorageConfig,
52
53    #[partial]
54    pub starter: StarterConfig,
55
56    pub blockchain_rpc_client: BlockchainRpcClientConfig,
57
58    pub blockchain_rpc_service: BlockchainRpcServiceConfig,
59
60    pub archive_block_provider: ArchiveBlockProviderConfig,
61
62    pub blockchain_block_provider: BlockchainBlockProviderConfig,
63
64    #[cfg(feature = "s3")]
65    pub s3_client: Option<S3ClientConfig>,
66}
67
68impl Default for NodeBaseConfig {
69    fn default() -> Self {
70        Self {
71            public_ip: None,
72            local_ip: IpAddr::V4(Ipv4Addr::UNSPECIFIED),
73            port: 30000,
74            network: NetworkConfig::default(),
75            dht: DhtConfig::default(),
76            peer_resolver: PeerResolverConfig::default(),
77            overlay: OverlayConfig::default(),
78            public_overlay_client: PublicOverlayClientConfig::default(),
79            storage: StorageConfig::default(),
80            core_storage: CoreStorageConfig::default(),
81            starter: StarterConfig::default(),
82            blockchain_rpc_client: BlockchainRpcClientConfig::default(),
83            blockchain_rpc_service: BlockchainRpcServiceConfig::default(),
84            blockchain_block_provider: BlockchainBlockProviderConfig::default(),
85            archive_block_provider: ArchiveBlockProviderConfig::default(),
86
87            #[cfg(feature = "s3")]
88            s3_client: None,
89        }
90    }
91}
92
93impl NodeBaseConfig {
94    #[cfg(feature = "cli")]
95    pub async fn resolve_public_ip(&self) -> anyhow::Result<std::net::SocketAddr> {
96        let public_ip = tycho_util::cli::resolve_public_ip(self.public_ip).await?;
97        Ok(std::net::SocketAddr::new(public_ip, self.port))
98    }
99
100    pub fn with_relative_paths<P: AsRef<Path>>(mut self, base_dir: P) -> Self {
101        let base_dir = base_dir.as_ref();
102        self.storage.root_dir = base_dir.join(self.storage.root_dir);
103        self
104    }
105}