use super::*;
use crate::ProgramStorage;
impl<N: Network> Block<N> {
pub fn genesis<P: ProgramStorage<N>, R: Rng + CryptoRng>(
vm: &VM<N, P>,
private_key: &PrivateKey<N>,
rng: &mut R,
) -> Result<Self> {
let caller = Address::try_from(private_key)?;
let program_id = FromStr::from_str("credits.aleo")?;
let function_name = FromStr::from_str("genesis")?;
let inputs = [Value::from_str(&caller.to_string())?, Value::from_str("1_100_000_000_000_000_u64")?];
let authorization = vm.authorize(private_key, &program_id, function_name, &inputs, rng)?;
let transaction = Transaction::execute_authorization(vm, authorization, rng)?;
let transactions = Transactions::from(&[transaction]);
let header = Header::genesis(&transactions)?;
let previous_hash = N::BlockHash::default();
let block = Self::new(private_key, previous_hash, header, transactions, rng)?;
match block.is_genesis() {
true => Ok(block),
false => bail!("Failed to initialize a genesis block"),
}
}
pub fn is_genesis(&self) -> bool {
self.previous_hash == N::BlockHash::default()
&& self.header.is_genesis()
&& self.transactions.len() == 1
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_genesis() {
let block = crate::ledger::test_helpers::sample_genesis_block();
assert!(block.is_genesis());
}
}