pub struct Mmr { /* private fields */ }Expand description
A fully materialized Merkle Mountain Range, with every tree in the forest and all their elements.
Since this is a full representation of the MMR, elements are never removed and the MMR will
grow roughly O(2n) in number of leaf elements.
Cloning is cheap: the nodes are stored in chunks shared between clones, so a clone copies
O(num_nodes / 1024) pointers instead of the full node buffer, and appending to the original
after a clone copies at most one chunk.
Implementations§
Source§impl Mmr
impl Mmr
Sourcepub fn try_from_iter<T>(values: T) -> Result<Mmr, MmrError>where
T: IntoIterator<Item = Word>,
pub fn try_from_iter<T>(values: T) -> Result<Mmr, MmrError>where
T: IntoIterator<Item = Word>,
Constructs an MMR from an iterator of leaves.
§Errors
Returns an error if the maximum forest size is exceeded.
Sourcepub fn from_nodes_unchecked(
forest: Forest,
nodes: impl IntoIterator<Item = Word>,
) -> Result<Mmr, MmrError>
pub fn from_nodes_unchecked( forest: Forest, nodes: impl IntoIterator<Item = Word>, ) -> Result<Mmr, MmrError>
Constructs an MMR from its forest and complete node array, in insertion (postorder) order,
e.g. as previously obtained from mmr.nodes_from(0).copied() (see Mmr::nodes_from).
The only validation performed is structural: the node count must match forest. The
nodes are otherwise taken verbatim — no hashes are recomputed or verified.
Comparing the result’s Mmr::peaks against a trusted commitment checks the accumulator
state, but because the peaks are read from the stored nodes rather than recomputed, it does
not validate any non-peak nodes. The nodes must therefore come from a trusted source, e.g.
the caller’s own previously validated state.
§Errors
Returns an error if the number of nodes does not match the node count of forest.
Sourcepub fn nodes_from(&self, start: usize) -> impl ExactSizeIterator + Clone
pub fn nodes_from(&self, start: usize) -> impl ExactSizeIterator + Clone
Returns an iterator over the MMR’s nodes at indices start.., in insertion (postorder)
order. Returns an empty iterator if start is greater than or equal to the total node
count, which is given by self.forest().num_nodes().
The node buffer is strictly append-only, so a consumer that has persisted the first
start nodes can incrementally sync by appending only the nodes returned here.
Positioning is cheap: the iterator starts directly at start without walking the
preceding nodes, and it knows its exact remaining length.
Sourcepub fn open(&self, pos: usize) -> Result<MmrProof, MmrError>
pub fn open(&self, pos: usize) -> Result<MmrProof, MmrError>
Returns an MmrProof for the leaf at the specified position.
Note: The leaf position is the 0-indexed number corresponding to the order the leaves were added, this corresponds to the MMR size prior to adding the element. So the 1st element has position 0, the second position 1, and so on.
§Errors
Returns an error if the specified leaf position is out of bounds for this MMR.
Sourcepub fn open_at(&self, pos: usize, forest: Forest) -> Result<MmrProof, MmrError>
pub fn open_at(&self, pos: usize, forest: Forest) -> Result<MmrProof, MmrError>
Returns an MmrProof for the leaf at the specified position using the state of the MMR
at the specified forest.
Note: The leaf position is the 0-indexed number corresponding to the order the leaves were added, this corresponds to the MMR size prior to adding the element. So the 1st element has position 0, the second position 1, and so on.
§Errors
Returns an error if:
- The specified leaf position is out of bounds for this MMR.
- The specified
forestvalue is not valid for this MMR.
Sourcepub fn get(&self, pos: usize) -> Result<Word, MmrError>
pub fn get(&self, pos: usize) -> Result<Word, MmrError>
Returns the leaf value at position pos.
Note: The leaf position is the 0-indexed number corresponding to the order the leaves were added, this corresponds to the MMR size prior to adding the element. So the 1st element has position 0, the second position 1, and so on.
Sourcepub fn add(&mut self, el: Word) -> Result<(), MmrError>
pub fn add(&mut self, el: Word) -> Result<(), MmrError>
Adds a new element to the MMR.
§Errors
Returns an error if the MMR exceeds the maximum supported forest size.
Sourcepub fn peaks_at(&self, forest: Forest) -> Result<MmrPeaks, MmrError>
pub fn peaks_at(&self, forest: Forest) -> Result<MmrPeaks, MmrError>
Returns the peaks of the MMR at the state specified by forest.
§Errors
Returns an error if the specified forest value is not valid for this MMR.
Sourcepub fn get_delta(
&self,
from_forest: Forest,
to_forest: Forest,
) -> Result<MmrDelta, MmrError>
pub fn get_delta( &self, from_forest: Forest, to_forest: Forest, ) -> Result<MmrDelta, MmrError>
Compute the required update to original_forest.
The result is a packed sequence of the authentication elements required to update the trees that have been merged together, followed by the new peaks of the Mmr.
Sourcepub fn inner_nodes(&self) -> MmrNodes<'_>
pub fn inner_nodes(&self) -> MmrNodes<'_>
An iterator over inner nodes in the MMR. The order of iteration is unspecified.
Trait Implementations§
Source§impl Deserializable for Mmr
impl Deserializable for Mmr
Source§fn read_from<R>(source: &mut R) -> Result<Mmr, DeserializationError>where
R: ByteReader,
fn read_from<R>(source: &mut R) -> Result<Mmr, DeserializationError>where
R: ByteReader,
source, attempts to deserialize these bytes
into Self, and returns the result. Read moreSource§fn min_serialized_size() -> usize
fn min_serialized_size() -> usize
Source§fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
fn read_from_bytes(bytes: &[u8]) -> Result<Self, DeserializationError>
Source§fn read_from_bytes_with_budget(
bytes: &[u8],
budget: usize,
) -> Result<Self, DeserializationError>
fn read_from_bytes_with_budget( bytes: &[u8], budget: usize, ) -> Result<Self, DeserializationError>
Self from bytes with a byte budget limit. Read moreSource§impl From<&Mmr> for MerkleStore
impl From<&Mmr> for MerkleStore
Source§fn from(value: &Mmr) -> MerkleStore
fn from(value: &Mmr) -> MerkleStore
Source§impl Serializable for Mmr
impl Serializable for Mmr
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
Auto Trait Implementations§
impl Freeze for Mmr
impl RefUnwindSafe for Mmr
impl Send for Mmr
impl Sync for Mmr
impl Unpin for Mmr
impl UnsafeUnpin for Mmr
impl UnwindSafe for Mmr
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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 moreSource§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