Αραιό Δέντρο Merkle

Οι χρήστες και οι προγραμματιστές δεν αλληλεπιδρούν απευθείας με το SMT· οι αποδείξεις αποκλεισμού υπολογίζονται και υποβάλλονται αυτόματα από την υπηρεσία operator-private-channel. Αυτή η σελίδα αποτελεί υλικό αναφοράς για operators και όσους δημιουργούν εργαλεία operator.

Το πρόγραμμα escrow μεταβαίνει από αυτόν τον σχεδιασμό Αραιού Δέντρου Merkle σε ένα on-chain nonce bitmap (παρακολουθείται upstream). Αυτή η σελίδα είναι ακριβής ως προς το τρέχον πρόγραμμα escrow και θα αναθεωρηθεί μόλις εφαρμοστεί η αλλαγή αυτή.

Σκοπός

Τα Ιδιωτικά Κανάλια χρησιμοποιούν ένα Αραιό Δέντρο Merkle (SMT) για να εγγυηθούν ότι κάθε nonce ανάληψης μπορεί να διακανονιστεί μόνο μία φορά. Όταν ένας operator καλεί το ReleaseFunds, πρέπει να παρέχει δύο αποδείξεις: μια απόδειξη αποκλεισμού που το nonce ΔΕΝ υπάρχει ακόμα στην τρέχουσα ρίζα, και μια απόδειξη συμπερίληψης που το nonce ΥΠΑΡΧΕΙ στη νέα ρίζα που παρέχει ο καλών. Μόνο αφού περάσουν και οι δύο έλεγχοι αποθηκεύει το πρόγραμμα τη νέα ρίζα, καθιστώντας οποιαδήποτε μελλοντική απόπειρα επαναχρησιμοποίησης του nonce αποδεδειγμένα άκυρη.

Παράμετροι Δέντρου

  • Ύψος δέντρου: 16
  • Μέγιστα φύλλα: 65.536 (2^16)
  • Συνάρτηση κατακερματισμού: SHA-256
  • Τιμή κενού φύλλου: [0u8; 32] (32 μηδενικά bytes)
  • Τιμή μη κενού φύλλου: SHA256([1u8; 32]), αποθηκεύεται ως σταθερά 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)

Δομή Φύλλου

Κάθε ανάληψη καταλαμβάνει ακριβώς ένα φύλλο. Η θέση του φύλλου καθορίζεται από:

leaf_position = transaction_nonce % 65536

Ένα φύλλο θεωρείται μη κενό όταν η τιμή του ισούται με NON_EMPTY_LEAF_HASH (δηλ., SHA256([1u8; 32])). Ένα κενό φύλλο αποτελείται από μηδενικά.

Nonce και Θέση Φύλλου

Το transaction_nonce στο ReleaseFunds είναι τύπου u64. Η θέση του στο δέντρο είναι nonce % 65536. Το αναμενόμενο epoch του είναι nonce / 65536. Το on-chain πρόγραμμα επαληθεύει ότι αυτό το υπολογισμένο epoch ισούται με το Instance.current_tree_index· μια αναντιστοιχία εκτοξεύει InvalidTransactionNonceForCurrentTreeIndex.

Εναλλαγή Δέντρου

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 έχει σταθερή χωρητικότητα 65.536 φύλλων. Η υπηρεσία operator εντοπίζει πότε απαιτείται εναλλαγή ελέγχοντας αν nonce % 65536 == 0 (για nonce > 0)· αυτό το όριο σηματοδοτεί την έναρξη ενός νέου epoch. Σε αυτό το σημείο, το operator-private-channel καλεί το ResetSmtRoot πριν υποβάλει το επόμενο ReleaseFunds:

  • Το Instance.current_tree_index αυξάνεται
  • Η ρίζα αναλήψεων επαναφέρεται στο κενό δέντρο
  • Τα nonces από το προηγούμενο epoch δέντρου ακυρώνονται

Η υπηρεσία operator επαληθεύει επίσης ότι η τοπική της ρίζα SMT ταιριάζει με το Instance.withdrawal_transactions_root on-chain πριν από κάθε κλήση ReleaseFunds· μια αναντιστοιχία προκαλεί αναγκαστική διακοπή λειτουργίας αντί για υποβολή πιθανώς άκυρης απόδειξης.

Η εναλλαγή δέντρου παρακολουθείται από το Instance.current_tree_index: u64, αποθηκευμένο on-chain.

Επαλήθευση στο ReleaseFunds

Το όρισμα sibling_proofs στο ReleaseFunds είναι ακριβώς [u8; 512]: 16 αδελφικά hashes × 32 bytes το καθένα, αντιστοιχώντας στο ύψος δέντρου 16.

Η διαδικασία επαλήθευσης on-chain εκτελεί δύο ξεχωριστούς ελέγχους διαδοχικά:

  1. Η verify_smt_exclusion_proof αποδεικνύει ότι το φύλλο nonce είναι επί του παρόντος κενό ως προς το τρέχον Instance.withdrawal_transactions_root
  2. Η verify_smt_inclusion_proof αποδεικνύει ότι το φύλλο nonce υπάρχει στο όρισμα new_withdrawal_root που παρέχει ο καλών
  3. Μόνο εάν περάσουν και οι δύο έλεγχοι αποθηκεύει το πρόγραμμα το new_withdrawal_root ως νέο Instance.withdrawal_transactions_root και αποδεσμεύει τα tokens

Η αποτυχία οποιουδήποτε ελέγχου εκτοξεύει InvalidSmtProof. Η ενημέρωση της ρίζας στο βήμα 3 είναι ατομική με κάθε κλήση ReleaseFunds.

Is this page helpful?

Πίνακας Περιεχομένων

Επεξεργασία Σελίδας
© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.