diff --git a/CHANGELOG.md b/CHANGELOG.md index a54f616..14fd3a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Implemented parallel leaf hashing in `Smt::process_sorted_pairs_to_leaves` (#365). - [BREAKING] Updated Winterfell dependency to v0.12 (#374). - Added debug-only duplicate column check in `build_subtree` (#378). +- Filter out empty values in concurrent version of `Smt::with_entries` to fix a panic (#383). ## 0.13.3 (2025-02-18) diff --git a/src/merkle/smt/full/concurrent/mod.rs b/src/merkle/smt/full/concurrent/mod.rs index bf7e636..698a8cf 100644 --- a/src/merkle/smt/full/concurrent/mod.rs +++ b/src/merkle/smt/full/concurrent/mod.rs @@ -39,6 +39,8 @@ impl Smt { let mut seen_keys = BTreeSet::new(); let entries: Vec<_> = entries .into_iter() + // Filter out key-value pairs whose value is empty. + .filter(|(_key, value)| *value != Self::EMPTY_VALUE) .map(|(key, value)| { if seen_keys.insert(key) { Ok((key, value)) diff --git a/src/merkle/smt/full/concurrent/tests.rs b/src/merkle/smt/full/concurrent/tests.rs index 6d857ae..8407c35 100644 --- a/src/merkle/smt/full/concurrent/tests.rs +++ b/src/merkle/smt/full/concurrent/tests.rs @@ -375,7 +375,15 @@ fn test_multithreaded_subtrees() { #[test] fn test_with_entries_concurrent() { const PAIR_COUNT: u64 = COLS_PER_SUBTREE * 64; - let entries = generate_entries(PAIR_COUNT); + let mut entries = generate_entries(PAIR_COUNT); + let mut rng = rand::thread_rng(); + + // Set 10% of the entries to have empty words as their values. + for _ in 0..PAIR_COUNT / 10 { + let random_index = rng.gen_range(0..PAIR_COUNT); + entries[random_index as usize].1 = EMPTY_WORD; + } + let control = Smt::with_entries_sequential(entries.clone()).unwrap(); let smt = Smt::with_entries(entries.clone()).unwrap(); assert_eq!(smt.root(), control.root());