Περίληψη
Οι συναλλαγές με ανθεκτικό 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:
- Δημιουργήστε και αρχικοποιήστε έναν λογαριασμό nonce χρησιμοποιώντας
CreateAccount+InitializeNonceAccount - Δημιουργήστε τη συναλλαγή με
AdvanceNonceAccountως την πρώτη εντολή και την τιμή nonce ως τοrecent_blockhash - Υπογράψτε τη συναλλαγή (μπορεί να γίνει offline, καθώς το 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:
- Το αποθηκευμένο
durable_nonceτου nonce πρέπει να διαφέρει από το επόμενο durable nonce (που προκύπτει από το τρέχον blockhash). Αυτό διασφαλίζει ότι το nonce δεν έχει ήδη χρησιμοποιηθεί σε αυτό το block - Ο λογαριασμός nonce πρέπει να φορτωθεί και να αναλυθεί ως
State::Initialized - Το αποθηκευμένο
durable_nonceπρέπει να ταιριάζει με τοrecent_blockhashτης συναλλαγής
Ο έλεγχος υπογραφής της εξουσιοδότησης nonce εκτελείται αργότερα
(validate_transaction_nonce).
Εάν όλοι οι έλεγχοι περάσουν επιτυχώς, το nonce προωθείται στην επόμενη τιμή durable nonce πριν αρχίσει η εκτέλεση. Σε περίπτωση αποτυχίας εκτέλεσης, το προωθημένο nonce και ο πληρωτής τελών με αφαιρεμένα τέλη εξακολουθούν να καταχωρούνται (αποτρέποντας την επανάληψη ενώ εισπράττονται τέλη).
Συμπεριφορά αποτυχίας nonce
Εάν μια συναλλαγή nonce αποτύχει στην επικύρωση (το nonce έχει ήδη χρησιμοποιηθεί, η εξουσιοδότηση δεν έχει υπογραφεί, ο λογαριασμός δεν βρέθηκε), ολόκληρη η συναλλαγή απορρίπτεται. Δεν εισπράττονται τέλη, δεν γίνονται αλλαγές κατάστασης.
Εάν μια συναλλαγή nonce περάσει την επικύρωση αλλά αποτύχει η εκτέλεση (μια εντολή επιστρέφει σφάλμα), το nonce εξακολουθεί να προωθείται και τα τέλη εξακολουθούν να εισπράττονται. Αυτό αποτρέπει την επανάληψη της συναλλαγής ενώ διασφαλίζει ότι ο validator αποζημιώνεται.
Is this page helpful?