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>
impl<'a> BatchedMerkleTreeAccount<'a>
Sourcepub fn get_state_root_by_index<A: AccountInfoTrait>(
account_info: &A,
index: usize,
) -> Result<[u8; 32], BatchedMerkleTreeError>
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.
Sourcepub fn get_address_root_by_index<A: AccountInfoTrait>(
account_info: &A,
index: usize,
) -> Result<[u8; 32], BatchedMerkleTreeError>
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.
Sourcepub fn state_from_account_info<A: AccountInfoTrait>(
account_info: &A,
) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>
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:
- the program owner is the light account compression program,
- discriminator,
- tree type is batched state tree type.
Sourcepub fn state_from_bytes(
account_data: &'a mut [u8],
pubkey: &Pubkey,
) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>
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.
Sourcepub fn address_from_account_info<A: AccountInfoTrait>(
account_info: &A,
) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>
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:
- the program owner is the light account compression program,
- discriminator,
- tree type is batched address tree type.
Sourcepub fn address_from_bytes(
account_data: &'a mut [u8],
pubkey: &Pubkey,
) -> Result<BatchedMerkleTreeAccount<'a>, BatchedMerkleTreeError>
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.
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>
Sourcepub fn update_tree_from_output_queue_account_info<A: AccountInfoTrait>(
&mut self,
queue_account_info: &A,
instruction_data: InstructionDataBatchAppendInputs,
) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
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.
- Checks that the tree and queue are associated.
- Updates the tree with the output queue account.
- Returns the batch append event.
Sourcepub fn update_tree_from_output_queue_account(
&mut self,
queue_account: &mut BatchedQueueAccount<'_>,
instruction_data: InstructionDataBatchAppendInputs,
) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
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.
- Create public inputs hash.
- 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.
- 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.
- Increment next full batch index if inserted.
- Zero out previous batch bloom filter of input queue if current batch is 50% inserted.
- 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
Sourcepub fn update_tree_from_input_queue(
&mut self,
instruction_data: InstructionDataBatchNullifyInputs,
) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
pub fn update_tree_from_input_queue( &mut self, instruction_data: InstructionDataBatchNullifyInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
Update the tree from the input queue account.
Sourcepub fn update_tree_from_address_queue(
&mut self,
instruction_data: InstructionDataAddressAppendInputs,
) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
pub fn update_tree_from_address_queue( &mut self, instruction_data: InstructionDataAddressAppendInputs, ) -> Result<MerkleTreeEvent, BatchedMerkleTreeError>
Update the tree from the address queue account.
Sourcepub fn insert_nullifier_into_queue(
&mut self,
compressed_account_hash: &[u8; 32],
leaf_index: u64,
tx_hash: &[u8; 32],
current_slot: &u64,
) -> Result<(), BatchedMerkleTreeError>
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.
- Check that the tree is a state tree.
- Create nullifier Hash(value,leaf_index, tx_hash).
- 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.
pub fn insert_address_into_queue( &mut self, address: &[u8; 32], current_slot: &u64, ) -> Result<(), BatchedMerkleTreeError>
Sourcepub fn get_root_index(&self) -> u32
pub fn get_root_index(&self) -> u32
Return the latest root index.
Sourcepub fn get_root_by_index(&self, index: usize) -> Option<&[u8; 32]>
pub fn get_root_by_index(&self, index: usize) -> Option<&[u8; 32]>
Return root from the root history by index.
Sourcepub fn get_metadata(&self) -> &BatchedMerkleTreeMetadata
pub fn get_metadata(&self) -> &BatchedMerkleTreeMetadata
Return a reference to the metadata of the tree.
Sourcepub fn get_metadata_mut(&mut self) -> &mut BatchedMerkleTreeMetadata
pub fn get_metadata_mut(&mut self) -> &mut BatchedMerkleTreeMetadata
Return a mutable reference to the metadata of the tree.
Sourcepub fn check_input_queue_non_inclusion(
&mut self,
value: &[u8; 32],
) -> Result<(), BatchedMerkleTreeError>
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.
pub fn tree_is_full(&self) -> bool
pub fn check_queue_next_index_reached_tree_capacity( &self, ) -> Result<(), BatchedMerkleTreeError>
pub fn check_tree_is_full(&self) -> Result<(), BatchedMerkleTreeError>
pub fn get_associated_queue(&self) -> &Pubkey
pub fn pubkey(&self) -> &Pubkey
Methods from Deref<Target = BatchedMerkleTreeMetadata>§
pub const LEN: usize = 680usize
pub fn get_account_size(&self) -> Result<usize, BatchedMerkleTreeError>
Trait Implementations§
Source§impl<'a> Debug for BatchedMerkleTreeAccount<'a>
impl<'a> Debug for BatchedMerkleTreeAccount<'a>
Source§impl Deref for BatchedMerkleTreeAccount<'_>
impl Deref for BatchedMerkleTreeAccount<'_>
Source§impl DerefMut for BatchedMerkleTreeAccount<'_>
impl DerefMut for BatchedMerkleTreeAccount<'_>
Source§impl Discriminator for BatchedMerkleTreeAccount<'_>
impl Discriminator for BatchedMerkleTreeAccount<'_>
const LIGHT_DISCRIMINATOR: [u8; 8]
const LIGHT_DISCRIMINATOR_SLICE: &'static [u8] = b"BatchMta"
fn discriminator() -> [u8; 8]
Source§impl<'a> PartialEq for BatchedMerkleTreeAccount<'a>
impl<'a> PartialEq for BatchedMerkleTreeAccount<'a>
Source§fn eq(&self, other: &BatchedMerkleTreeAccount<'a>) -> bool
fn eq(&self, other: &BatchedMerkleTreeAccount<'a>) -> bool
self
and other
values to be equal, and is used by ==
.impl<'a> StructuralPartialEq for BatchedMerkleTreeAccount<'a>
Auto Trait Implementations§
impl<'a> Freeze for BatchedMerkleTreeAccount<'a>
impl<'a> RefUnwindSafe for BatchedMerkleTreeAccount<'a>
impl<'a> Send for BatchedMerkleTreeAccount<'a>
impl<'a> Sync for BatchedMerkleTreeAccount<'a>
impl<'a> Unpin for BatchedMerkleTreeAccount<'a>
impl<'a> !UnwindSafe for BatchedMerkleTreeAccount<'a>
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> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.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<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self
and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.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
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.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
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.