Zusammenfassung
Durable-Nonce-Transaktionen ersetzen den aktuellen Blockhash durch einen gespeicherten Nonce-Wert und entfernen damit das Ablaufen nach 150 Slots für eine Transaktion. Dies ermöglicht Offline-Signierung und verzögerte Übermittlung.
Durable Nonces könnten in einer zukünftigen Version veraltet sein. Siehe SIMD-Diskussion für Details.
Durable Nonces
Eine Durable-Nonce-Transaktion ersetzt den aktuellen Blockhash durch einen gespeicherten Nonce-Wert und entfernt damit das Ablaufen nach 150 Slots. Dies ermöglicht Offline-Signierung und verzögerte Übermittlung.
Wie Nonce-Transaktionen funktionieren
Ein Nonce-Konto ist ein Konto im Besitz des System Program, das einen
State::Initialized-Wert speichert, der drei Felder enthält: einen
Authority-Pubkey (wer den Nonce vorantreiben kann), einen
Durable-Nonce-Wert (ein Hash, der von einem aktuellen Blockhash abgeleitet
wurde) und Lamports pro Signatur (die Gebührenrate, als der Nonce zuletzt
vorangetrieben wurde).
Um einen Durable Nonce zu verwenden:
- Erstellen und initialisieren Sie ein Nonce-Konto mit
CreateAccount+InitializeNonceAccount - Erstellen Sie die Transaktion mit
AdvanceNonceAccountals erste Anweisung und dem Nonce-Wert alsrecent_blockhash - Signieren Sie die Transaktion (kann offline erfolgen, da der Nonce nicht abläuft)
- Übermitteln Sie, wenn bereit
Nonce-Erkennung
Die Runtime erkennt Nonce-Transaktionen, indem sie prüft, ob die erste Anweisung
(Index
NONCED_TX_MARKER_IX_INDEX
= 0) ein Aufruf des System Program mit der AdvanceNonceAccount-Anweisung
ist. Das Nonce-Konto muss das erste Konto dieser Anweisung sein und muss
beschreibbar sein. Siehe
get_durable_nonce.
Nonce-Validierungsablauf
Wenn der recent_blockhash einer Transaktion nicht im BlockhashQueue gefunden
wird, prüft der Validator, ob es sich um eine gültige Nonce-Transaktion handelt
über
check_transaction_age:
- Der gespeicherte
durable_noncedes Nonce muss sich vom nächsten dauerhaften Nonce (abgeleitet vom aktuellen Blockhash) unterscheiden. Dies stellt sicher, dass der Nonce in diesem Block noch nicht verwendet wurde - Das Nonce-Konto muss geladen werden und als
State::Initializedgeparst werden können - Der gespeicherte
durable_noncemuss mit demrecent_blockhashder Transaktion übereinstimmen
Die Überprüfung der Nonce-Authority-Signatur wird später durchgeführt
(validate_transaction_nonce).
Wenn alle Prüfungen erfolgreich sind, wird der Nonce auf den nächsten dauerhaften Nonce-Wert erhöht, bevor die Ausführung beginnt. Bei einem Ausführungsfehler werden der erhöhte Nonce und der Fee-abgezogene Fee-Zahler dennoch committet (verhindert Replay und ermöglicht Fee-Einzug).
Nonce-Fehlerverhalten
Wenn eine Nonce-Transaktion die Validierung nicht besteht (Nonce bereits verwendet, Authority nicht signiert, Konto nicht gefunden), wird die gesamte Transaktion verworfen. Keine Fee wird eingezogen, keine Zustandsänderungen.
Wenn eine Nonce-Transaktion die Validierung besteht, aber die Ausführung fehlschlägt (eine Instruktion gibt einen Fehler zurück), wird der Nonce dennoch erhöht und die Fee dennoch eingezogen. Dies verhindert, dass die Transaktion wiederholt wird, während sichergestellt wird, dass der Validator entschädigt wird.
Is this page helpful?