unc-primitives 0.7.2

This crate provides the base set of primitives used by other framework crates
Documentation
#[macro_use]
extern crate bencher;

use bencher::{black_box, Bencher};
use borsh::BorshDeserialize;
use unc_primitives::static_clock::StaticClock;

use unc_crypto::{KeyType, PublicKey, Signature};
use unc_primitives::account::Account;
use unc_primitives::block::{genesis_chunks, Block};
use unc_primitives::hash::CryptoHash;
use unc_primitives::merkle::combine_hash;
use unc_primitives::test_utils::account_new;
use unc_primitives::transaction::{Action, SignedTransaction, Transaction, TransferAction};
use unc_primitives::types::{EpochId, StateRoot};
use unc_primitives::validator_signer::InMemoryValidatorSigner;
use unc_primitives::version::PROTOCOL_VERSION;
use unc_primitives_core::types::MerkleHash;
use num_rational::Rational32;

fn create_transaction() -> SignedTransaction {
    let mut actions = vec![];
    for _ in 0..10 {
        actions.push(Action::Transfer(TransferAction { deposit: 1_000_000_000 }));
    }
    SignedTransaction::new(
        Signature::empty(KeyType::ED25519),
        Transaction {
            signer_id: "123213123123".parse().unwrap(),
            public_key: PublicKey::empty(KeyType::ED25519),
            nonce: 123,
            receiver_id: "1231231232131".parse().unwrap(),
            block_hash: Default::default(),
            actions,
        },
    )
}

fn create_block() -> Block {
    let genesis_chunks = genesis_chunks(vec![StateRoot::new()], &[0], 1_000, 0, PROTOCOL_VERSION);
    let genesis = Block::genesis(
        PROTOCOL_VERSION,
        genesis_chunks.into_iter().map(|chunk| chunk.take_header()).collect(),
        StaticClock::utc(),
        0,
        1_000,
        1_000,
        CryptoHash::default(),
    );
    let signer = InMemoryValidatorSigner::from_random("test".parse().unwrap(), KeyType::ED25519);
    Block::produce(
        PROTOCOL_VERSION,
        PROTOCOL_VERSION,
        genesis.header(),
        10,
        genesis.header().block_ordinal() + 1,
        vec![genesis.chunks()[0].clone()],
        EpochId::default(),
        EpochId::default(),
        None,
        vec![],
        Rational32::from_integer(0),
        0,
        0,
        Some(0),
        vec![],
        vec![],
        &signer,
        CryptoHash::default(),
        CryptoHash::default(),
        None,
    )
}

fn create_account() -> Account {
    account_new(0, CryptoHash::default())
}

fn serialize_tx(bench: &mut Bencher) {
    let t = create_transaction();
    bench.iter(|| {
        let bytes = borsh::to_vec(&t).unwrap();
        assert!(!bytes.is_empty());
    });
}

fn deserialize_tx(bench: &mut Bencher) {
    let t = create_transaction();
    let bytes = borsh::to_vec(&t).unwrap();
    bench.iter(|| {
        let nt = SignedTransaction::try_from_slice(&bytes).unwrap();
        assert_eq!(nt, t);
    });
}

fn serialize_block(bench: &mut Bencher) {
    let b = create_block();
    bench.iter(|| {
        let bytes = borsh::to_vec(&b).unwrap();
        assert!(!bytes.is_empty());
    });
}

fn deserialize_block(bench: &mut Bencher) {
    let b = create_block();
    let bytes = borsh::to_vec(&b).unwrap();
    bench.iter(|| {
        let nb = Block::try_from_slice(&bytes).unwrap();
        assert_eq!(nb, b);
    });
}

fn serialize_account(bench: &mut Bencher) {
    let acc = create_account();
    bench.iter(|| {
        let bytes = borsh::to_vec(&acc).unwrap();
        assert!(!bytes.is_empty());
    });
}

fn deserialize_account(bench: &mut Bencher) {
    let acc = create_account();
    let bytes = borsh::to_vec(&acc).unwrap();
    bench.iter(|| {
        let nacc = Account::try_from_slice(&bytes).unwrap();
        assert_eq!(nacc, acc);
    });
}

fn combine_hash_bench(bench: &mut Bencher) {
    let a = MerkleHash::default();
    let b = MerkleHash::default();
    bench.iter(|| {
        let res = combine_hash(black_box(&a), black_box(&b));
        black_box(res)
    });
}

benchmark_group!(
    benches,
    serialize_tx,
    deserialize_tx,
    serialize_block,
    deserialize_block,
    serialize_account,
    deserialize_account,
    combine_hash_bench,
);
benchmark_main!(benches);