Init merkle-mountain-range

The MMR code is copy from https://github.com/nervosnetwork/ckb/pull/1598
This commit is contained in:
jjy
2019-09-19 16:23:58 +08:00
commit c1211d2ca9
17 changed files with 1065 additions and 0 deletions
+98
View File
@@ -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);
}
}