Harva Merkle-puu

Käyttäjät ja kehittäjät eivät ole suoraan vuorovaikutuksessa SMT:n kanssa; poissulkemistodisteet lasketaan ja lähetetään automaattisesti operator-private-channel -palvelun toimesta. Tämä sivu on viitemateriaalia operaattoreille ja kaikille, jotka rakentavat operaattorityökaluja.

Escrow-ohjelma siirtyy tästä harvan Merkle-puun rakenteesta ketjussa olevaan nonce-bittikartaksi (seurataan ylävirrassa). Tämä sivu on ajantasainen nykyisen escrow-ohjelman osalta ja päivitetään, kun muutos toteutuu.

Tarkoitus

Private Channels käyttää harvaa Merkle-puuta (SMT) varmistaakseen, että jokainen nostononce voidaan selvittää vain kerran. Kun operaattori kutsuu ReleaseFunds-funktiota, hänen on toimitettava kaksi todistetta: poissulkemistodiste siitä, että nonce EI vielä ole nykyisessä juuressa, ja sisällyttämistodiste siitä, että nonce ON olemassa kutsujan toimittamassa uudessa juuressa. Vasta kun molemmat tarkistukset läpäistään, ohjelma tallentaa uuden juuren, mikä tekee kaikista tulevista yrityksistä käyttää nonce uudelleen todistettavasti kelvottomia.

Puun parametrit

  • Puun korkeus: 16
  • Maksimilehtiä: 65 536 (2^16)
  • Hajautusfunktio: SHA-256
  • Tyhjän lehden arvo: [0u8; 32] (32 nollatavua)
  • Ei-tyhjän lehden arvo: SHA256([1u8; 32]), tallennettu vakiona NON_EMPTY_LEAF_HASH
Root Hash (32 bytes)
/ \
Hash(L, R) Hash(L, R)
/ \ / \
Hash(L, R) Hash(L, R) Hash(L, R) Hash(L, R)
/ \ / \ / \ / \
... ... ... ... ... ... ... ...
/ \ / \ / \ / \ / \ / \ / \ / \
Leaf0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
(nonces recorded as leaf positions using their value modulo 65536)

Lehtirakenne

Jokainen nosto varaa täsmälleen yhden lehden. Lehden sijainti määräytyy seuraavasti:

leaf_position = transaction_nonce % 65536

Lehteä pidetään ei-tyhjänä, kun sen arvo on yhtä suuri kuin NON_EMPTY_LEAF_HASH (eli SHA256([1u8; 32])). Tyhjä lehti koostuu pelkistä nollista.

Nonce ja lehden sijainti

ReleaseFunds-funktion transaction_nonce on tyyppiä u64. Sen sijainti puussa on nonce % 65536. Sen odotettu epoch on nonce / 65536. Ketjussa oleva ohjelma varmistaa, että tämä laskettu epoch on yhtä suuri kuin Instance.current_tree_index; ristiriita aiheuttaa InvalidTransactionNonceForCurrentTreeIndex-virheen.

Puun kierrätys

Tree Index 0 (nonces 0-65,535) Tree Index 1 (nonces 65,536-131,071)
┌────────────────────────────┐ ┌────────────────────────────┐
│ Root: 0x8fe6... │ │ Root: 0x8fe6... (reset) │
│ Nonces Used: 65,536/65,536 │ Rotate │ Nonces Used: 0/65,536 │
│ Status: FULL │ ──────> │ Status: ACTIVE │
└────────────────────────────┘ └────────────────────────────┘
(Tree exhausted) (Fresh tree)

SMT:llä on kiinteä kapasiteetti 65 536 lehdelle. Operaattoripalvelu havaitsee, milloin kierrätys tarvitaan tarkistamalla, onko nonce % 65536 == 0 (kun nonce > 0); tuo raja merkitsee uuden epochin alkua. Tässä vaiheessa operator-private-channel kutsuu ResetSmtRoot-funktiota ennen seuraavan ReleaseFunds-kutsun lähettämistä:

  • Instance.current_tree_index kasvatetaan
  • Nostojuuri nollataan tyhjään puuhun
  • Edellisen puun epochin noncet mitätöidään

Operaattoripalvelu myös tarkistaa, että sen paikallinen SMT-juuri vastaa Instance.withdrawal_transactions_root-arvoa ketjussa ennen jokaista ReleaseFunds- kutsua; ristiriita käynnistää turvasammutuksen mahdollisesti virheellisen todisteen lähettämisen sijaan.

Puun kierrätystä seurataan Instance.current_tree_index: u64 -arvolla, joka on tallennettu ketjuun.

Vahvistus ReleaseFunds-funktiossa

ReleaseFunds-funktion sibling_proofs-argumentti on täsmälleen [u8; 512]: 16 sisarushajautusarvoa × 32 tavua kukin, vastaten puun korkeutta 16.

Ketjussa oleva vahvistusprosessi suorittaa kaksi erillistä tarkistusta peräkkäin:

  1. verify_smt_exclusion_proof todistaa, että nonce-lehti on tällä hetkellä tyhjä nykyistä Instance.withdrawal_transactions_root-arvoa vasten
  2. verify_smt_inclusion_proof todistaa, että nonce-lehti on läsnä kutsujan toimittamassa new_withdrawal_root-argumentissa
  3. Vain jos molemmat tarkistukset läpäistään, ohjelma tallentaa new_withdrawal_root-arvon uutena Instance.withdrawal_transactions_root-arvona ja vapauttaa tokenit

Jommankumman tarkistuksen epäonnistuminen aiheuttaa InvalidSmtProof-virheen. Juuren päivitys vaiheessa 3 on atomiaalinen jokaisen ReleaseFunds-kutsun kanssa.

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.