Nonces durables

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 :

  1. Créer et initialiser un compte nonce en utilisant CreateAccount + InitializeNonceAccount
  2. Construire la transaction avec AdvanceNonceAccount comme première instruction et la valeur du nonce comme recent_blockhash
  3. Signer la transaction (peut être fait hors ligne, car le nonce n'expire pas)
  4. 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 :

  1. Le durable_nonce stocké 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
  2. Le compte nonce doit être chargé et doit être analysé comme State::Initialized
  3. Le durable_nonce stocké doit correspondre au recent_blockhash de 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?

Table des matières

Modifier la page

Géré par

© 2026 Fondation Solana.
Tous droits réservés.
Restez connecté