Skip to content

Commit f15a171

Browse files
committed
fix(verify_mmr_successor): Fix off-by-one in stack word dup
Had to modify the test setup to catch this bug.
1 parent bd12c21 commit f15a171

File tree

1 file changed

+19
-9
lines changed

1 file changed

+19
-9
lines changed

tasm-lib/src/mmr/verify_mmr_successor.rs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ impl BasicSnippet for VerifyMmrSuccessor {
199199
// _ *old_mmr *new_mmr *old_peaks[0] *end_of_memory [0]
200200
hint running_leaf_count = stack[0..2]
201201

202-
dup 6 {&num_leafs}
202+
dup 5 {&num_leafs}
203203
// _ *old_mmr *new_mmr *old_peaks[0] *end_of_memory [0] [old_num_leafs]
204204
hint num_leafs_remaining = stack[0..2]
205205

@@ -372,9 +372,11 @@ mod test {
372372
use rand::RngCore;
373373
use rand::SeedableRng;
374374
use triton_vm::error::InstructionError;
375+
use triton_vm::prelude::bfe;
375376
use triton_vm::prelude::BFieldElement;
376377
use triton_vm::prelude::Tip5;
377378
use triton_vm::program::NonDeterminism;
379+
use triton_vm::twenty_first::prelude::AlgebraicHasher;
378380
use triton_vm::twenty_first::prelude::Mmr;
379381
use triton_vm::twenty_first::util_types::mmr::mmr_accumulator::MmrAccumulator;
380382
use triton_vm::twenty_first::util_types::mmr::mmr_successor_proof::MmrSuccessorProof;
@@ -383,7 +385,6 @@ mod test {
383385

384386
use crate::empty_stack;
385387
use crate::memory::encode_to_memory;
386-
use crate::memory::FIRST_NON_DETERMINISTICALLY_INITIALIZED_MEMORY_ADDRESS;
387388
use crate::prelude::TasmObject;
388389
use crate::snippet_bencher::BenchmarkCase;
389390
use crate::test_helpers::negative_test;
@@ -426,11 +427,20 @@ mod test {
426427
new_mmr: &MmrAccumulator,
427428
mmr_successor_proof: &MmrSuccessorProof,
428429
) -> MemPreserverInitialState {
430+
let seed = Tip5::hash_pair(Tip5::hash(old_mmr), Tip5::hash(new_mmr));
431+
let seed: u64 = seed.0[0].value();
432+
let seed: [u8; 8] = seed.to_be_bytes();
433+
let seed: [u8; 32] = seed.repeat(4).try_into().unwrap();
434+
let mut rng: StdRng = SeedableRng::from_seed(seed);
435+
let old_mmr_address: u32 = rng.gen_range(0..1 << 30);
436+
let new_mmr_address: u32 = old_mmr_address + rng.gen_range(0..1 << 28);
437+
let old_mmr_address = bfe!(old_mmr_address);
438+
let new_mmr_address = old_mmr_address + bfe!(new_mmr_address);
439+
429440
let mut nondeterminism = NonDeterminism::new(vec![]);
430441
VerifyMmrSuccessor::update_nondeterminism(&mut nondeterminism, mmr_successor_proof);
431-
let old_mmr_address = FIRST_NON_DETERMINISTICALLY_INITIALIZED_MEMORY_ADDRESS;
432-
let new_mmr_address = encode_to_memory(&mut nondeterminism.ram, old_mmr_address, old_mmr);
433-
let _garbage_address = encode_to_memory(&mut nondeterminism.ram, new_mmr_address, new_mmr);
442+
encode_to_memory(&mut nondeterminism.ram, old_mmr_address, old_mmr);
443+
encode_to_memory(&mut nondeterminism.ram, new_mmr_address, new_mmr);
434444
let mut stack = empty_stack();
435445
stack.push(old_mmr_address);
436446
stack.push(new_mmr_address);
@@ -444,7 +454,7 @@ mod test {
444454
fn failing_initial_states() -> Vec<MemPreserverInitialState> {
445455
let mut rng = thread_rng();
446456
let mut initial_states = vec![];
447-
for old_num_leafs in [1u64, 8] {
457+
for old_num_leafs in [1u64, 2, 3, 8] {
448458
for num_new_leafs in [0u64, 1, 8] {
449459
if [(0, 0)]
450460
.into_iter()
@@ -594,15 +604,15 @@ mod test {
594604
fn corner_case_initial_states(&self) -> Vec<MemPreserverInitialState> {
595605
let mut rng = thread_rng();
596606
let mut initial_states = vec![];
597-
for old_num_leafs in [0u64, 1, 8] {
598-
for num_new_leafs in [0u64, 1, 8] {
607+
for old_num_leafs in [0u64, 1, 2, 3, 4, 8] {
608+
for num_inserted_leafs in [0u64, 1, 2, 3, 4, 8] {
599609
let old_mmr = MmrAccumulator::init(
600610
(0..old_num_leafs.count_ones())
601611
.map(|_| rng.gen::<Digest>())
602612
.collect_vec(),
603613
old_num_leafs,
604614
);
605-
let new_leafs = (0..num_new_leafs)
615+
let new_leafs = (0..num_inserted_leafs)
606616
.map(|_| rng.gen::<Digest>())
607617
.collect_vec();
608618
let mut new_mmr = old_mmr.clone();

0 commit comments

Comments
 (0)