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:
- Maak en initialiseer een nonce-account met
CreateAccount+InitializeNonceAccount - Bouw de transactie met
AdvanceNonceAccountals de eerste instructie en de nonce-waarde als derecent_blockhash - Onderteken de transactie (kan offline worden gedaan, aangezien de nonce niet verloopt)
- Dien in wanneer gereed
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:
- De opgeslagen
durable_noncevan 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 - Het nonce-account moet worden geladen en moet worden geparsed als
State::Initialized - De opgeslagen
durable_noncemoet overeenkomen met derecent_blockhashvan 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?