mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 08:43:06 +00:00
Remove reverse_bits flag in Merkle trees
This commit is contained in:
parent
f2ed563da9
commit
291e67bec5
@ -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 {
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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)?;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user