Ανθεκτικά nonces

Περίληψη

Οι συναλλαγές με ανθεκτικό nonce αντικαθιστούν το πρόσφατο blockhash με μια αποθηκευμένη τιμή nonce, εξαλείφοντας το παράθυρο λήξης των 150 slots για μια συναλλαγή. Αυτό επιτρέπει την offline υπογραφή και την καθυστερημένη υποβολή.

Τα ανθεκτικά nonces ενδέχεται να καταργηθούν σε μελλοντική έκδοση. Δείτε τη συζήτηση SIMD για λεπτομέρειες.

Ανθεκτικά nonces

Μια συναλλαγή με ανθεκτικό nonce αντικαθιστά το πρόσφατο blockhash με μια αποθηκευμένη τιμή nonce, εξαλείφοντας το παράθυρο λήξης των 150 slots. Αυτό επιτρέπει την offline υπογραφή και την καθυστερημένη υποβολή.

Πώς λειτουργούν οι συναλλαγές nonce

Ένας λογαριασμός nonce είναι ένας λογαριασμός που ανήκει στο System Program και αποθηκεύει μια τιμή State::Initialized που περιέχει τρία πεδία: ένα authority pubkey (ποιος μπορεί να προωθήσει το nonce), μια τιμή durable nonce (ένα hash που προέρχεται από ένα πρόσφατο blockhash) και lamports ανά υπογραφή (το ποσοστό χρέωσης όταν το nonce προωθήθηκε τελευταία φορά).

Για να χρησιμοποιήσετε ένα ανθεκτικό nonce:

  1. Δημιουργήστε και αρχικοποιήστε έναν λογαριασμό nonce χρησιμοποιώντας CreateAccount + InitializeNonceAccount
  2. Δημιουργήστε τη συναλλαγή με AdvanceNonceAccount ως την πρώτη εντολή και την τιμή nonce ως το recent_blockhash
  3. Υπογράψτε τη συναλλαγή (μπορεί να γίνει offline, καθώς το nonce δεν λήγει)
  4. Υποβάλετε όταν είστε έτοιμοι

Δημιουργία και χρήση λογαριασμού nonce

Αυτό το παράδειγμα δημιουργεί έναν λογαριασμό nonce, διαβάζει το αποθηκευμένο nonce του και χρησιμοποιεί αυτό το nonce για να στείλει μια μεταφορά SOL. Χρησιμοποιεί έναν τοπικό validator, ώστε ο πληρωτής να μπορεί να χρηματοδοτηθεί αυτόματα.

Η setTransactionMessageLifetimeUsingDurableNonce ορίζει το αποθηκευμένο nonce ως διάρκεια ζωής της συναλλαγής και προσθέτει στην αρχή την απαιτούμενη εντολή AdvanceNonceAccount. Προσθέστε τις υπόλοιπες εντολές της συναλλαγής αφού εφαρμόσετε τη διάρκεια ζωής του durable nonce, ώστε η εντολή advance να παραμείνει πρώτη.

Αφού υποβληθεί σε επεξεργασία αυτή η συναλλαγή, ο λογαριασμός nonce περιέχει μια νέα τιμή. Ανακτήστε ξανά τον λογαριασμό πριν δημιουργήσετε μια άλλη συναλλαγή· μια συναλλαγή που έχει υπογραφεί με το προηγούμενο nonce δεν μπορεί να υποβληθεί ξανά.

Ανίχνευση nonce

Το runtime ανιχνεύει τις συναλλαγές nonce ελέγχοντας αν η πρώτη εντολή (index NONCED_TX_MARKER_IX_INDEX = 0) είναι μια κλήση στο System Program με την εντολή AdvanceNonceAccount. Ο λογαριασμός nonce πρέπει να είναι ο πρώτος λογαριασμός αυτής της εντολής και πρέπει να είναι εγγράψιμος. Δείτε get_durable_nonce.

Ροή επικύρωσης nonce

Όταν το recent_blockhash μιας συναλλαγής δεν βρίσκεται στο BlockhashQueue, ο validator ελέγχει αν είναι έγκυρη συναλλαγή nonce μέσω της check_transaction_age:

  1. Το αποθηκευμένο durable_nonce του nonce πρέπει να διαφέρει από το επόμενο durable nonce (που προκύπτει από το τρέχον blockhash). Αυτό διασφαλίζει ότι το nonce δεν έχει ήδη χρησιμοποιηθεί σε αυτό το block
  2. Ο λογαριασμός nonce πρέπει να φορτωθεί και να αναλυθεί ως State::Initialized
  3. Το αποθηκευμένο durable_nonce πρέπει να ταιριάζει με το recent_blockhash της συναλλαγής

Ο έλεγχος υπογραφής της εξουσιοδότησης nonce εκτελείται αργότερα (validate_transaction_nonce).

Εάν όλοι οι έλεγχοι περάσουν επιτυχώς, το nonce προωθείται στην επόμενη τιμή durable nonce πριν αρχίσει η εκτέλεση. Σε περίπτωση αποτυχίας εκτέλεσης, το προωθημένο nonce και ο πληρωτής τελών με αφαιρεμένα τέλη εξακολουθούν να καταχωρούνται (αποτρέποντας την επανάληψη ενώ εισπράττονται τέλη).

Συμπεριφορά αποτυχίας nonce

Εάν μια συναλλαγή nonce αποτύχει στην επικύρωση (το nonce έχει ήδη χρησιμοποιηθεί, η εξουσιοδότηση δεν έχει υπογραφεί, ο λογαριασμός δεν βρέθηκε), ολόκληρη η συναλλαγή απορρίπτεται. Δεν εισπράττονται τέλη, δεν γίνονται αλλαγές κατάστασης.

Εάν μια συναλλαγή nonce περάσει την επικύρωση αλλά αποτύχει η εκτέλεση (μια εντολή επιστρέφει σφάλμα), το nonce εξακολουθεί να προωθείται και τα τέλη εξακολουθούν να εισπράττονται. Αυτό αποτρέπει την επανάληψη της συναλλαγής ενώ διασφαλίζει ότι ο validator αποζημιώνεται.

Is this page helpful?

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

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