|
| 1 | +use criterion::{criterion_group, criterion_main, Criterion}; |
| 2 | +use mockall::predicate::eq; |
| 3 | +use ouroboros::ledger::{MockLedgerState, PoolId, PoolSigma}; |
| 4 | +use ouroboros::validator::Validator; |
| 5 | +use ouroboros_praos::consensus::BlockValidator; |
| 6 | +use pallas_crypto::hash::Hash; |
| 7 | +use pallas_math::math::{FixedDecimal, FixedPrecision}; |
| 8 | +use pallas_traverse::MultiEraHeader; |
| 9 | + |
| 10 | +fn validate_conway_block() { |
| 11 | + let test_block = include_bytes!("../tests/data/mainnet_blockheader_10817298.cbor"); |
| 12 | + let test_vector = vec![( |
| 13 | + "00beef0a9be2f6d897ed24a613cf547bb20cd282a04edfc53d477114", |
| 14 | + "c0d1f9b040d2f6fd7fc8775d24753d6db4b697429f11404a6178a0a4a005867b", |
| 15 | + "c7937fc47fecbe687891b3decd71e904d1e129598aa3852481d295eea3ea3ada", |
| 16 | + 25626202470912_u64, |
| 17 | + 22586623335121436_u64, |
| 18 | + true, |
| 19 | + )]; |
| 20 | + |
| 21 | + for (pool_id_str, vrf_vkey_hash_str, epoch_nonce_str, numerator, denominator, expected) in |
| 22 | + test_vector |
| 23 | + { |
| 24 | + let pool_id: PoolId = pool_id_str.parse().unwrap(); |
| 25 | + let vrf_vkey_hash: Hash<32> = vrf_vkey_hash_str.parse().unwrap(); |
| 26 | + let epoch_nonce: Hash<32> = epoch_nonce_str.parse().unwrap(); |
| 27 | + |
| 28 | + let active_slots_coeff: FixedDecimal = |
| 29 | + FixedDecimal::from(5u64) / FixedDecimal::from(100u64); |
| 30 | + let c = (FixedDecimal::from(1u64) - active_slots_coeff).ln(); |
| 31 | + let conway_block_tag: u8 = 6; |
| 32 | + let multi_era_header = MultiEraHeader::decode(conway_block_tag, None, test_block).unwrap(); |
| 33 | + let babbage_header = multi_era_header.as_babbage().expect("Infallible"); |
| 34 | + assert_eq!(babbage_header.header_body.slot, 134402628u64); |
| 35 | + |
| 36 | + let mut ledger_state = MockLedgerState::new(); |
| 37 | + ledger_state |
| 38 | + .expect_pool_id_to_sigma() |
| 39 | + .with(eq(pool_id)) |
| 40 | + .returning(move |_| { |
| 41 | + Ok(PoolSigma { |
| 42 | + numerator, |
| 43 | + denominator, |
| 44 | + }) |
| 45 | + }); |
| 46 | + ledger_state |
| 47 | + .expect_vrf_vkey_hash() |
| 48 | + .with(eq(pool_id)) |
| 49 | + .returning(move |_| Ok(vrf_vkey_hash)); |
| 50 | + ledger_state.expect_slot_to_kes_period().returning(|slot| { |
| 51 | + // hardcode some values from shelley-genesis.json for the mock implementation |
| 52 | + let slots_per_kes_period: u64 = 129600; // from shelley-genesis.json (1.5 days in seconds) |
| 53 | + slot / slots_per_kes_period |
| 54 | + }); |
| 55 | + ledger_state.expect_max_kes_evolutions().returning(|| 62); |
| 56 | + ledger_state |
| 57 | + .expect_latest_opcert_sequence_number() |
| 58 | + .returning(|_| None); |
| 59 | + |
| 60 | + let block_validator = BlockValidator::new(babbage_header, &ledger_state, &epoch_nonce, &c); |
| 61 | + assert_eq!(block_validator.validate().is_ok(), expected); |
| 62 | + } |
| 63 | +} |
| 64 | + |
| 65 | +fn benchmark_validate_conway_block(c: &mut Criterion) { |
| 66 | + c.bench_function("validate_conway_block", |b| { |
| 67 | + b.iter(|| validate_conway_block()) |
| 68 | + }); |
| 69 | +} |
| 70 | + |
| 71 | +criterion_group!(benches, benchmark_validate_conway_block); |
| 72 | +criterion_main!(benches); |
0 commit comments