use super::*;
impl<N: Network> Header<N> {
pub fn genesis(transactions: &Transactions<N>) -> Result<Self> {
let previous_state_root = Field::zero();
let transactions_root = transactions.to_root()?;
let metadata = Metadata::genesis()?;
Self::from(previous_state_root, transactions_root, metadata)
}
pub fn is_genesis(&self) -> bool {
self.previous_state_root == Field::zero()
&& self.transactions_root != Field::zero()
&& self.metadata.is_genesis()
}
}
#[cfg(test)]
mod tests {
use super::*;
use console::network::Testnet3;
type CurrentNetwork = Testnet3;
fn get_expected_size<N: Network>() -> usize {
(Field::<N>::size_in_bytes() * 2)
+ 2 + 4 + 8 + 8 + 8 + 8
+ 2 + 2
}
#[test]
fn test_genesis_header_size() {
let expected_size = get_expected_size::<CurrentNetwork>();
let genesis_header = *crate::ledger::test_helpers::sample_genesis_block().header();
assert_eq!(expected_size, genesis_header.to_bytes_le().unwrap().len());
}
#[test]
fn test_genesis_header() {
let header = *crate::ledger::test_helpers::sample_genesis_block().header();
assert!(header.is_genesis());
assert_eq!(*header.previous_state_root(), Field::zero());
assert_eq!(header.network(), CurrentNetwork::ID);
assert_eq!(header.height(), 0);
assert_eq!(header.round(), 0);
assert_eq!(header.coinbase_target(), u64::MAX);
assert_eq!(header.proof_target(), u64::MAX);
assert_eq!(header.timestamp(), 0);
assert_ne!(*header.transactions_root(), Field::zero());
}
}