Remove reverse_bits flag in Merkle trees

This commit is contained in:
wborgeaud 2021-08-18 14:32:24 +02:00
parent f2ed563da9
commit 291e67bec5
4 changed files with 7 additions and 26 deletions

View File

@ -65,7 +65,7 @@ impl<F: Field> PolynomialBatchCommitment<F> {
let merkle_tree = timed!( let merkle_tree = timed!(
timing, timing,
"build Merkle tree", "build Merkle tree",
MerkleTree::new(leaves, cap_height, false) MerkleTree::new(leaves, cap_height,)
); );
Self { Self {

View File

@ -85,7 +85,7 @@ fn fri_committed_trees<F: Field + Extendable<D>, const D: usize>(
.par_chunks(arity) .par_chunks(arity)
.map(|chunk: &[F::Extension]| flatten(chunk)) .map(|chunk: &[F::Extension]| flatten(chunk))
.collect(); .collect();
let tree = MerkleTree::new(chunked_values, config.cap_height, false); let tree = MerkleTree::new(chunked_values, config.cap_height);
challenger.observe_cap(&tree.cap); challenger.observe_cap(&tree.cap);
trees.push(tree); trees.push(tree);

View File

@ -241,7 +241,7 @@ mod tests {
let n = 1 << log_n; let n = 1 << log_n;
let cap_height = 1; let cap_height = 1;
let leaves = random_data::<F>(n, 7); let leaves = random_data::<F>(n, 7);
let tree = MerkleTree::new(leaves, cap_height, false); let tree = MerkleTree::new(leaves, cap_height);
let i: usize = thread_rng().gen_range(0..n); let i: usize = thread_rng().gen_range(0..n);
let proof = tree.prove(i); let proof = tree.prove(i);

View File

@ -5,7 +5,6 @@ use crate::field::field_types::Field;
use crate::hash::hash_types::HashOut; use crate::hash::hash_types::HashOut;
use crate::hash::hashing::{compress, hash_or_noop}; use crate::hash::hashing::{compress, hash_or_noop};
use crate::hash::merkle_proofs::MerkleProof; use crate::hash::merkle_proofs::MerkleProof;
use crate::util::{log2_strict, reverse_bits, reverse_index_bits_in_place};
/// The Merkle cap of height `h` of a Merkle tree is the `h`-th layer (from the root) of the tree. /// The Merkle cap of height `h` of a Merkle tree is the `h`-th layer (from the root) of the tree.
/// It can be used in place of the root to verify Merkle paths, which are `h` elements shorter. /// It can be used in place of the root to verify Merkle paths, which are `h` elements shorter.
@ -29,17 +28,10 @@ pub struct MerkleTree<F: Field> {
/// The Merkle cap. /// The Merkle cap.
pub cap: MerkleCap<F>, pub cap: MerkleCap<F>,
/// If true, the indices are in bit-reversed form, so that the leaf at index `i`
/// contains the leaf originally at index `reverse_bits(i)`.
pub reverse_bits: bool,
} }
impl<F: Field> MerkleTree<F> { impl<F: Field> MerkleTree<F> {
pub fn new(mut leaves: Vec<Vec<F>>, cap_height: usize, reverse_bits: bool) -> Self { pub fn new(leaves: Vec<Vec<F>>, cap_height: usize) -> Self {
if reverse_bits {
reverse_index_bits_in_place(&mut leaves);
}
let mut layers = vec![leaves let mut layers = vec![leaves
.par_iter() .par_iter()
.map(|l| hash_or_noop(l.clone())) .map(|l| hash_or_noop(l.clone()))
@ -59,31 +51,20 @@ impl<F: Field> MerkleTree<F> {
leaves, leaves,
layers, layers,
cap: MerkleCap(cap), cap: MerkleCap(cap),
reverse_bits,
} }
} }
pub fn get(&self, i: usize) -> &[F] { pub fn get(&self, i: usize) -> &[F] {
let n = log2_strict(self.leaves.len()); &self.leaves[i]
&self.leaves[if self.reverse_bits {
reverse_bits(i, n)
} else {
i
}]
} }
/// Create a Merkle proof from a leaf index. /// Create a Merkle proof from a leaf index.
pub fn prove(&self, leaf_index: usize) -> MerkleProof<F> { pub fn prove(&self, leaf_index: usize) -> MerkleProof<F> {
let index = if self.reverse_bits {
reverse_bits(leaf_index, log2_strict(self.leaves.len()))
} else {
leaf_index
};
MerkleProof { MerkleProof {
siblings: self siblings: self
.layers .layers
.iter() .iter()
.scan(index, |acc, layer| { .scan(leaf_index, |acc, layer| {
let index = *acc ^ 1; let index = *acc ^ 1;
*acc >>= 1; *acc >>= 1;
Some(layer[index]) Some(layer[index])
@ -110,7 +91,7 @@ mod tests {
n: usize, n: usize,
reverse_bits: bool, reverse_bits: bool,
) -> Result<()> { ) -> Result<()> {
let tree = MerkleTree::new(leaves.clone(), 1, reverse_bits); let tree = MerkleTree::new(leaves.clone(), 1);
for i in 0..n { for i in 0..n {
let proof = tree.prove(i); let proof = tree.prove(i);
verify_merkle_proof(leaves[i].clone(), i, &tree.cap, &proof, reverse_bits)?; verify_merkle_proof(leaves[i].clone(), i, &tree.cap, &proof, reverse_bits)?;