mirror of
https://github.com/logos-storage/plonky2.git
synced 2026-01-08 16:53:07 +00:00
Working Merkle subtree proofs
This commit is contained in:
parent
13519e66ab
commit
3dcdc8835c
@ -273,7 +273,6 @@ pub(crate) fn merkle_root_inner<F: Field>(vecs: Vec<Vec<F>>) -> Hash<F> {
|
|||||||
.map(|leaf_set| hash_or_noop(leaf_set))
|
.map(|leaf_set| hash_or_noop(leaf_set))
|
||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
while hashes.len() > 1 {
|
while hashes.len() > 1 {
|
||||||
dbg!(&hashes);
|
|
||||||
hashes = hashes
|
hashes = hashes
|
||||||
.chunks(2)
|
.chunks(2)
|
||||||
.map(|pair| compress(pair[0], pair[1]))
|
.map(|pair| compress(pair[0], pair[1]))
|
||||||
|
|||||||
@ -5,7 +5,6 @@ use crate::hash::{compress, hash_or_noop};
|
|||||||
use crate::hash::{merkle_root_inner, GMIMC_ROUNDS};
|
use crate::hash::{merkle_root_inner, GMIMC_ROUNDS};
|
||||||
use crate::proof::{Hash, HashTarget};
|
use crate::proof::{Hash, HashTarget};
|
||||||
use crate::target::Target;
|
use crate::target::Target;
|
||||||
use crate::util::reverse_index_bits_in_place;
|
|
||||||
use crate::wire::Wire;
|
use crate::wire::Wire;
|
||||||
use anyhow::{ensure, Result};
|
use anyhow::{ensure, Result};
|
||||||
|
|
||||||
@ -51,21 +50,18 @@ pub(crate) fn verify_merkle_proof<F: Field>(
|
|||||||
/// Verifies that the given subtree is present at the given index in the Merkle tree with the
|
/// Verifies that the given subtree is present at the given index in the Merkle tree with the
|
||||||
/// given root.
|
/// given root.
|
||||||
pub(crate) fn verify_merkle_proof_subtree<F: Field>(
|
pub(crate) fn verify_merkle_proof_subtree<F: Field>(
|
||||||
mut subtree_leaves_data: Vec<Vec<F>>,
|
subtree_leaves_data: Vec<Vec<F>>,
|
||||||
subtree_index: usize,
|
subtree_index: usize,
|
||||||
merkle_root: Hash<F>,
|
merkle_root: Hash<F>,
|
||||||
proof: &MerkleProof<F>,
|
proof: &MerkleProof<F>,
|
||||||
reverse_bits: bool,
|
reverse_bits: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
let index = if reverse_bits {
|
let index = if reverse_bits {
|
||||||
// reverse_index_bits_in_place(&mut subtree_leaves_data);
|
|
||||||
crate::util::reverse_bits(subtree_index, proof.siblings.len())
|
crate::util::reverse_bits(subtree_index, proof.siblings.len())
|
||||||
} else {
|
} else {
|
||||||
subtree_index
|
subtree_index
|
||||||
};
|
};
|
||||||
dbg!(&subtree_leaves_data);
|
|
||||||
let mut current_digest = merkle_root_inner(subtree_leaves_data);
|
let mut current_digest = merkle_root_inner(subtree_leaves_data);
|
||||||
dbg!(current_digest);
|
|
||||||
for (i, &sibling_digest) in proof.siblings.iter().enumerate() {
|
for (i, &sibling_digest) in proof.siblings.iter().enumerate() {
|
||||||
let bit = (index >> i & 1) == 1;
|
let bit = (index >> i & 1) == 1;
|
||||||
current_digest = if bit {
|
current_digest = if bit {
|
||||||
|
|||||||
@ -79,7 +79,7 @@ impl<F: Field> MerkleTree<F> {
|
|||||||
|
|
||||||
/// Create a Merkle proof for an entire subtree.
|
/// Create a Merkle proof for an entire subtree.
|
||||||
/// Example:
|
/// Example:
|
||||||
/// ```
|
/// ```tree
|
||||||
/// G
|
/// G
|
||||||
/// / \
|
/// / \
|
||||||
/// / \
|
/// / \
|
||||||
@ -132,7 +132,7 @@ mod tests {
|
|||||||
fn test_merkle_trees() -> Result<()> {
|
fn test_merkle_trees() -> Result<()> {
|
||||||
type F = CrandallField;
|
type F = CrandallField;
|
||||||
|
|
||||||
let log_n = 3;
|
let log_n = 8;
|
||||||
let n = 1 << log_n;
|
let n = 1 << log_n;
|
||||||
let leaves = random_data::<F>(n, 7);
|
let leaves = random_data::<F>(n, 7);
|
||||||
|
|
||||||
@ -162,25 +162,25 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (height, i) = (1, 0);
|
let (height, i) = (1, 0);
|
||||||
dbg!(height, i);
|
|
||||||
let subtree_proof = tree_reversed_bits.prove_subtree(i, height);
|
let subtree_proof = tree_reversed_bits.prove_subtree(i, height);
|
||||||
dbg!(&tree_reversed_bits, &subtree_proof);
|
let reversed_index = reverse_bits(i, log_n - height);
|
||||||
verify_merkle_proof_subtree(
|
verify_merkle_proof_subtree(
|
||||||
(i << height..(i + 1) << height)
|
(reversed_index << height..(reversed_index + 1) << height)
|
||||||
.map(|j| tree_reversed_bits.leaves[j].to_vec())
|
.map(|j| tree_reversed_bits.leaves[j].clone())
|
||||||
.collect(),
|
.collect(),
|
||||||
i,
|
i,
|
||||||
tree_reversed_bits.root,
|
tree_reversed_bits.root,
|
||||||
&subtree_proof,
|
&subtree_proof,
|
||||||
true,
|
true,
|
||||||
)?;
|
)?;
|
||||||
for height in 1..=log_n {
|
|
||||||
|
for height in 0..=log_n {
|
||||||
for i in 0..(n >> height) {
|
for i in 0..(n >> height) {
|
||||||
dbg!(height, i);
|
let reversed_index = reverse_bits(i, log_n - height);
|
||||||
let subtree_proof = tree_reversed_bits.prove_subtree(i, height);
|
let subtree_proof = tree_reversed_bits.prove_subtree(i, height);
|
||||||
verify_merkle_proof_subtree(
|
verify_merkle_proof_subtree(
|
||||||
(i << height..(i + 1) << height)
|
(reversed_index << height..(reversed_index + 1) << height)
|
||||||
.map(|j| tree_reversed_bits.leaves[j].to_vec())
|
.map(|j| tree_reversed_bits.leaves[j].clone())
|
||||||
.collect(),
|
.collect(),
|
||||||
i,
|
i,
|
||||||
tree_reversed_bits.root,
|
tree_reversed_bits.root,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user