pub struct LazyMerkleTree<H: Hasher, V: VersionMarker = Derived> { /* private fields */ }Expand description
A storage-optimized merkle tree.
It has a certain linear-buffer represented prefix subtree and the rest of the tree is represented using lazy, pointer-based structures. This makes it possible to hold even large trees in memory, assuming only a relatively small subset is ever modified.
It exposes an immutable API, so that multiple versions can be kept in memory while reusing as much structure as possible.
The update method also allows the specification of a mutability hint, which
can be used to vastly improve storage characteristics, but also requires the
caller to ensure certain additional invariants hold. See
LazyMerkleTree::update_with_mutation for details.
Implementations§
Source§impl<H, Version> LazyMerkleTree<H, Version>
impl<H, Version> LazyMerkleTree<H, Version>
Sourcepub fn new(depth: usize, empty_value: H::Hash) -> LazyMerkleTree<H, Canonical>
pub fn new(depth: usize, empty_value: H::Hash) -> LazyMerkleTree<H, Canonical>
Creates a new, fully lazy (without any dense prefix) tree.
Sourcepub fn new_with_dense_prefix(
depth: usize,
prefix_depth: usize,
empty_value: &H::Hash,
) -> LazyMerkleTree<H, Canonical>
pub fn new_with_dense_prefix( depth: usize, prefix_depth: usize, empty_value: &H::Hash, ) -> LazyMerkleTree<H, Canonical>
Creates a new tree with a dense prefix of the given depth.
Sourcepub fn new_with_dense_prefix_with_initial_values(
depth: usize,
prefix_depth: usize,
empty_value: &H::Hash,
initial_values: &[H::Hash],
) -> LazyMerkleTree<H, Canonical>
pub fn new_with_dense_prefix_with_initial_values( depth: usize, prefix_depth: usize, empty_value: &H::Hash, initial_values: &[H::Hash], ) -> LazyMerkleTree<H, Canonical>
Creates a new tree with a dense prefix of the given depth, and with initial leaves populated from the given slice.
Sourcepub fn new_mmapped_with_dense_prefix_with_init_values(
depth: usize,
prefix_depth: usize,
empty_value: &H::Hash,
initial_values: &[H::Hash],
file_path: &str,
) -> Result<LazyMerkleTree<H, Canonical>, DenseMMapError>
pub fn new_mmapped_with_dense_prefix_with_init_values( depth: usize, prefix_depth: usize, empty_value: &H::Hash, initial_values: &[H::Hash], file_path: &str, ) -> Result<LazyMerkleTree<H, Canonical>, DenseMMapError>
Creates a new memory mapped file specified by path and creates a tree with dense prefix of the given depth with initial values
Sourcepub fn attempt_dense_mmap_restore(
depth: usize,
prefix_depth: usize,
empty_leaf: &H::Hash,
file_path: &str,
) -> Result<LazyMerkleTree<H, Canonical>, DenseMMapError>
pub fn attempt_dense_mmap_restore( depth: usize, prefix_depth: usize, empty_leaf: &H::Hash, file_path: &str, ) -> Result<LazyMerkleTree<H, Canonical>, DenseMMapError>
Attempts to restore previous tree state from memory mapped file
§Errors
- dense mmap tree restore failed
Sourcepub fn update(
&self,
index: usize,
value: &H::Hash,
) -> LazyMerkleTree<H, Derived>
pub fn update( &self, index: usize, value: &H::Hash, ) -> LazyMerkleTree<H, Derived>
Sets the value at the given index to the given value. This is fully
immutable, returning a new tree and leaving the old one unchanged.
Reuses as much memory as possible, allocating only depth nodes.
Sourcepub fn proof(&self, index: usize) -> InclusionProof<H>
pub fn proof(&self, index: usize) -> InclusionProof<H>
Returns the Merkle proof for the given index.
Sourcepub fn verify(&self, value: H::Hash, proof: &InclusionProof<H>) -> bool
pub fn verify(&self, value: H::Hash, proof: &InclusionProof<H>) -> bool
Verifies the given proof for the given value.
Source§impl<H> LazyMerkleTree<H, Canonical>
impl<H> LazyMerkleTree<H, Canonical>
Sourcepub fn update_with_mutation(self, index: usize, value: &H::Hash) -> Self
pub fn update_with_mutation(self, index: usize, value: &H::Hash) -> Self
Sets the value at the given index to the given value. This is a mutable operation, that will modify any dense subtrees in place.
This has potential consequences for the soundness of the whole structure: it has the potential to invalidate some trees that share nodes with this one, so if many versions are kept at once, special care must be taken when calling this. The only trees that are guaranteed to still be valid after this operation, are those that already specify the same value at the given index. For example, if a linear history of updates is kept in memory, this operation is a good way to “flatten” updates into the oldest kept version.
This operation is useful for storage optimizations, as it avoids allocating any new memory in dense subtrees.
Sourcepub fn derived(&self) -> LazyMerkleTree<H, Derived>
pub fn derived(&self) -> LazyMerkleTree<H, Derived>
Gives a Derived version of this tree. Useful for initializing
versioned trees.
Trait Implementations§
Auto Trait Implementations§
impl<H, V> Freeze for LazyMerkleTree<H, V>
impl<H, V> RefUnwindSafe for LazyMerkleTree<H, V>
impl<H, V> Send for LazyMerkleTree<H, V>
impl<H, V> Sync for LazyMerkleTree<H, V>
impl<H, V> Unpin for LazyMerkleTree<H, V>
impl<H, V> UnwindSafe for LazyMerkleTree<H, V>
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<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