pub struct SparseMerklePath { /* private fields */ }Expand description
A different representation of MerklePath designed for memory efficiency for Merkle paths
with empty nodes.
Empty nodes in the path are stored only as their position, represented with a bitmask. A
maximum of 64 nodes (SMT_MAX_DEPTH) can be stored (empty and non-empty). The more nodes in a
path are empty, the less memory this struct will use. This type calculates empty nodes on-demand
when iterated through, converted to a MerklePath, or an empty node is retrieved with
SparseMerklePath::at_depth(), which will incur overhead.
NOTE: This type assumes that Merkle paths always span from the root of the tree to a leaf. Partial paths are not supported.
Implementations§
Source§impl SparseMerklePath
impl SparseMerklePath
Sourcepub fn from_parts(
empty_nodes_mask: u64,
nodes: Vec<Word>,
) -> Result<SparseMerklePath, MerkleError>
pub fn from_parts( empty_nodes_mask: u64, nodes: Vec<Word>, ) -> Result<SparseMerklePath, MerkleError>
Constructs a new sparse Merkle path from a bitmask of empty nodes and a vector of non-empty nodes.
The empty_nodes_mask is a bitmask where each set bit indicates that the node at that
depth is empty. The least significant bit (bit 0) describes depth 1 node (root’s children).
The bit index + 1 is equal to node’s depth.
The nodes vector must contain the non-empty nodes in depth order.
§Errors
- MerkleError::InvalidPathLength if the provided
nodesvector is shorter than the minimum length required by theempty_nodes_mask. - MerkleError::DepthTooBig if the total depth of the path (calculated from the
empty_nodes_maskandnodes) is greater than SMT_MAX_DEPTH.
Sourcepub fn from_sized_iter<I>(iterator: I) -> Result<SparseMerklePath, MerkleError>
pub fn from_sized_iter<I>(iterator: I) -> Result<SparseMerklePath, MerkleError>
Constructs a sparse Merkle path from an iterator over Merkle nodes that also knows its exact size (such as iterators created with Vec::into_iter). The iterator must be in order of deepest to shallowest.
Knowing the size is necessary to calculate the depth of the tree, which is needed to detect which nodes are empty nodes.
§Errors
Returns MerkleError::DepthTooBig if tree_depth is greater than SMT_MAX_DEPTH.
Sourcepub fn depth(&self) -> u8
pub fn depth(&self) -> u8
Returns the total depth of this path, i.e., the number of nodes this path represents.
Sourcepub fn at_depth(&self, node_depth: NonZero<u8>) -> Result<Word, MerkleError>
pub fn at_depth(&self, node_depth: NonZero<u8>) -> Result<Word, MerkleError>
Get a specific node in this path at a given depth.
The depth parameter is defined in terms of self.depth(). Merkle paths conventionally do
not include the root, so the shallowest depth is 1, and the deepest depth is
self.depth().
§Errors
Returns MerkleError::DepthTooBig if node_depth is greater than the total depth of this
path.
Sourcepub fn into_parts(self) -> (u64, Vec<Word>)
pub fn into_parts(self) -> (u64, Vec<Word>)
Deconstructs this path into its component parts.
Returns a tuple containing:
- a bitmask where each set bit indicates that the node at that depth is empty. The least significant bit (bit 0) describes depth 1 node (root’s children).
- a vector of non-empty nodes in depth order.
Sourcepub fn iter(&self) -> impl ExactSizeIterator
pub fn iter(&self) -> impl ExactSizeIterator
Constructs a borrowing iterator over the nodes in this path. Starts from the leaf and iterates toward the root (excluding the root).
Sourcepub fn compute_root(
&self,
index: u64,
node_to_prove: Word,
) -> Result<Word, MerkleError>
pub fn compute_root( &self, index: u64, node_to_prove: Word, ) -> Result<Word, MerkleError>
Computes the Merkle root for this opening.
Sourcepub fn verify(
&self,
index: u64,
node: Word,
_: &Word,
) -> Result<(), MerkleError>
pub fn verify( &self, index: u64, node: Word, _: &Word, ) -> Result<(), MerkleError>
Verifies the Merkle opening proof towards the provided root.
§Errors
Returns an error if:
- provided node index is invalid.
- root calculated during the verification differs from the provided one.
Sourcepub fn authenticated_nodes(
&self,
index: u64,
node_to_prove: Word,
) -> Result<InnerNodeIterator<'_>, MerkleError>
pub fn authenticated_nodes( &self, index: u64, node_to_prove: Word, ) -> Result<InnerNodeIterator<'_>, MerkleError>
Given the node this path opens to, return an iterator of all the nodes that are known via this path.
Each item in the iterator is an InnerNodeInfo, containing the hash of a node as .value,
and its two children as .left and .right. The very first item in that iterator will be
the parent of node_to_prove as stored in this SparseMerklePath.
From there, the iterator will continue to yield every further parent and both of its children, up to and including the root node.
If node_to_prove is not the node this path is an opening to, or index is not the
correct index for that node, the returned nodes will be meaningless.
§Errors
Returns an error if the specified index is not valid for this path.
Trait Implementations§
Source§impl Clone for SparseMerklePath
impl Clone for SparseMerklePath
Source§fn clone(&self) -> SparseMerklePath
fn clone(&self) -> SparseMerklePath
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SparseMerklePath
impl Debug for SparseMerklePath
Source§impl Default for SparseMerklePath
impl Default for SparseMerklePath
Source§fn default() -> SparseMerklePath
fn default() -> SparseMerklePath
Source§impl Deserializable for SparseMerklePath
impl Deserializable for SparseMerklePath
Source§fn read_from<R>(
source: &mut R,
) -> Result<SparseMerklePath, DeserializationError>where
R: ByteReader,
fn read_from<R>(
source: &mut R,
) -> Result<SparseMerklePath, DeserializationError>where
R: ByteReader,
source, attempts to deserialize these bytes
into Self, and returns the result. Read moreSource§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
Source§impl From<SparseMerklePath> for MerklePath
impl From<SparseMerklePath> for MerklePath
Source§fn from(sparse_path: SparseMerklePath) -> MerklePath
fn from(sparse_path: SparseMerklePath) -> MerklePath
Source§impl<'p> IntoIterator for &'p SparseMerklePath
impl<'p> IntoIterator for &'p SparseMerklePath
Source§impl IntoIterator for SparseMerklePath
impl IntoIterator for SparseMerklePath
Source§impl PartialEq<MerklePath> for SparseMerklePath
impl PartialEq<MerklePath> for SparseMerklePath
Source§impl PartialEq<SparseMerklePath> for MerklePath
impl PartialEq<SparseMerklePath> for MerklePath
Source§impl PartialEq for SparseMerklePath
impl PartialEq for SparseMerklePath
Source§impl Serializable for SparseMerklePath
impl Serializable for SparseMerklePath
Source§fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
fn write_into<W>(&self, target: &mut W)where
W: ByteWriter,
self into bytes and writes these bytes into the target.Source§fn get_size_hint(&self) -> usize
fn get_size_hint(&self) -> usize
Source§impl TryFrom<MerklePath> for SparseMerklePath
impl TryFrom<MerklePath> for SparseMerklePath
Source§fn try_from(path: MerklePath) -> Result<SparseMerklePath, MerkleError>
fn try_from(path: MerklePath) -> Result<SparseMerklePath, MerkleError>
§Errors
This conversion returns MerkleError::DepthTooBig if the path length is greater than
SMT_MAX_DEPTH.
Source§type Error = MerkleError
type Error = MerkleError
impl Eq for SparseMerklePath
impl StructuralPartialEq for SparseMerklePath
Auto Trait Implementations§
impl Freeze for SparseMerklePath
impl RefUnwindSafe for SparseMerklePath
impl Send for SparseMerklePath
impl Sync for SparseMerklePath
impl Unpin for SparseMerklePath
impl UnwindSafe for SparseMerklePath
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more