SealMerkleTree

Struct SealMerkleTree 

Source
#[repr(C)]
pub struct SealMerkleTree { pub root: [u8; 32], /* private fields */ }
Expand description

Seal Merkle Tree for incremental construction of historical payment roots.

This tree grows incrementally, adding each new payment merkle root as a leaf. It enables unlimited claim history while maintaining perfect security.

§Growth Pattern

The seal tree grows incrementally:

  • Epoch 0: [Payment Root 0]
  • Epoch 1: [Payment Root 0] + [Payment Root 1] -> Seal Root 1
  • Epoch 2: [Payment Root 0] + [Payment Root 1] + [Payment Root 2] -> Seal Root 2
  • …
  • Epoch N: [Payment Root 0] + … + [Payment Root N] -> Seal Root N

§Security

  • Each payment root is embedded in the seal tree
  • Seal proofs demonstrate payment root authenticity
  • Dual verification prevents all attack vectors

§🚨 CRITICAL: Chronological Ordering Requirement

PAYMENT ROOTS MUST BE PROVIDED IN CHRONOLOGICAL ORDER (EPOCH 0, 1, 2, 3…)

This is essential for:

  • Deterministic seal merkle root generation
  • Consistent verification between Oracle and on-chain program
  • Preventing 0x10 (InvalidPaymentProof) errors

The Oracle team MUST ensure:

  1. Database queries return epochs in chronological order
  2. Payment roots are collected in epoch sequence
  3. SealMerkleTree::from_payment_roots() receives ordered data

Failure to maintain chronological ordering will result in:

  • Different seal merkle roots between Oracle and on-chain
  • Proof verification failures
  • Inability to process claims

Fields§

§root: [u8; 32]

Current seal merkle root (32 bytes)

Implementations§

Source§

impl SealMerkleTree

Source

pub fn new() -> Self

Create a new empty seal merkle tree.

§Returns
  • Empty seal merkle tree with zero root
Source

pub fn from_payment_roots(payment_roots: Vec<[u8; 32]>) -> Self

Create a seal merkle tree from existing payment roots.

§Parameters
  • payment_roots: Vector of historical payment merkle roots
§Returns
  • Seal merkle tree with all payment roots included
§Important: Chronological Ordering

The payment roots MUST be provided in chronological order (epoch 0, 1, 2, 3…) to ensure deterministic and verifiable seal merkle roots across all systems. This ordering rule is enforced to maintain consistency between Oracle and on-chain verification.

Source

pub fn add_payment_root(&mut self, payment_root: [u8; 32])

Add a new payment root to the seal merkle tree.

This function incrementally grows the seal tree by adding the new payment root and rebuilding the tree structure.

§Parameters
  • payment_root: New payment merkle root to add
§Returns
  • Updated seal merkle tree with new payment root included
§Important: Chronological Ordering

Payment roots MUST be added in chronological order (epoch 0, 1, 2, 3…) to maintain deterministic tree structure. This method assumes the new payment root is for the next sequential epoch.

Source

pub fn root(&self) -> [u8; 32]

Get the current seal merkle root.

§Returns
  • Current seal merkle root (32 bytes)
Source

pub fn payment_root_count(&self) -> usize

Get the number of payment roots in the seal tree.

§Returns
  • Number of historical payment roots
Source

pub fn payment_roots(&self) -> &[[u8; 32]]

Get all payment roots in the seal tree.

§Returns
  • Vector of all historical payment roots
Source

pub fn validate_chronological_order(&self) -> bool

Validate that payment roots are in chronological order.

This method helps ensure the Oracle team is providing payment roots in the correct epoch sequence for deterministic tree construction.

§Returns
  • true if payment roots appear to be in chronological order
  • false if there are potential ordering issues
§Note

This is a best-effort validation since we can’t directly determine epoch numbers from payment root hashes. The Oracle team must ensure chronological ordering when calling this method.

Source

pub fn generate_seal_proof(&self, payment_root: [u8; 32]) -> Option<SealProof>

Generate a seal proof for a specific payment root.

This function creates a proof that demonstrates a payment root is included in the current seal merkle tree.

§Parameters
  • payment_root: Payment root to generate proof for
§Returns
  • Some(SealProof) if payment root is found
  • None if payment root is not in the tree
Source

pub fn generate_seal_proof_for_epoch( &self, epoch_index: usize, ) -> Option<SealProof>

Find and generate a seal proof for a payment root by epoch.

This is a convenience function that finds a payment root by its epoch index and generates a seal proof for it.

§Parameters
  • epoch_index: Index of the epoch (0-based)
§Returns
  • Some(SealProof) if epoch exists
  • None if epoch index is out of bounds
Source

pub fn contains_payment_root(&self, payment_root: [u8; 32]) -> bool

Verify that a payment root is included in the seal tree.

§Parameters
  • payment_root: Payment root to verify
§Returns
  • true if payment root is in the seal tree
  • false if payment root is not in the seal tree

Trait Implementations§

Source§

impl Clone for SealMerkleTree

Source§

fn clone(&self) -> SealMerkleTree

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
Source§

impl Debug for SealMerkleTree

Source§

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

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

impl<'de> Deserialize<'de> for SealMerkleTree

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Serialize for SealMerkleTree

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more

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

Source§

fn az<Dst>(self) -> Dst
where T: Cast<Dst>,

Casts the value.
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<Src, Dst> CastFrom<Src> for Dst
where Src: Cast<Dst>,

Source§

fn cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> CheckedAs for T

Source§

fn checked_as<Dst>(self) -> Option<Dst>
where T: CheckedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> CheckedCastFrom<Src> for Dst
where Src: CheckedCast<Dst>,

Source§

fn checked_cast_from(src: Src) -> Option<Dst>

Casts the value.
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, 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<Src, Dst> LosslessTryInto<Dst> for Src
where Dst: LosslessTryFrom<Src>,

Source§

fn lossless_try_into(self) -> Option<Dst>

Performs the conversion.
Source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

Source§

fn lossy_into(self) -> Dst

Performs the conversion.
Source§

impl<T> OverflowingAs for T

Source§

fn overflowing_as<Dst>(self) -> (Dst, bool)
where T: OverflowingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> OverflowingCastFrom<Src> for Dst
where Src: OverflowingCast<Dst>,

Source§

fn overflowing_cast_from(src: Src) -> (Dst, bool)

Casts the value.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> SaturatingAs for T

Source§

fn saturating_as<Dst>(self) -> Dst
where T: SaturatingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> SaturatingCastFrom<Src> for Dst
where Src: SaturatingCast<Dst>,

Source§

fn saturating_cast_from(src: Src) -> Dst

Casts the value.
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> UnwrappedAs for T

Source§

fn unwrapped_as<Dst>(self) -> Dst
where T: UnwrappedCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> UnwrappedCastFrom<Src> for Dst
where Src: UnwrappedCast<Dst>,

Source§

fn unwrapped_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WrappingAs for T

Source§

fn wrapping_as<Dst>(self) -> Dst
where T: WrappingCast<Dst>,

Casts the value.
Source§

impl<Src, Dst> WrappingCastFrom<Src> for Dst
where Src: WrappingCast<Dst>,

Source§

fn wrapping_cast_from(src: Src) -> Dst

Casts the value.
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,