Résumé
Les transactions à nonce durable remplacent le blockhash récent par une valeur de nonce stockée, supprimant la fenêtre d'expiration de 150 slots pour une transaction. Cela permet la signature hors ligne et la soumission différée.
Les nonces durables pourraient être dépréciés dans une version future. Voir la discussion SIMD pour plus de détails.
Nonces durables
Une transaction à nonce durable remplace le blockhash récent par une valeur de nonce stockée, supprimant la fenêtre d'expiration de 150 slots. Cela permet la signature hors ligne et la soumission différée.
Fonctionnement des transactions à nonce
Un compte nonce est un compte appartenant au System Program qui stocke une
valeur State::Initialized contenant trois champs : une autorité pubkey
(qui peut faire avancer le nonce), une valeur de nonce durable (un hash
dérivé d'un blockhash récent), et lamports par signature (le taux de frais
lorsque le nonce a été avancé pour la dernière fois).
Pour utiliser un nonce durable :
- Créer et initialiser un compte nonce en utilisant
CreateAccount+InitializeNonceAccount - Construire la transaction avec
AdvanceNonceAccountcomme première instruction et la valeur du nonce commerecent_blockhash - Signer la transaction (peut être fait hors ligne, car le nonce n'expire pas)
- Soumettre quand vous êtes prêt
Détection du nonce
Le runtime détecte les transactions à nonce en vérifiant si la première
instruction (index
NONCED_TX_MARKER_IX_INDEX
= 0) est un appel au System Program avec l'instruction
AdvanceNonceAccount. Le compte nonce doit être le premier compte de cette
instruction et doit être modifiable. Voir
get_durable_nonce.
Flux de validation du nonce
Lorsque le recent_blockhash d'une transaction n'est pas trouvé dans le
BlockhashQueue, le validateur vérifie s'il s'agit d'une transaction nonce
valide via
check_transaction_age
:
- Le
durable_noncestocké du nonce doit différer du prochain nonce durable (dérivé du blockhash actuel). Cela garantit que le nonce n'a pas déjà été utilisé dans ce bloc - Le compte nonce doit être chargé et doit être analysé comme
State::Initialized - Le
durable_noncestocké doit correspondre aurecent_blockhashde la transaction
La vérification de la signature de l'autorité du nonce est effectuée plus tard
(validate_transaction_nonce).
Si toutes les vérifications réussissent, le nonce est avancé à la valeur du prochain nonce durable avant le début de l'exécution. En cas d'échec de l'exécution, le nonce avancé et le payeur de frais dont les frais ont été déduits sont toujours validés (empêchant la relecture tout en collectant les frais).
Comportement en cas d'échec du nonce
Si une transaction nonce échoue à la validation (nonce déjà utilisé, autorité non signée, compte introuvable), la transaction entière est abandonnée. Aucun frais collecté, aucun changement d'état.
Si une transaction nonce réussit la validation mais l'exécution échoue (une instruction renvoie une erreur), le nonce est toujours avancé et les frais sont toujours collectés. Cela empêche la transaction d'être rejouée tout en garantissant que le validateur est rémunéré.
Is this page helpful?