#[repr(C)]pub struct MerkleTree {
pub root: [u8; 32],
/* private fields */
}
Expand description
Merkle tree creation result containing the root and proof generation capabilities.
This structure provides everything needed for off-chain processors to:
- Generate the merkle root for snapshot updates
- Generate merkle proofs for individual claims
- Verify merkle proofs for validation
§Security
- Deterministic: Same input data always produces the same merkle root
- Cryptographic: Uses Solana hashv for collision resistance
- Efficient: O(n) construction time, O(log n) proof generation
- Verifiable: All proofs can be verified on-chain
Fields§
§root: [u8; 32]
The merkle root hash (32 bytes) - used for snapshot updates
Implementations§
Source§impl MerkleTree
impl MerkleTree
Sourcepub fn new(participants: Vec<DailyParticipantData>) -> Self
pub fn new(participants: Vec<DailyParticipantData>) -> Self
Create a new merkle tree from participant data.
§Parameters
participants
: Vector of daily participant data
§Returns
MerkleTree
instance with root and proof generation capabilities
§Panics
- If participants vector is empty
§Example
use miracle_api::{sdk, prelude::{DailyParticipantData, MerkleTree}};
let participants = vec![
DailyParticipantData::new([1u8; 32], 1723680000, 1723766400, [1u8; 8], [2u8; 8], 5, 0),
DailyParticipantData::new([2u8; 32], 1723680000, 1723766400, [3u8; 8], [4u8; 8], 10, 1),
];
let merkle_tree = MerkleTree::new(participants);
println!("Merkle root: {:?}", merkle_tree.root());
Sourcepub fn generate_proof(&self, participant_index: usize) -> MerkleProof
pub fn generate_proof(&self, participant_index: usize) -> MerkleProof
Generate a merkle proof for a specific participant.
§Parameters
participant_index
: Index of the participant in the original data
§Returns
MerkleProof
containing path and indices for verification
§Panics
- If participant_index is out of bounds
§Example
use miracle_api::{sdk, prelude::{DailyParticipantData, MerkleTree, EpochClaimData}};
use solana_program::pubkey::Pubkey;
let participants = vec![
DailyParticipantData::new([1u8; 32], 1723680000, 1723766400, [1u8; 8], [2u8; 8], 5, 0),
DailyParticipantData::new([2u8; 32], 1723680000, 1723766400, [3u8; 8], [4u8; 8], 10, 1),
];
let merkle_tree = MerkleTree::new(participants);
let payment_proof = merkle_tree.generate_proof(0);
let seal_proof = sdk::SealProof::new_for_verification(vec![[2u8; 32]], vec![true], merkle_tree.root());
// Use proof for claim instruction using dual merkle tree
let customer_wallet = Pubkey::new_unique();
let beneficiary = Pubkey::new_unique();
let epoch = 0u64;
let participant_type = 0u8;
let claim_ix = sdk::claim(
customer_wallet,
beneficiary,
epoch,
DailyParticipantData::new([1u8; 32], 1723680000, 1723766400, [1u8; 8], [2u8; 8], 5, 0),
payment_proof.path,
payment_proof.indices,
seal_proof.path,
seal_proof.indices,
seal_proof.payment_root,
EpochClaimData {
customer_reward_pool: 1000000u64.to_le_bytes(),
merchant_reward_pool: 500000u64.to_le_bytes(),
total_customer_activity: 0u64.to_le_bytes(),
total_merchant_activity: 0u64.to_le_bytes(),
},
participant_type,
None, // social_data (no social claim)
);
Sourcepub fn find_and_generate_proof(
&self,
participant_id: [u8; 32],
) -> Option<MerkleProof>
pub fn find_and_generate_proof( &self, participant_id: [u8; 32], ) -> Option<MerkleProof>
Find participant by ID and generate proof.
§Parameters
participant_id
: The participant ID to find
§Returns
Some(MerkleProof)
if participant foundNone
if participant not found
§Example
use miracle_api::{sdk, prelude::{DailyParticipantData, MerkleTree}};
let participants = vec![
DailyParticipantData::new([1u8; 32], 1723680000, 1723766400, [1u8; 8], [2u8; 8], 5, 0),
DailyParticipantData::new([2u8; 32], 1723680000, 1723766400, [3u8; 8], [4u8; 8], 10, 1),
];
let merkle_tree = MerkleTree::new(participants);
if let Some(payment_proof) = merkle_tree.find_and_generate_proof([1u8; 32]) {
// Use payment proof for dual merkle tree claim
}
Sourcepub fn participant_count(&self) -> usize
pub fn participant_count(&self) -> usize
Sourcepub fn get_participant(&self, index: usize) -> Option<&DailyParticipantData>
pub fn get_participant(&self, index: usize) -> Option<&DailyParticipantData>
Sourcepub fn participants(&self) -> &[DailyParticipantData]
pub fn participants(&self) -> &[DailyParticipantData]
Trait Implementations§
Source§impl Clone for MerkleTree
impl Clone for MerkleTree
Source§fn clone(&self) -> MerkleTree
fn clone(&self) -> MerkleTree
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moreSource§impl Debug for MerkleTree
impl Debug for MerkleTree
Source§impl<'de> Deserialize<'de> for MerkleTree
impl<'de> Deserialize<'de> for MerkleTree
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
Auto Trait Implementations§
impl Freeze for MerkleTree
impl RefUnwindSafe for MerkleTree
impl Send for MerkleTree
impl Sync for MerkleTree
impl Unpin for MerkleTree
impl UnwindSafe for MerkleTree
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
Mutably borrows from an owned value. Read more
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Casts the value.
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Casts the value.
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
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>
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 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>
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 moreSource§impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
Source§fn lossless_try_into(self) -> Option<Dst>
fn lossless_try_into(self) -> Option<Dst>
Performs the conversion.
Source§impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
Source§fn lossy_into(self) -> Dst
fn lossy_into(self) -> Dst
Performs the conversion.
Source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Casts the value.
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Casts the value.
Source§impl<T> UnwrappedAs for T
impl<T> UnwrappedAs for T
Source§fn unwrapped_as<Dst>(self) -> Dstwhere
T: UnwrappedCast<Dst>,
fn unwrapped_as<Dst>(self) -> Dstwhere
T: UnwrappedCast<Dst>,
Casts the value.
Source§impl<Src, Dst> UnwrappedCastFrom<Src> for Dstwhere
Src: UnwrappedCast<Dst>,
impl<Src, Dst> UnwrappedCastFrom<Src> for Dstwhere
Src: UnwrappedCast<Dst>,
Source§fn unwrapped_cast_from(src: Src) -> Dst
fn unwrapped_cast_from(src: Src) -> Dst
Casts the value.
Source§impl<T> WrappingAs for T
impl<T> WrappingAs for T
Source§fn wrapping_as<Dst>(self) -> Dstwhere
T: WrappingCast<Dst>,
fn wrapping_as<Dst>(self) -> Dstwhere
T: WrappingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> WrappingCastFrom<Src> for Dstwhere
Src: WrappingCast<Dst>,
impl<Src, Dst> WrappingCastFrom<Src> for Dstwhere
Src: WrappingCast<Dst>,
Source§fn wrapping_cast_from(src: Src) -> Dst
fn wrapping_cast_from(src: Src) -> Dst
Casts the value.