mirror of
https://github.com/pezkuwichain/merkle-mountain-range.git
synced 2026-04-22 02:08:02 +00:00
Merge pull request #23 from nervosnetwork/quake/dedup-leaves
fix: should dedup leaves when generating proof
This commit is contained in:
+4
-2
@@ -177,8 +177,9 @@ impl<'a, T: Clone + PartialEq + Debug, M: Merge<Item = T>, S: MMRStore<T>> MMR<T
|
||||
if self.mmr_size == 1 && pos_list == [0] {
|
||||
return Ok(MerkleProof::new(self.mmr_size, Vec::new()));
|
||||
}
|
||||
// ensure positions is sorted
|
||||
// ensure positions are sorted and unique
|
||||
pos_list.sort_unstable();
|
||||
pos_list.dedup();
|
||||
let peaks = get_peaks(self.mmr_size);
|
||||
let mut proof: Vec<T> = Vec::new();
|
||||
// generate merkle proof for each peaks
|
||||
@@ -345,8 +346,9 @@ fn calculate_peaks_hashes<
|
||||
if mmr_size == 1 && leaves.len() == 1 && leaves[0].0 == 0 {
|
||||
return Ok(leaves.into_iter().map(|(_pos, item)| item).collect());
|
||||
}
|
||||
// sort items by position
|
||||
// ensure leaves are sorted and unique
|
||||
leaves.sort_by_key(|(pos, _)| *pos);
|
||||
leaves.dedup_by(|a, b| a.0 == b.0);
|
||||
let peaks = get_peaks(mmr_size);
|
||||
|
||||
let mut peaks_hashes: Vec<T> = Vec::with_capacity(peaks.len() + 1);
|
||||
|
||||
@@ -140,6 +140,11 @@ fn test_gen_root_from_proof() {
|
||||
test_gen_new_root_from_proof(11);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_gen_proof_with_duplicate_leaves() {
|
||||
test_mmr(10, vec![5, 5]);
|
||||
}
|
||||
|
||||
prop_compose! {
|
||||
fn count_elem(count: u32)
|
||||
(elem in 0..count)
|
||||
|
||||
Reference in New Issue
Block a user