mod metadata;
pub use metadata::*;
mod leaf;
pub use leaf::*;
mod merkle;
pub use merkle::*;
mod bytes;
mod genesis;
mod serialize;
mod string;
use crate::ledger::Transactions;
use console::{
collections::merkle_tree::MerklePath,
network::{prelude::*, BHPMerkleTree},
types::Field,
};
#[derive(Copy, Clone, PartialEq, Eq, Hash)]
pub struct Header<N: Network> {
previous_state_root: Field<N>,
transactions_root: Field<N>,
metadata: Metadata<N>,
}
impl<N: Network> Header<N> {
pub fn from(previous_state_root: Field<N>, transactions_root: Field<N>, metadata: Metadata<N>) -> Result<Self> {
let header = Self { previous_state_root, transactions_root, metadata };
match header.is_valid() {
true => Ok(header),
false => bail!("Invalid block header: {:?}", header),
}
}
pub fn is_valid(&self) -> bool {
match self.height() == 0u32 {
true => self.is_genesis(),
false => {
self.previous_state_root != Field::zero()
&& self.transactions_root != Field::zero()
&& self.metadata.is_valid()
}
}
}
pub const fn previous_state_root(&self) -> &Field<N> {
&self.previous_state_root
}
pub const fn transactions_root(&self) -> &Field<N> {
&self.transactions_root
}
pub const fn metadata(&self) -> &Metadata<N> {
&self.metadata
}
pub const fn network(&self) -> u16 {
self.metadata.network()
}
pub const fn round(&self) -> u64 {
self.metadata.round()
}
pub const fn height(&self) -> u32 {
self.metadata.height()
}
pub const fn coinbase_target(&self) -> u64 {
self.metadata.coinbase_target()
}
pub const fn proof_target(&self) -> u64 {
self.metadata.proof_target()
}
pub const fn timestamp(&self) -> i64 {
self.metadata.timestamp()
}
}