mirror of
https://github.com/pezkuwichain/merkle-mountain-range.git
synced 2026-06-17 12:21:10 +00:00
Init merkle-mountain-range
The MMR code is copy from https://github.com/nervosnetwork/ckb/pull/1598
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
use super::{MergeNumberHash, NumberHash};
|
||||
use crate::{util::MemStore, Error, MMR};
|
||||
use faster_hex::hex_string;
|
||||
use proptest::prelude::*;
|
||||
|
||||
fn test_mmr(count: u32, proof_elem: u32) {
|
||||
let store = MemStore::default();
|
||||
let mut mmr = MMR::<_, MergeNumberHash, _>::new(0, &store);
|
||||
let positions: Vec<u64> = (0u32..count)
|
||||
.map(|i| mmr.push(NumberHash::from(i)).unwrap())
|
||||
.collect();
|
||||
let root = mmr.get_root().expect("get root");
|
||||
let proof = mmr
|
||||
.gen_proof(positions[proof_elem as usize])
|
||||
.expect("gen proof");
|
||||
mmr.commit().expect("commit changes");
|
||||
let result = proof
|
||||
.verify(
|
||||
root,
|
||||
positions[proof_elem as usize],
|
||||
NumberHash::from(proof_elem),
|
||||
)
|
||||
.unwrap();
|
||||
assert!(result);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_root() {
|
||||
let store = MemStore::default();
|
||||
let mut mmr = MMR::<_, MergeNumberHash, _>::new(0, &store);
|
||||
(0u32..11).for_each(|i| {
|
||||
mmr.push(NumberHash::from(i)).unwrap();
|
||||
});
|
||||
let root = mmr.get_root().expect("get root");
|
||||
let hex_root = hex_string(&root.0).unwrap();
|
||||
assert_eq!(
|
||||
"f6794677f37a57df6a5ec36ce61036e43a36c1a009d05c81c9aa685dde1fd6e3",
|
||||
hex_root
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_empty_mmr_root() {
|
||||
let store = MemStore::<NumberHash>::default();
|
||||
let mmr = MMR::<_, MergeNumberHash, _>::new(0, &store);
|
||||
assert_eq!(Err(Error::GetRootOnEmpty), mmr.get_root());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_3_peaks() {
|
||||
test_mmr(11, 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_2_peaks() {
|
||||
test_mmr(10, 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_1_peak() {
|
||||
test_mmr(8, 5);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_first_elem_proof() {
|
||||
test_mmr(11, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_last_elem_proof() {
|
||||
test_mmr(11, 10);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_1_elem() {
|
||||
test_mmr(1, 0);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_mmr_2_elems() {
|
||||
test_mmr(2, 0);
|
||||
test_mmr(2, 1);
|
||||
}
|
||||
|
||||
prop_compose! {
|
||||
fn count_elem(count: u32)
|
||||
(elem in 0..count)
|
||||
-> (u32, u32) {
|
||||
(count, elem)
|
||||
}
|
||||
}
|
||||
|
||||
proptest! {
|
||||
#[test]
|
||||
fn test_random_mmr((count , elem) in count_elem(500)) {
|
||||
test_mmr(count, elem);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user