Skip to main content

MerkleNonInclusionProof

Struct MerkleNonInclusionProof 

Source
pub struct MerkleNonInclusionProof<L> { /* private fields */ }
Available on crate feature unstable only.
Expand description

A non-inclusion proof for a tree built over sorted leaves.

The proof shows that a target leaf does not appear in the tree by presenting its two neighbours in sorted order (with their inclusion proofs) and asserting left < target < right.

Edge cases:

  • For an empty tree, both neighbours are None and index is 0; any target is automatically non-included.
  • When the target sorts before every leaf, left_leaf is None, right_leaf is the first leaf, and index is 0.
  • When the target sorts after every leaf, right_leaf is None and left_leaf is the right-most leaf in the tree (which is detected via MerkleProof::is_right_most during verification).

Implementations§

Source§

impl<L> MerkleNonInclusionProof<L>

Source

pub fn new( index: usize, left_leaf: Option<(L, MerkleProof)>, right_leaf: Option<(L, MerkleProof)>, ) -> Self

Construct a proof directly from its parts. Mostly useful for reconstructing a proof from out-of-band data; the usual way to produce a proof is MerkleTree::compute_non_inclusion_proof.

Source

pub fn index(&self) -> usize

The position where target would be inserted to keep the leaf list sorted.

Source

pub fn left_leaf(&self) -> Option<&(L, MerkleProof)>

The left neighbour leaf and its inclusion proof, if any.

Source

pub fn right_leaf(&self) -> Option<&(L, MerkleProof)>

The right neighbour leaf and its inclusion proof, if any.

Source§

impl<L> MerkleNonInclusionProof<L>
where L: Serialize,

Source

pub fn verify_proof_by_key<K, F>( &self, root: &Node, target_key: &K, key_of: F, ) -> Result<(), MerkleError>
where K: Ord + ?Sized, F: Fn(&L) -> &K,

Verify that no leaf whose projected key equals target_key appears in the tree whose root is root, where each leaf is projected to its comparison key via key_of.

The bracketing inequalities are evaluated on key_of(leaf) instead of on the whole leaf, which is useful when the tree’s leaves carry more than just the field that the caller wants to prove absent (e.g. an ObjectReference tree where the natural question is “is any leaf with this object id present?”).

Soundness depends on the tree being sorted by an order whose projection through key_of is monotonic — that is, all leaves sharing the same key must be contiguous in the sorted leaf list. This is the analogue of the sorted-leaf invariant on verify_proof; the caller is responsible for it, since the verifier cannot inspect the rest of the tree.

Source§

impl<L> MerkleNonInclusionProof<L>
where L: Ord + Serialize,

Source

pub fn verify_proof(&self, root: &Node, target: &L) -> Result<(), MerkleError>

Verify that target is not in the tree whose root is root.

Thin wrapper over verify_proof_by_key with the identity projection — the leaf itself is its own key.

Trait Implementations§

Source§

impl<L: Clone> Clone for MerkleNonInclusionProof<L>

Source§

fn clone(&self) -> MerkleNonInclusionProof<L>

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl<L: Debug> Debug for MerkleNonInclusionProof<L>

Source§

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

Formats the value using the given formatter. Read more
Source§

impl<L: PartialEq> PartialEq for MerkleNonInclusionProof<L>

Source§

fn eq(&self, other: &MerkleNonInclusionProof<L>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<L: Eq> Eq for MerkleNonInclusionProof<L>

Source§

impl<L> StructuralPartialEq for MerkleNonInclusionProof<L>

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
§

impl<U> As for U

§

fn as_<T>(self) -> T
where T: CastFrom<U>,

Casts self to type T. The semantics of numeric casting with the as operator are followed, so <T as As>::as_::<U> can be used in the same way as T as U for numeric conversions. 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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V