Struct BatchedMerkleTreeAccount

Source
pub struct BatchedMerkleTreeAccount<'a> {
    pub root_history: ZeroCopyCyclicVecU64<'a, [u8; 32]>,
    pub bloom_filter_stores: [&'a mut [u8]; 2],
    pub hash_chain_stores: [ZeroCopyVecU64<'a, [u8; 32]>; 2],
    /* private fields */
}
Expand description

Batched Merkle tree zero copy account. The account is used to batched state and address Merkle trees, plus the input and address queues, in the Light Protocol account compression program.

Tree roots can be used in zk proofs outside of Light Protocol programs.

To access a tree root by index use:

  • get_state_root_by_index
  • get_address_root_by_index

Fields§

§root_history: ZeroCopyCyclicVecU64<'a, [u8; 32]>§bloom_filter_stores: [&'a mut [u8]; 2]§hash_chain_stores: [ZeroCopyVecU64<'a, [u8; 32]>; 2]

Implementations§

Source§

impl<'a> BatchedMerkleTreeAccount<'a>

Source

pub fn get_state_root_by_index<A: AccountInfoTrait>( account_info: &A, index: usize, ) -> Result<[u8; 32], BatchedMerkleTreeError>

Checks state Merkle tree account and returns the root.

Source

pub fn get_address_root_by_index<A: AccountInfoTrait>( account_info: &A, index: usize, ) -> Result<[u8; 32], BatchedMerkleTreeError>

Checks address Merkle tree account and returns the root.

Source

pub fn state_from_account_info<A: AccountInfoTrait>( account_info: &A, ) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>

Deserialize a batched state Merkle tree from account info. Should be used in solana programs. Checks that:

  1. the program owner is the light account compression program,
  2. discriminator,
  3. tree type is batched state tree type.
Source

pub fn state_from_bytes( account_data: &'a mut [u8], pubkey: &Pubkey, ) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>

Deserialize a state BatchedMerkleTreeAccount from bytes. Should only be used in client. Checks the discriminator and tree type.

Source

pub fn address_from_account_info<A: AccountInfoTrait>( account_info: &A, ) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>

Deserialize a batched address Merkle tree from account info. Should be used in solana programs. Checks that:

  1. the program owner is the light account compression program,
  2. discriminator,
  3. tree type is batched address tree type.
Source

pub fn address_from_bytes( account_data: &'a mut [u8], pubkey: &Pubkey, ) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>

Deserialize a state BatchedMerkleTreeAccount from bytes. Should only be used in client. Checks the discriminator and tree type.

Source

pub fn init( account_data: &'a mut [u8], pubkey: &Pubkey, metadata: MerkleTreeMetadata, root_history_capacity: u32, input_queue_batch_size: u64, input_queue_zkp_batch_size: u64, height: u32, num_iters: u64, bloom_filter_capacity: u64, tree_type: TreeType, ) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>

Source

pub fn update_tree_from_output_queue_account_info<A: AccountInfoTrait>( &mut self, queue_account_info: &A, instruction_data: InstructionDataBatchAppendInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>

Update the tree from the output queue account.

  1. Checks that the tree and queue are associated.
  2. Updates the tree with the output queue account.
  3. Returns the batch append event.
Source

pub fn update_tree_from_output_queue_account( &mut self, queue_account: &mut BatchedQueueAccount<'_>, instruction_data: InstructionDataBatchAppendInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>

Update the tree from the output queue account.

  1. Create public inputs hash.
  2. Verify update proof and update tree account. 2.1. Verify proof. 2.2. Increment sequence number. 2.3. Increment next index. 2.4. Append new root to root history.
  3. Mark zkp batch as inserted in the merkle tree. 3.1. Checks that the batch is ready. 3.2. Increment the number of inserted zkps. 3.3. If all zkps are inserted, set batch state to inserted.
  4. Increment next full batch index if inserted.
  5. Zero out previous batch bloom filter of input queue if current batch is 50% inserted.
  6. Return the batch append event.

Note: when proving inclusion by index in value array we need to insert the value into a bloom_filter once it is inserted into the tree. Check this with get_num_inserted_zkps

Source

pub fn update_tree_from_input_queue( &mut self, instruction_data: InstructionDataBatchNullifyInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>

Update the tree from the input queue account.

Source

pub fn update_tree_from_address_queue( &mut self, instruction_data: InstructionDataAddressAppendInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>

Update the tree from the address queue account.

Source

pub fn insert_nullifier_into_queue( &mut self, compressed_account_hash: &[u8; 32], leaf_index: u64, tx_hash: &[u8; 32], current_slot: &u64, ) -> Result<(), BatchedMerkleTreeError>

Insert nullifier into current batch.

  1. Check that the tree is a state tree.
  2. Create nullifier Hash(value,leaf_index, tx_hash).
  3. Insert nullifier into current batch. 3.1. Insert compressed_account_hash into bloom filter. (bloom filter enables non-inclusion proofs in later txs) 3.2. Add nullifier to leaves hash chain. (Nullification means, the compressed_account_hash in the tree, is overwritten with a nullifier hash) 3.3. Check that compressed_account_hash does not exist in any other bloom filter.
Source

pub fn insert_address_into_queue( &mut self, address: &[u8; 32], current_slot: &u64, ) -> Result<(), BatchedMerkleTreeError>

Source

pub fn get_root_index(&self) -> u32

Return the latest root index.

Source

pub fn get_root(&self) -> Option<[u8; 32]>

Return the latest root of the tree.

Source

pub fn get_root_by_index(&self, index: usize) -> Option<&[u8; 32]>

Return root from the root history by index.

Source

pub fn get_metadata(&self) -> &BatchedMerkleTreeMetadata

Return a reference to the metadata of the tree.

Source

pub fn get_metadata_mut(&mut self) -> &mut BatchedMerkleTreeMetadata

Return a mutable reference to the metadata of the tree.

Source

pub fn check_input_queue_non_inclusion( &mut self, value: &[u8; 32], ) -> Result<(), BatchedMerkleTreeError>

Check non-inclusion in all bloom filters which are not zeroed.

Source

pub fn tree_is_full(&self) -> bool

Source

pub fn check_queue_next_index_reached_tree_capacity( &self, ) -> Result<(), BatchedMerkleTreeError>

Source

pub fn check_tree_is_full(&self) -> Result<(), BatchedMerkleTreeError>

Source

pub fn get_associated_queue(&self) -> &Pubkey

Source

pub fn pubkey(&self) -> &Pubkey

Methods from Deref<Target = BatchedMerkleTreeMetadata>§

Trait Implementations§

Source§

impl<'a> Debug for BatchedMerkleTreeAccount<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Deref for BatchedMerkleTreeAccount<'_>

Source§

type Target = BatchedMerkleTreeMetadata

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl DerefMut for BatchedMerkleTreeAccount<'_>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl Discriminator for BatchedMerkleTreeAccount<'_>

Source§

impl<'a> PartialEq for BatchedMerkleTreeAccount<'a>

Source§

fn eq(&self, other: &BatchedMerkleTreeAccount<'a>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl<'a> StructuralPartialEq for BatchedMerkleTreeAccount<'a>

Auto Trait Implementations§

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

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. 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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V