pub struct MerkleTreeWithHistory;Expand description
Merkle Tree with root history for privacy-preserving transactions
This struct provides methods to manage a fixed-depth binary Merkle tree that maintains a history of recent roots. When the tree is modified, it automatically preserves previous roots for membership proof verification.
Implementations§
Source§impl MerkleTreeWithHistory
impl MerkleTreeWithHistory
Sourcepub fn init(env: &Env, levels: u32) -> Result<(), Error>
pub fn init(env: &Env, levels: u32) -> Result<(), Error>
Initialize the Merkle tree with history
Creates a new Merkle tree with the specified number of levels. The tree is initialized with precomputed zero hashes at each level, and the initial root is set to the zero hash at the top level.
§Arguments
env- The Soroban environmentlevels- Number of levels in the Merkle tree (must be in range [1..32])
Sourcepub fn insert_two_leaves(
env: &Env,
leaf_1: U256,
leaf_2: U256,
) -> Result<(u32, u32), Error>
pub fn insert_two_leaves( env: &Env, leaf_1: U256, leaf_2: U256, ) -> Result<(u32, u32), Error>
Insert two leaves into the Merkle tree as siblings
Adds 2 new leaves to the Merkle tree and updates the root. The leaves are inserted at the next available index, and the tree is updated efficiently by only recomputing the hashes along the path to the root.
When the tree is modified, a new root is automatically created in
the next history slot. The previous root remains valid for proof
verification until it is overwritten after ROOT_HISTORY_SIZE
rotations.
§Arguments
env- The Soroban environmentleaf_1- The left leaf value to insert (at even index)leaf_2- The right leaf value to insert (at odd index)
§Returns
Returns the indexes where leaves were inserted
Sourcepub fn is_known_root(env: &Env, root: &U256) -> Result<bool, Error>
pub fn is_known_root(env: &Env, root: &U256) -> Result<bool, Error>
Check if a root exists in the recent history
Searches the root history ring buffer to verify if a given root is valid. This allows proofs generated against recent tree states to be verified, providing some tolerance for latency between proof generation and submission.
§Arguments
env- The Soroban environmentroot- The Merkle root to check
§Returns
Returns true if the root exists in the history buffer, false
otherwise. Zero root always returns false.
Sourcepub fn get_last_root(env: &Env) -> Result<U256, Error>
pub fn get_last_root(env: &Env) -> Result<U256, Error>
Sourcepub fn hash_pair(env: &Env, left: U256, right: U256) -> U256
pub fn hash_pair(env: &Env, left: U256, right: U256) -> U256
Hash two U256 values using Poseidon2 compression
Computes the Poseidon2 hash of two field elements in compression mode. This is the core hashing function used for Merkle tree operations.
§Arguments
env- The Soroban environmentleft- Left input valueright- Right input value
§Returns
The Poseidon2 hash result as U256
Auto Trait Implementations§
impl Freeze for MerkleTreeWithHistory
impl RefUnwindSafe for MerkleTreeWithHistory
impl Send for MerkleTreeWithHistory
impl Sync for MerkleTreeWithHistory
impl Unpin for MerkleTreeWithHistory
impl UnwindSafe for MerkleTreeWithHistory
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<T, U, V, E, C> Compare<(T, U, V)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E> + Compare<U> + Compare<V>,
impl<T, U, V, E, C> Compare<(T, U, V)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E> + Compare<U> + Compare<V>,
§impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W>,
impl<T, U, V, W, E, C> Compare<(T, U, V, W)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W>,
type Error = E
fn compare( &self, a: &(T, U, V, W), b: &(T, U, V, W), ) -> Result<Ordering, <C as Compare<(T, U, V, W)>>::Error>
§impl<T, U, V, W, X, E, C> Compare<(T, U, V, W, X)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W> + Compare<X>,
impl<T, U, V, W, X, E, C> Compare<(T, U, V, W, X)> for Cwhere
C: Compare<T, Error = E, Error = E, Error = E, Error = E, Error = E> + Compare<U> + Compare<V> + Compare<W> + Compare<X>,
type Error = E
fn compare( &self, a: &(T, U, V, W, X), b: &(T, U, V, W, X), ) -> Result<Ordering, <C as Compare<(T, U, V, W, X)>>::Error>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§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 more