Durable Nonces

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:

  1. Erstellen und initialisieren Sie ein Nonce-Konto mit CreateAccount + InitializeNonceAccount
  2. Erstellen Sie die Transaktion mit AdvanceNonceAccount als erste Anweisung und dem Nonce-Wert als recent_blockhash
  3. Signieren Sie die Transaktion (kann offline erfolgen, da der Nonce nicht abläuft)
  4. Ü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:

  1. Der gespeicherte durable_nonce des 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
  2. Das Nonce-Konto muss geladen werden und als State::Initialized geparst werden können
  3. Der gespeicherte durable_nonce muss mit dem recent_blockhash der 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?

Inhaltsverzeichnis

Seite bearbeiten

Verwaltet von

© 2026 Solana Foundation.
Alle Rechte vorbehalten.
Verbinden Sie sich