LazyMerkleTree

Struct LazyMerkleTree 

Source
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>
where H: Hasher, <H as Hasher>::Hash: Hash, Version: VersionMarker,

Source

pub fn new(depth: usize, empty_value: H::Hash) -> LazyMerkleTree<H, Canonical>

Creates a new, fully lazy (without any dense prefix) tree.

Source

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.

Source

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.

Source

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

Source

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
Source

pub const fn depth(&self) -> usize

Returns the depth of the tree.

Source

pub fn root(&self) -> H::Hash

Returns the root of the tree.

Source

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.

Source

pub fn proof(&self, index: usize) -> InclusionProof<H>

Returns the Merkle proof for the given index.

Source

pub fn verify(&self, value: H::Hash, proof: &InclusionProof<H>) -> bool

Verifies the given proof for the given value.

Source

pub fn get_leaf(&self, index: usize) -> H::Hash

Returns the value at the given index.

Source

pub fn leaves(&self) -> impl Iterator<Item = H::Hash> + '_

Returns an iterator over all leaves.

Source§

impl<H> LazyMerkleTree<H, Canonical>
where H: Hasher, <H as Hasher>::Hash: Hash,

Source

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.

Source

pub fn derived(&self) -> LazyMerkleTree<H, Derived>

Gives a Derived version of this tree. Useful for initializing versioned trees.

Trait Implementations§

Source§

impl<H> Clone for LazyMerkleTree<H, Derived>
where H: Hasher, <H as Hasher>::Hash: Hash,

Source§

fn clone(&self) -> Self

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

Auto Trait Implementations§

§

impl<H, V> Freeze for LazyMerkleTree<H, V>
where V: Freeze, <H as Hasher>::Hash: Freeze,

§

impl<H, V> RefUnwindSafe for LazyMerkleTree<H, V>

§

impl<H, V> Send for LazyMerkleTree<H, V>
where V: Send, <H as Hasher>::Hash: Send + Sync, H: Send,

§

impl<H, V> Sync for LazyMerkleTree<H, V>
where V: Sync, <H as Hasher>::Hash: Sync + Send, H: Send,

§

impl<H, V> Unpin for LazyMerkleTree<H, V>
where V: Unpin, <H as Hasher>::Hash: Unpin,

§

impl<H, V> UnwindSafe for LazyMerkleTree<H, V>

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> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more