Skip to main content

drive/
config.rs

1//! Drive Configuration File
2//!
3
4use dpp::dashcore::Network;
5use dpp::fee::epoch::DEFAULT_EPOCHS_PER_ERA;
6#[cfg(feature = "serde")]
7use serde::{Deserialize, Serialize};
8
9/// Boolean if GroveDB batching consistency verification is enabled by default
10pub const DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED: bool = false;
11/// Boolean if GroveDB has_raw in enabled by default
12pub const DEFAULT_GROVE_HAS_RAW_ENABLED: bool = true;
13/// Boolean if verification of GroveDB should be run on startup
14pub const DEFAULT_VERIFY_GROVE_ON_STARTUP: bool = false;
15/// The default default query limit
16pub const DEFAULT_QUERY_LIMIT: u16 = 100;
17/// The default max query limit
18pub const DEFAULT_MAX_QUERY_LIMIT: u16 = 100;
19/// Default maximum number of contracts in cache
20pub const DEFAULT_DATA_CONTRACTS_CACHE_SIZE: u64 = 500;
21/// The default length of an epoch in seconds: mainnet's, and the node's `ExecutionConfig`
22/// default
23pub const DEFAULT_EPOCH_TIME_LENGTH_S: u64 = 788400;
24
25#[derive(Clone, Debug)]
26#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
27/// Drive configuration struct
28pub struct DriveConfig {
29    /// Boolean if batching consistency verification is enabled
30    #[cfg_attr(
31        feature = "serde",
32        serde(default = "default_batching_consistency_verification")
33    )]
34    pub batching_consistency_verification: bool,
35
36    /// Boolean if has_raw is enabled
37    #[cfg_attr(feature = "serde", serde(default = "default_has_raw_enabled"))]
38    pub has_raw_enabled: bool,
39
40    /// Boolean if GroveDB verification should happen on startup
41    #[cfg_attr(
42        feature = "serde",
43        serde(default = "default_grove_verify_on_startup_enabled")
44    )]
45    pub grovedb_verify_on_startup: bool,
46
47    /// The default returned count if no limit is set
48    #[cfg_attr(
49        feature = "serde",
50        serde(
51            default = "default_default_query_limit",
52            deserialize_with = "from_str_or_number"
53        )
54    )]
55    pub default_query_limit: u16,
56
57    /// The default returned count if no limit is set
58    #[cfg_attr(
59        feature = "serde",
60        serde(
61            default = "default_epochs_per_era",
62            deserialize_with = "from_str_or_number"
63        )
64    )]
65    pub epochs_per_era: u16,
66
67    /// The limit for user defined queries
68    #[cfg_attr(
69        feature = "serde",
70        serde(
71            default = "default_max_query_limit",
72            deserialize_with = "from_str_or_number"
73        )
74    )]
75    pub max_query_limit: u16,
76
77    /// Default genesis time
78    #[cfg_attr(feature = "serde", serde(default))]
79    pub default_genesis_time: Option<u64>,
80
81    /// Maximum number of contracts in global cache
82    #[cfg_attr(
83        feature = "serde",
84        serde(
85            default = "default_data_contracts_cache_size",
86            deserialize_with = "from_str_or_number"
87        )
88    )]
89    pub data_contracts_global_cache_size: u64,
90
91    /// Maximum number of contracts in block candidate cache
92    #[cfg_attr(
93        feature = "serde",
94        serde(
95            default = "default_data_contracts_cache_size",
96            deserialize_with = "from_str_or_number"
97        )
98    )]
99    pub data_contracts_block_cache_size: u64,
100
101    /// GroveDB visualizer address
102    #[cfg(feature = "grovedbg")]
103    #[cfg_attr(
104        feature = "serde",
105        serde(
106            default = "default_grovedb_visualizer_address",
107            deserialize_with = "from_str_to_socket_address"
108        )
109    )]
110    pub grovedb_visualizer_address: std::net::SocketAddr,
111
112    /// Enable GroveDB visualizer
113    #[cfg(feature = "grovedbg")]
114    #[cfg_attr(
115        feature = "serde",
116        serde(default, deserialize_with = "from_str_to_bool")
117    )]
118    pub grovedb_visualizer_enabled: bool,
119
120    /// The network type
121    #[cfg_attr(
122        feature = "serde",
123        serde(skip_deserializing, default = "DriveConfig::default_network")
124    )]
125    pub network: Network,
126
127    /// How long an epoch lasts, in seconds. Neither read nor written with the rest of the
128    /// config: the node sets it from its execution config's `epoch_time_length_s` when it
129    /// opens Drive, so there is one source. Drive reads it only to count the epochs a
130    /// document whose type declares a `ttl` has left to live, which its storage fee is paid
131    /// out over; the price itself follows the fee schedule's fixed period.
132    #[cfg_attr(
133        feature = "serde",
134        serde(skip, default = "default_epoch_time_length_s")
135    )]
136    pub epoch_time_length_s: u64,
137}
138
139// TODO: some weird envy behavior requires this to exist
140#[cfg(all(feature = "serde", feature = "grovedbg"))]
141fn from_str_to_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
142where
143    D: serde::Deserializer<'de>,
144{
145    let s = String::deserialize(deserializer)?;
146    s.parse().map_err(serde::de::Error::custom)
147}
148
149#[cfg(feature = "serde")]
150fn from_str_or_number<'de, D, T>(deserializer: D) -> Result<T, D::Error>
151where
152    D: serde::Deserializer<'de>,
153    T: serde::Deserialize<'de> + std::str::FromStr,
154    <T as std::str::FromStr>::Err: std::fmt::Display,
155{
156    use serde::de::Error;
157
158    let s = String::deserialize(deserializer)?;
159    s.parse::<T>().map_err(Error::custom)
160}
161
162#[cfg(all(feature = "serde", feature = "grovedbg"))]
163fn from_str_to_socket_address<'de, D>(deserializer: D) -> Result<std::net::SocketAddr, D::Error>
164where
165    D: serde::Deserializer<'de>,
166{
167    let s = String::deserialize(deserializer)?;
168    s.parse().map_err(serde::de::Error::custom)
169}
170
171const fn default_batching_consistency_verification() -> bool {
172    DEFAULT_GROVE_BATCHING_CONSISTENCY_VERIFICATION_ENABLED
173}
174
175const fn default_has_raw_enabled() -> bool {
176    DEFAULT_GROVE_HAS_RAW_ENABLED
177}
178
179const fn default_grove_verify_on_startup_enabled() -> bool {
180    DEFAULT_VERIFY_GROVE_ON_STARTUP
181}
182
183const fn default_default_query_limit() -> u16 {
184    DEFAULT_QUERY_LIMIT
185}
186
187const fn default_epochs_per_era() -> u16 {
188    DEFAULT_EPOCHS_PER_ERA
189}
190
191const fn default_epoch_time_length_s() -> u64 {
192    DEFAULT_EPOCH_TIME_LENGTH_S
193}
194
195const fn default_max_query_limit() -> u16 {
196    DEFAULT_MAX_QUERY_LIMIT
197}
198
199const fn default_data_contracts_cache_size() -> u64 {
200    DEFAULT_DATA_CONTRACTS_CACHE_SIZE
201}
202
203/// The default grovedb visualizer_address
204pub fn default_grovedb_visualizer_address() -> std::net::SocketAddr {
205    "127.0.0.1:8083".parse().unwrap()
206}
207
208impl Default for DriveConfig {
209    fn default() -> Self {
210        DriveConfig {
211            batching_consistency_verification: default_batching_consistency_verification(),
212            has_raw_enabled: default_has_raw_enabled(),
213            grovedb_verify_on_startup: default_grove_verify_on_startup_enabled(),
214            default_query_limit: default_default_query_limit(),
215            epochs_per_era: default_epochs_per_era(),
216            max_query_limit: default_max_query_limit(),
217            default_genesis_time: None,
218            data_contracts_global_cache_size: default_data_contracts_cache_size(),
219            data_contracts_block_cache_size: default_data_contracts_cache_size(),
220            #[cfg(feature = "grovedbg")]
221            grovedb_visualizer_address: default_grovedb_visualizer_address(),
222            #[cfg(feature = "grovedbg")]
223            grovedb_visualizer_enabled: false,
224            network: Network::Mainnet,
225            epoch_time_length_s: default_epoch_time_length_s(),
226        }
227    }
228}
229
230impl DriveConfig {
231    /// The default network type for mainnet
232    pub fn default_network() -> Network {
233        Network::Mainnet
234    }
235
236    /// The default testnet configuration
237    pub fn default_testnet() -> Self {
238        Self {
239            network: Network::Testnet,
240            ..Default::default()
241        }
242    }
243}