Duurzame nonces

Samenvatting

Duurzame nonce-transacties vervangen de recente blockhash door een opgeslagen nonce-waarde, waardoor het vervalvenster van 150 slots voor een transactie wordt verwijderd. Dit maakt offline ondertekening en uitgestelde indiening mogelijk.

Duurzame nonces kunnen in een toekomstige release worden afgeschaft. Zie SIMD-discussie voor details.

Duurzame nonces

Een duurzame nonce-transactie vervangt de recente blockhash door een opgeslagen nonce-waarde, waardoor het vervalvenster van 150 slots wordt verwijderd. Dit maakt offline ondertekening en uitgestelde indiening mogelijk.

Hoe nonce-transacties werken

Een nonce-account is een account dat eigendom is van het System Program en een State::Initialized-waarde opslaat met drie velden: een authority pubkey (wie de nonce kan vooruitschuiven), een duurzame nonce-waarde (een hash afgeleid van een recente blockhash), en lamports per handtekening (het tarief toen de nonce voor het laatst werd vooruitgeschoven).

Om een duurzame nonce te gebruiken:

  1. Maak en initialiseer een nonce-account met CreateAccount + InitializeNonceAccount
  2. Bouw de transactie met AdvanceNonceAccount als de eerste instructie en de nonce-waarde als de recent_blockhash
  3. Onderteken de transactie (kan offline worden gedaan, aangezien de nonce niet verloopt)
  4. Dien in wanneer gereed

Een nonce-account maken en gebruiken

In dit voorbeeld wordt een nonce-account aangemaakt, de opgeslagen nonce uitgelezen en die nonce gebruikt om een SOL-transfer te versturen. Er wordt een lokale validator gebruikt, zodat de betaler automatisch van saldo kan worden voorzien.

setTransactionMessageLifetimeUsingDurableNonce stelt de opgeslagen nonce in als de levensduur van de transactie en voegt de vereiste AdvanceNonceAccount-instructie vooraan toe. Voeg de andere instructies van de transactie toe nadat je de levensduur van de durable nonce hebt toegepast, zodat de advance-instructie als eerste blijft staan.

Nadat deze transactie is verwerkt, bevat het nonce-account een nieuwe waarde. Haal het account opnieuw op voordat je een andere transactie opbouwt; een transactie die is ondertekend met de vorige nonce kan niet opnieuw worden ingediend.

Nonce-detectie

De runtime detecteert nonce-transacties door te controleren of de eerste instructie (index NONCED_TX_MARKER_IX_INDEX = 0) een aanroep is naar het System Program met de AdvanceNonceAccount-instructie. Het nonce-account moet het eerste account van die instructie zijn en moet schrijfbaar zijn. Zie get_durable_nonce.

Nonce-validatiestroom

Wanneer de recent_blockhash van een transactie niet wordt gevonden in de BlockhashQueue, controleert de validator of het een geldige nonce-transactie is via check_transaction_age:

  1. De opgeslagen durable_nonce van de nonce moet verschillen van de volgende duurzame nonce (afgeleid van de huidige blockhash). Dit zorgt ervoor dat de nonce niet al is gebruikt in dit blok
  2. Het nonce-account moet worden geladen en moet worden geparsed als State::Initialized
  3. De opgeslagen durable_nonce moet overeenkomen met de recent_blockhash van de transactie

De controle van de nonce-authority-ondertekening wordt later uitgevoerd (validate_transaction_nonce).

Als alle controles slagen, wordt de nonce verhoogd naar de volgende duurzame nonce-waarde voordat de uitvoering begint. Bij een mislukte uitvoering worden de verhoogde nonce en de fee-betaler waarvan de fee is afgetrokken toch gecommit (waardoor replay wordt voorkomen terwijl fees worden geïnd).

Gedrag bij nonce-fouten

Als een nonce-transactie de validatie niet doorstaat (nonce al gebruikt, authority niet ondertekend, account niet gevonden), wordt de hele transactie verworpen. Geen fees geïnd, geen statuswijzigingen.

Als een nonce-transactie de validatie doorstaat maar de uitvoering mislukt (een instructie retourneert een fout), wordt de nonce toch verhoogd en worden fees toch geïnd. Dit voorkomt dat de transactie opnieuw wordt afgespeeld en zorgt ervoor dat de validator wel wordt gecompenseerd.

Is this page helpful?

Inhoudsopgave

Pagina Bewerken
© 2026 Solana Foundation. Alle rechten voorbehouden.