Merge pull request #23 from nervosnetwork/quake/dedup-leaves

fix: should dedup leaves when generating proof
This commit is contained in:
Boyu Yang
2022-09-01 10:25:24 +08:00
committed by GitHub
2 changed files with 9 additions and 2 deletions
+4 -2
View File
@@ -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);
+5
View File
@@ -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)