diff --git a/src/mmr.rs b/src/mmr.rs index 22729ea..7a65c7b 100644 --- a/src/mmr.rs +++ b/src/mmr.rs @@ -177,8 +177,9 @@ impl<'a, T: Clone + PartialEq + Debug, M: Merge, S: MMRStore> MMR = 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 = Vec::with_capacity(peaks.len() + 1); diff --git a/src/tests/test_mmr.rs b/src/tests/test_mmr.rs index 10ad71b..1e5f3a1 100644 --- a/src/tests/test_mmr.rs +++ b/src/tests/test_mmr.rs @@ -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)