Οι χρήστες και οι προγραμματιστές δεν αλληλεπιδρούν απευθείας με το 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 εκτελεί δύο ξεχωριστούς ελέγχους διαδοχικά:
- Η
verify_smt_exclusion_proofαποδεικνύει ότι το φύλλο nonce είναι επί του παρόντος κενό ως προς το τρέχονInstance.withdrawal_transactions_root - Η
verify_smt_inclusion_proofαποδεικνύει ότι το φύλλο nonce υπάρχει στο όρισμαnew_withdrawal_rootπου παρέχει ο καλών - Μόνο εάν περάσουν και οι δύο έλεγχοι αποθηκεύει το πρόγραμμα το
new_withdrawal_rootως νέοInstance.withdrawal_transactions_rootκαι αποδεσμεύει τα tokens
Η αποτυχία οποιουδήποτε ελέγχου εκτοξεύει InvalidSmtProof. Η ενημέρωση της ρίζας στο βήμα 3 είναι
ατομική με κάθε κλήση ReleaseFunds.
Is this page helpful?