Skip to main content

MerkleTree

Struct MerkleTree 

Source
pub struct MerkleTree { /* private fields */ }
Expand description

A Merkle tree over field element leaves.

The tree is stored as a flat array where nodes[1] is the root, nodes[2i] and nodes[2i+1] are children of nodes[i], and leaves occupy nodes[n..2n] where n = 2^depth.

§Examples

use field_cat::F101;
use proof_cat::commit::merkle::MerkleTree;

let values = [F101::new(10), F101::new(20), F101::new(30), F101::new(40)];
let tree = MerkleTree::from_field_values(&values);

// Open leaf 2 and verify the opening.
let proof = tree.open(2)?;
assert!(MerkleTree::verify_opening(
    &tree.root(), 2, &F101::new(30), &proof,
));

// A wrong value fails verification.
assert!(!MerkleTree::verify_opening(
    &tree.root(), 2, &F101::new(99), &proof,
));

Implementations§

Source§

impl MerkleTree

Source

pub fn from_field_values<F: FieldBytes>(values: &[F]) -> Self

Build a Merkle tree from a slice of field elements.

Pads to the next power of two with distinct padding leaves.

Source

pub fn root(&self) -> MerkleRoot

The root commitment.

Source

pub fn leaf_count(&self) -> usize

The number of actual (non-padding) leaves.

Source

pub fn open(&self, index: usize) -> Result<MerkleProof, Error>

Generate an opening proof for the leaf at index.

§Errors

Returns Error::LeafIndexOutOfBounds if index >= leaf_count.

Source

pub fn verify_opening<F: FieldBytes>( root: &MerkleRoot, index: usize, value: &F, proof: &MerkleProof, ) -> bool

Verify an opening proof against a root and leaf value.

Recomputes the root from the leaf hash and sibling path, then checks it matches the expected root.

Trait Implementations§

Source§

impl Clone for MerkleTree

Source§

fn clone(&self) -> MerkleTree

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for MerkleTree

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.