ckb_chain_spec/
hardfork.rs

1//! Hard forks parameters.
2
3use ckb_constant::hardfork::{mainnet, testnet};
4use ckb_types::core::{
5    EpochNumber,
6    hardfork::{CKB2021, CKB2021Builder, CKB2023, CKB2023Builder, HardForks},
7};
8use serde::{Deserialize, Serialize};
9
10/// Hard forks parameters for spec.
11#[derive(Default, Clone, PartialEq, Eq, Debug, Serialize, Deserialize)]
12#[serde(deny_unknown_fields)]
13pub struct HardForkConfig {
14    /// ckb 2023 epoch
15    pub ckb2023: Option<EpochNumber>,
16}
17
18impl HardForkConfig {
19    /// If all parameters which have been set are correct for mainnet, then
20    /// sets all `None` to default values, otherwise, return an `Err`.
21    pub fn complete_mainnet(&self) -> Result<HardForks, String> {
22        let mut ckb2021 = CKB2021::new_builder();
23        ckb2021 = self.update_2021(
24            ckb2021,
25            mainnet::CKB2021_START_EPOCH,
26            mainnet::RFC0028_RFC0032_RFC0033_RFC0034_START_EPOCH,
27        )?;
28
29        Ok(HardForks {
30            ckb2021: ckb2021.build()?,
31            ckb2023: CKB2023::new_mirana().as_builder().build()?,
32        })
33    }
34
35    /// If all parameters which have been set are correct for testnet, then
36    /// sets all `None` to default values, otherwise, return an `Err`.
37    pub fn complete_testnet(&self) -> Result<HardForks, String> {
38        let mut ckb2021 = CKB2021::new_builder();
39        ckb2021 = self.update_2021(
40            ckb2021,
41            testnet::CKB2021_START_EPOCH,
42            testnet::RFC0028_RFC0032_RFC0033_RFC0034_START_EPOCH,
43        )?;
44        let mut ckb2023 = CKB2023::new_builder();
45        ckb2023 = self.update_2023(ckb2023, testnet::CKB2023_START_EPOCH)?;
46
47        Ok(HardForks {
48            ckb2021: ckb2021.build()?,
49            ckb2023: ckb2023.build()?,
50        })
51    }
52
53    fn update_2021(
54        &self,
55        builder: CKB2021Builder,
56        ckb2021: EpochNumber,
57        rfc_0028_0032_0033_0034_start: EpochNumber,
58    ) -> Result<CKB2021Builder, String> {
59        let builder = builder
60            .rfc_0028(rfc_0028_0032_0033_0034_start)
61            .rfc_0029(ckb2021)
62            .rfc_0030(ckb2021)
63            .rfc_0031(ckb2021)
64            .rfc_0032(rfc_0028_0032_0033_0034_start)
65            .rfc_0036(ckb2021)
66            .rfc_0038(ckb2021);
67        Ok(builder)
68    }
69
70    fn update_2023(
71        &self,
72        builder: CKB2023Builder,
73        ckb2023: EpochNumber,
74    ) -> Result<CKB2023Builder, String> {
75        let builder = builder.rfc_0048(ckb2023).rfc_0049(ckb2023);
76        Ok(builder)
77    }
78
79    /// Converts to a hard fork switch.
80    ///
81    /// Enable features which are set to `None` at the dev default config.
82    pub fn complete_with_dev_default(&self) -> Result<HardForks, String> {
83        let ckb2021 = CKB2021::new_dev_default();
84
85        let ckb2023 = if let Some(epoch) = self.ckb2023 {
86            CKB2023::new_with_specified(epoch)
87        } else {
88            CKB2023::new_dev_default()
89        };
90
91        Ok(HardForks { ckb2021, ckb2023 })
92    }
93}