snarkvm_ledger_block/header/metadata/
genesis.rs1use super::*;
17
18use snarkvm_utilities::ensure_equals;
19
20const GENESIS_ROUND: u64 = 0;
21const GENESIS_HEIGHT: u32 = 0;
22const GENESIS_CUMULATIVE_WEIGHT: u128 = 0;
23const GENESIS_CUMULATIVE_PROOF_TARGET: u128 = 0;
24
25impl<N: Network> Metadata<N> {
26 pub fn genesis() -> Result<Self> {
28 Self::new(
29 N::ID,
30 GENESIS_ROUND,
31 GENESIS_HEIGHT,
32 GENESIS_CUMULATIVE_WEIGHT,
33 GENESIS_CUMULATIVE_PROOF_TARGET,
34 N::GENESIS_COINBASE_TARGET,
35 N::GENESIS_PROOF_TARGET,
36 N::GENESIS_COINBASE_TARGET,
37 N::GENESIS_TIMESTAMP,
38 N::GENESIS_TIMESTAMP,
39 )
40 .with_context(|| "Failed to create genesis block")
41 }
42
43 pub fn is_genesis(&self) -> Result<bool> {
47 if self.round != 0u64 {
49 return Ok(false);
50 }
51
52 ensure!(self.network == N::ID, "Invalid network ID");
55 ensure!(self.round == GENESIS_ROUND, "Genesis block not at genesis round");
56 ensure!(self.height == GENESIS_HEIGHT, "Genesis block not at genesis height");
57
58 ensure_equals!(self.cumulative_weight, GENESIS_CUMULATIVE_WEIGHT, "Invalid cumulative weight");
59 ensure_equals!(
60 self.cumulative_proof_target,
61 GENESIS_CUMULATIVE_PROOF_TARGET,
62 "Invalid cumulative proof target"
63 );
64 ensure_equals!(self.timestamp, N::GENESIS_TIMESTAMP, "Invalid timestamp");
65 ensure_equals!(self.last_coinbase_timestamp, N::GENESIS_TIMESTAMP, "Invalid last coinbase timestamp");
66 ensure_equals!(self.coinbase_target, N::GENESIS_COINBASE_TARGET, "Invalid coinbase target for genesis block");
67 ensure_equals!(
68 self.last_coinbase_target,
69 N::GENESIS_COINBASE_TARGET,
70 "Invalid last coinbase target for genesis block"
71 );
72 ensure_equals!(self.proof_target, N::GENESIS_PROOF_TARGET, "Invalid proof target for genesis block");
73
74 Ok(true)
75 }
76}
77
78#[cfg(test)]
79mod tests {
80 use super::*;
81 use console::network::MainnetV0;
82
83 type CurrentNetwork = MainnetV0;
84
85 fn get_expected_size() -> usize {
88 1 + 8 + 4 + 16 + 16 + 8 + 8 + 8 + 8 + 8
90 + 2
92 }
93
94 #[test]
95 fn test_genesis_metadata_size() {
96 let rng = &mut TestRng::default();
97
98 let expected_size = get_expected_size();
100 let genesis_metadata = crate::header::metadata::test_helpers::sample_block_metadata(rng);
102 assert_eq!(expected_size, genesis_metadata.to_bytes_le().unwrap().len());
104 }
105
106 #[test]
107 fn test_genesis_metadata() {
108 let rng = &mut TestRng::default();
109
110 let metadata = crate::header::metadata::test_helpers::sample_block_metadata(rng);
112 assert!(metadata.is_genesis().unwrap());
114
115 assert_eq!(metadata.network(), CurrentNetwork::ID);
117 assert_eq!(metadata.round(), 0);
118 assert_eq!(metadata.height(), 0);
119 assert_eq!(metadata.cumulative_weight(), 0);
120 assert_eq!(metadata.cumulative_proof_target(), 0);
121 assert_eq!(metadata.coinbase_target(), CurrentNetwork::GENESIS_COINBASE_TARGET);
122 assert_eq!(metadata.proof_target(), CurrentNetwork::GENESIS_PROOF_TARGET);
123 assert_eq!(metadata.last_coinbase_target(), CurrentNetwork::GENESIS_COINBASE_TARGET);
124 assert_eq!(metadata.last_coinbase_timestamp(), CurrentNetwork::GENESIS_TIMESTAMP);
125 assert_eq!(metadata.timestamp(), CurrentNetwork::GENESIS_TIMESTAMP);
126 }
127}