fix: panic in PartialMmr::untrack
(#382)
This commit is contained in:
parent
ed14eaa90c
commit
535637d7fb
2 changed files with 30 additions and 4 deletions
|
@ -1,6 +1,7 @@
|
||||||
## 0.13.3 (tbd)
|
## 0.13.3 (tbd)
|
||||||
|
|
||||||
- Implement `PartialSmt` (#372, #381).
|
- Implement `PartialSmt` (#372, #381).
|
||||||
|
- Fix panic in `PartialMmr::untrack` (#382).
|
||||||
|
|
||||||
## 0.13.2 (2025-01-24)
|
## 0.13.2 (2025-01-24)
|
||||||
|
|
||||||
|
|
|
@ -341,16 +341,13 @@ impl PartialMmr {
|
||||||
pub fn untrack(&mut self, leaf_pos: usize) {
|
pub fn untrack(&mut self, leaf_pos: usize) {
|
||||||
let mut idx = InOrderIndex::from_leaf_pos(leaf_pos);
|
let mut idx = InOrderIndex::from_leaf_pos(leaf_pos);
|
||||||
|
|
||||||
self.nodes.remove(&idx.sibling());
|
|
||||||
|
|
||||||
// `idx` represent the element that can be computed by the authentication path, because
|
// `idx` represent the element that can be computed by the authentication path, because
|
||||||
// these elements can be computed they are not saved for the authentication of the current
|
// these elements can be computed they are not saved for the authentication of the current
|
||||||
// target. In other words, if the idx is present it was added for the authentication of
|
// target. In other words, if the idx is present it was added for the authentication of
|
||||||
// another element, and no more elements should be removed otherwise it would remove that
|
// another element, and no more elements should be removed otherwise it would remove that
|
||||||
// element's authentication data.
|
// element's authentication data.
|
||||||
while !self.nodes.contains_key(&idx) {
|
while self.nodes.remove(&idx.sibling()).is_some() && !self.nodes.contains_key(&idx) {
|
||||||
idx = idx.parent();
|
idx = idx.parent();
|
||||||
self.nodes.remove(&idx.sibling());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -949,4 +946,32 @@ mod tests {
|
||||||
|
|
||||||
assert_eq!(partial_mmr, decoded);
|
assert_eq!(partial_mmr, decoded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_partial_mmr_untrack() {
|
||||||
|
// build the MMR
|
||||||
|
let mmr: Mmr = LEAVES.into();
|
||||||
|
|
||||||
|
// get path and node for position 1
|
||||||
|
let node1 = mmr.get(1).unwrap();
|
||||||
|
let proof1 = mmr.open(1).unwrap();
|
||||||
|
|
||||||
|
// get path and node for position 2
|
||||||
|
let node2 = mmr.get(2).unwrap();
|
||||||
|
let proof2 = mmr.open(2).unwrap();
|
||||||
|
|
||||||
|
// create partial MMR and add authentication path to nodes at position 1 and 2
|
||||||
|
let mut partial_mmr: PartialMmr = mmr.peaks().into();
|
||||||
|
partial_mmr.track(1, node1, &proof1.merkle_path).unwrap();
|
||||||
|
partial_mmr.track(2, node2, &proof2.merkle_path).unwrap();
|
||||||
|
|
||||||
|
// untrack nodes at positions 1 and 2
|
||||||
|
partial_mmr.untrack(1);
|
||||||
|
partial_mmr.untrack(2);
|
||||||
|
|
||||||
|
// nodes should not longer be tracked
|
||||||
|
assert!(!partial_mmr.is_tracked(1));
|
||||||
|
assert!(!partial_mmr.is_tracked(2));
|
||||||
|
assert_eq!(partial_mmr.nodes().count(), 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue