diff --git a/benches/mmr_benchmark.rs b/benches/mmr_benchmark.rs index 538bc5e..d7c9b19 100644 --- a/benches/mmr_benchmark.rs +++ b/benches/mmr_benchmark.rs @@ -4,7 +4,7 @@ extern crate criterion; use criterion::{BenchmarkId, Criterion}; use bytes::Bytes; -use ckb_merkle_mountain_range::{util::MemStore, Error, MMRStore, Merge, Result, MMR}; +use ckb_merkle_mountain_range::{util::MemStore, Error, MMRStoreReadOps, Merge, Result, MMR}; use rand::{seq::SliceRandom, thread_rng}; use std::convert::TryFrom; diff --git a/src/lib.rs b/src/lib.rs index 7d44ab0..96b3fc0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ pub use error::{Error, Result}; pub use helper::{leaf_index_to_mmr_size, leaf_index_to_pos}; pub use merge::Merge; pub use mmr::{MerkleProof, MMR}; -pub use mmr_store::MMRStore; +pub use mmr_store::{MMRStoreReadOps, MMRStoreWriteOps}; cfg_if::cfg_if! { if #[cfg(feature = "std")] { diff --git a/src/mmr.rs b/src/mmr.rs index 26497ba..b9d5b94 100644 --- a/src/mmr.rs +++ b/src/mmr.rs @@ -7,7 +7,7 @@ use crate::borrow::Cow; use crate::collections::VecDeque; use crate::helper::{get_peaks, parent_offset, pos_height_in_tree, sibling_offset}; -use crate::mmr_store::{MMRBatch, MMRStore}; +use crate::mmr_store::{MMRBatch, MMRStoreReadOps, MMRStoreWriteOps}; use crate::vec; use crate::vec::Vec; use crate::{Error, Merge, Result}; @@ -21,7 +21,7 @@ pub struct MMR { merge: PhantomData, } -impl, S: MMRStore> MMR { +impl MMR { pub fn new(mmr_size: u64, store: S) -> Self { MMR { mmr_size, @@ -29,7 +29,9 @@ impl, S: MMRStore> MMR, S: MMRStoreReadOps> MMR { // find internal MMR elem, the pos must exists, otherwise a error will return fn find_elem<'b>(&self, pos: u64, hashes: &'b [T]) -> Result> { let pos_offset = pos.checked_sub(self.mmr_size); @@ -214,7 +216,9 @@ impl, S: MMRStore> MMR> MMR { pub fn commit(self) -> Result<()> { self.batch.commit() } @@ -227,7 +231,7 @@ pub struct MerkleProof { merge: PhantomData, } -impl> MerkleProof { +impl> MerkleProof { pub fn new(mmr_size: u64, proof: Vec) -> Self { MerkleProof { mmr_size, @@ -284,12 +288,7 @@ impl> MerkleProof { } } -fn calculate_peak_root< - 'a, - T: 'a + PartialEq + Debug + Clone, - M: Merge, - I: Iterator, ->( +fn calculate_peak_root<'a, T: 'a + Clone, M: Merge, I: Iterator>( leaves: Vec<(u64, T)>, peak_pos: u64, proof_iter: &mut I, @@ -345,12 +344,7 @@ fn calculate_peak_root< Err(Error::CorruptedProof) } -fn calculate_peaks_hashes< - 'a, - T: 'a + PartialEq + Debug + Clone, - M: Merge, - I: Iterator, ->( +fn calculate_peaks_hashes<'a, T: 'a + Clone, M: Merge, I: Iterator>( mut leaves: Vec<(u64, T)>, mmr_size: u64, mut proof_iter: I, @@ -405,9 +399,7 @@ fn calculate_peaks_hashes< Ok(peaks_hashes) } -fn bagging_peaks_hashes<'a, T: 'a + PartialEq + Debug + Clone, M: Merge>( - mut peaks_hashes: Vec, -) -> Result { +fn bagging_peaks_hashes>(mut peaks_hashes: Vec) -> Result { // bagging peaks // bagging from right to left via hash(right, left). while peaks_hashes.len() > 1 { @@ -422,12 +414,7 @@ fn bagging_peaks_hashes<'a, T: 'a + PartialEq + Debug + Clone, M: Merge, - I: Iterator, ->( +fn calculate_root<'a, T: 'a + Clone, M: Merge, I: Iterator>( leaves: Vec<(u64, T)>, mmr_size: u64, proof_iter: I, diff --git a/src/mmr_store.rs b/src/mmr_store.rs index d0e1490..1e8d483 100644 --- a/src/mmr_store.rs +++ b/src/mmr_store.rs @@ -6,7 +6,7 @@ pub struct MMRBatch { store: Store, } -impl> MMRBatch { +impl MMRBatch { pub fn new(store: Store) -> Self { MMRBatch { memory_batch: Vec::new(), @@ -17,7 +17,9 @@ impl> MMRBatch { pub fn append(&mut self, pos: u64, elems: Vec) { self.memory_batch.push((pos, elems)); } +} +impl> MMRBatch { pub fn get_elem(&self, pos: u64) -> Result> { for (start_pos, elems) in self.memory_batch.iter().rev() { if pos < *start_pos { @@ -30,7 +32,9 @@ impl> MMRBatch { } self.store.get_elem(pos) } +} +impl> MMRBatch { pub fn commit(self) -> Result<()> { let Self { mut store, @@ -43,7 +47,7 @@ impl> MMRBatch { } } -impl> IntoIterator for MMRBatch { +impl IntoIterator for MMRBatch { type Item = (u64, Vec); type IntoIter = crate::vec::IntoIter; @@ -52,7 +56,10 @@ impl> IntoIterator for MMRBatch { } } -pub trait MMRStore { +pub trait MMRStoreReadOps { fn get_elem(&self, pos: u64) -> Result>; +} + +pub trait MMRStoreWriteOps { fn append(&mut self, pos: u64, elems: Vec) -> Result<()>; } diff --git a/src/tests/test_accumulate_headers.rs b/src/tests/test_accumulate_headers.rs index 1366970..ae9ab9e 100644 --- a/src/tests/test_accumulate_headers.rs +++ b/src/tests/test_accumulate_headers.rs @@ -1,5 +1,5 @@ use super::new_blake2b; -use crate::{leaf_index_to_pos, util::MemStore, MMRStore, Merge, MerkleProof, Result, MMR}; +use crate::{leaf_index_to_pos, util::MemStore, MMRStoreReadOps, Merge, MerkleProof, Result, MMR}; use bytes::{Bytes, BytesMut}; use std::fmt; @@ -106,7 +106,7 @@ impl Prover { let mut mmr = MMR::<_, MergeHashWithTD, _>::new(self.positions.len() as u64, &self.store); // get previous element let mut previous = if let Some(pos) = self.positions.last() { - MMRStore::<_>::get_elem(&&self.store, *pos)?.expect("exists") + MMRStoreReadOps::<_>::get_elem(&&self.store, *pos)?.expect("exists") } else { let genesis = Header::default(); diff --git a/src/tests/test_mmr.rs b/src/tests/test_mmr.rs index ff92d99..6f0bbf0 100644 --- a/src/tests/test_mmr.rs +++ b/src/tests/test_mmr.rs @@ -1,6 +1,6 @@ use super::{MergeNumberHash, NumberHash}; use crate::{ - helper::pos_height_in_tree, leaf_index_to_mmr_size, util::MemStore, Error, MMRStore, MMR, + helper::pos_height_in_tree, leaf_index_to_mmr_size, util::MemStore, Error, MMRStoreReadOps, MMR, }; use faster_hex::hex_string; use proptest::prelude::*; diff --git a/src/util.rs b/src/util.rs index 0828bc4..79dec26 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,7 +1,6 @@ use crate::collections::BTreeMap; -use crate::{vec::Vec, MMRStore, Merge, MerkleProof, Result, MMR}; +use crate::{vec::Vec, MMRStoreReadOps, MMRStoreWriteOps, Merge, MerkleProof, Result, MMR}; use core::cell::RefCell; -use core::fmt::Debug; use core::marker::PhantomData; #[derive(Clone)] @@ -19,11 +18,13 @@ impl MemStore { } } -impl MMRStore for &MemStore { +impl MMRStoreReadOps for &MemStore { fn get_elem(&self, pos: u64) -> Result> { Ok(self.0.borrow().get(&pos).cloned()) } +} +impl MMRStoreWriteOps for &MemStore { fn append(&mut self, pos: u64, elems: Vec) -> Result<()> { let mut store = self.0.borrow_mut(); for (i, elem) in elems.into_iter().enumerate() { @@ -39,13 +40,13 @@ pub struct MemMMR { merge: PhantomData, } -impl> Default for MemMMR { +impl> Default for MemMMR { fn default() -> Self { Self::new(0, Default::default()) } } -impl> MemMMR { +impl> MemMMR { pub fn new(mmr_size: u64, store: MemStore) -> Self { MemMMR { mmr_size,