ckb-verification 1.1.1

CKB verification
Documentation
use crate::{NumberError, UnknownParentError, genesis_verifier::GenesisVerifier};
use ckb_chain_spec::consensus::{Consensus, ConsensusBuilder};
use ckb_error::assert_error_eq;
use ckb_types::core::EpochNumberWithFraction;
use ckb_verification_traits::Verifier;

#[test]
pub fn test_genesis_non_zero_number() {
    let genesis_block = Consensus::default().genesis_block().to_owned();
    let genesis_block = genesis_block
        .as_advanced_builder()
        .number(42)
        .epoch(EpochNumberWithFraction::from_full_value(0))
        .build();
    let consensus = ConsensusBuilder::default()
        .genesis_block(genesis_block)
        .build();
    let verifier = GenesisVerifier::new();
    assert_error_eq!(
        verifier.verify(&consensus).unwrap_err(),
        NumberError {
            expected: 0,
            actual: 42
        },
    );
}

#[test]
pub fn test_genesis_non_zero_parent_hash() {
    let genesis_block = Consensus::default().genesis_block().to_owned();
    let genesis_block = genesis_block
        .as_advanced_builder()
        .parent_hash([42u8; 32])
        .build();
    let consensus = ConsensusBuilder::default()
        .genesis_block(genesis_block)
        .build();
    let verifier = GenesisVerifier::new();
    assert_error_eq!(
        verifier.verify(&consensus).unwrap_err(),
        UnknownParentError {
            parent_hash: [42u8; 32].into()
        },
    );
}

#[test]
pub fn test_default_genesis() {
    let consensus = ConsensusBuilder::default().build();
    let verifier = GenesisVerifier::new();
    verifier.verify(&consensus).expect("pass verification");
}

#[test]
pub fn test_chain_specs() {
    use ckb_chain_spec::ChainSpec;
    use ckb_resource::{AVAILABLE_SPECS, Resource};
    fn load_spec_by_name(name: &str) -> ChainSpec {
        let res = Resource::bundled(format!("specs/{name}.toml"));
        ChainSpec::load_from(&res).expect("load spec by name")
    }
    for name in AVAILABLE_SPECS {
        let spec = load_spec_by_name(name);
        let consensus = spec.build_consensus().expect("build consensus");
        let verifier = GenesisVerifier::new();
        verifier.verify(&consensus).expect("pass verification");
    }
}