Skip to content

State root derived from MultiProof might diverge#931

Draft
citizen-stig wants to merge 7 commits intothrumdev:masterfrom
citizen-stig:nikolai/more-state-root-tests
Draft

State root derived from MultiProof might diverge#931
citizen-stig wants to merge 7 commits intothrumdev:masterfrom
citizen-stig:nikolai/more-state-root-tests

Conversation

@citizen-stig
Copy link
Copy Markdown
Contributor

@citizen-stig citizen-stig commented Apr 15, 2026

Essence of new test:

/// some key/values written before.
let (prover_root, witness) = t.commit();
let nomt::Witness {
    path_proofs,
    operations: nomt::WitnessedOperations { .. },
} = witness;
let mut inner = path_proofs.into_iter().map(|p| p.inner).collect::<Vec<_>>();
inner.sort_by(|a, b| a.terminal.path().cmp(b.terminal.path()));
let multi_proof = MultiProof::from_path_proofs(inner);

/// verify
let verified = verify_multi_proof::<Blake3Hasher>(&multi_proof, prev_root)
    .expect("multiproof must verify against the prior root");

let mut updates: Vec<(KeyPath, Option<ValueHash>)> = accesses
    .iter()
    .filter_map(|(k, op)| match op {
        KeyReadWrite::Write(v) | KeyReadWrite::ReadThenWrite(_, v) => {
            Some((*k, v.as_deref().map(Blake3Hasher::hash_value)))
        }
        KeyReadWrite::Read(_) => None,
    })
    .collect();
updates.sort_by(|a, b| a.0.cmp(&b.0));

let verifier_root = verify_multi_proof_update::<Blake3Hasher>(&verified, updates).unwrap();
assert_eq!(prover_root, verifier_root);

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant