PR feedback

This commit is contained in:
wborgeaud 2021-09-21 08:37:23 +02:00
parent 1f42916bfc
commit 391759479e
2 changed files with 19 additions and 20 deletions

View File

@ -1,3 +1,4 @@
use itertools::izip;
use serde::{Deserialize, Serialize};
use crate::field::extension_field::target::ExtensionTarget;
@ -158,7 +159,7 @@ impl<F: RichField + Extendable<D>, const D: usize> FriProof<F, D> {
.map(|(is, ps)| compress_merkle_proofs(cap_height, is, &ps))
.collect::<Vec<_>>();
// Replace the query round proofs with the decompressed versions.
// Replace the query round proofs with the compressed versions.
for (i, qrp) in query_round_proofs.iter_mut().enumerate() {
qrp.initial_trees_proof = FriInitialTreeProof {
evals_proofs: (0..num_initial_trees)
@ -241,19 +242,16 @@ impl<F: RichField + Extendable<D>, const D: usize> FriProof<F, D> {
}
}
// Compress all Merkle proofs.
let initial_trees_proofs = initial_trees_leaves
.iter()
.zip(&initial_trees_indices)
.zip(initial_trees_proofs)
.map(|((ls, is), ps)| decompress_merkle_proofs(&ls, is, &ps, height, cap_height))
.collect::<Vec<_>>();
let steps_proofs = steps_evals
.iter()
.zip(&steps_indices)
.zip(steps_proofs)
.zip(heights)
.map(|(((ls, is), ps), h)| decompress_merkle_proofs(ls, is, &ps, h, cap_height))
// Decompress all Merkle proofs.
let initial_trees_proofs = izip!(
&initial_trees_leaves,
&initial_trees_indices,
initial_trees_proofs
)
.map(|(ls, is, ps)| decompress_merkle_proofs(&ls, is, &ps, height, cap_height))
.collect::<Vec<_>>();
let steps_proofs = izip!(&steps_evals, &steps_indices, steps_proofs, heights)
.map(|(ls, is, ps, h)| decompress_merkle_proofs(ls, is, &ps, h, cap_height))
.collect::<Vec<_>>();
// Replace the query round proofs with the decompressed versions.

View File

@ -22,6 +22,8 @@ pub(crate) fn compress_merkle_proofs<F: Field>(
let num_leaves = 1 << height;
let mut compressed_proofs = Vec::with_capacity(proofs.len());
// Holds the known nodes in the tree at a given time. The root is at index 1.
// Valid indices are 1 through n, and each element at index `i` has
// children at indices `2i` and `2i +1` its parent at index `floor(i 2)`.
let mut known = vec![false; 2 * num_leaves];
for &i in indices {
// The leaves are known.
@ -70,10 +72,9 @@ pub(crate) fn decompress_merkle_proofs<F: RichField>(
seen.insert(i + num_leaves, hash_or_noop(v.to_vec()));
}
// For every index, go up the tree by querying `seen` to get node values, or if they are unknown
// pop them from the compressed proof.
for (&i, p) in leaves_indices.iter().zip(compressed_proofs.iter_mut()) {
// We'll use `pop` to run through the Merkle paths, so we reverse it first.
p.siblings.reverse();
// get them from the compressed proof.
for (&i, p) in leaves_indices.iter().zip(compressed_proofs) {
let mut compressed_siblings = p.siblings.into_iter();
let mut decompressed_proof = MerkleProof {
siblings: Vec::new(),
};
@ -81,10 +82,10 @@ pub(crate) fn decompress_merkle_proofs<F: RichField>(
let mut current_digest = seen[&index];
for _ in 0..height - cap_height {
let sibling_index = index ^ 1;
// Get the value of the sibling node by querying it or popping it from the proof.
// Get the value of the sibling node by querying it or getting it from the proof.
let h = *seen
.entry(sibling_index)
.or_insert_with(|| p.siblings.pop().unwrap());
.or_insert_with(|| compressed_siblings.next().unwrap());
decompressed_proof.siblings.push(h);
// Update the current digest to the value of the parent.
current_digest = if index.is_even() {