Podsumowanie
Transakcje z trwałym nonce’em zastępują ostatni blockhash przechowywaną wartością nonce, eliminując 150-slotowe okno ważności transakcji. Dzięki temu możliwe jest podpisywanie offline i opóźnione przesyłanie.
Trwałe nonce’y mogą zostać wycofane w przyszłych wersjach. Szczegóły w dyskusji SIMD.
Trwałe nonce’y
Transakcja z trwałym nonce’em zastępuje ostatni blockhash przechowywaną wartością nonce, co eliminuje 150-slotowe okno ważności. Umożliwia to podpisywanie offline oraz opóźnione przesyłanie transakcji.
Jak działają transakcje z nonce’em
Konto nonce to konto należące do System Program, które przechowuje
State::Initialized z trzema polami: authority pubkey (osoba mogąca
przesuwać nonce), trwały nonce (hash pochodzący z ostatniego blockhasha)
oraz lamports per signature (stawka opłaty w momencie ostatniego
przesunięcia nonce’a).
Aby użyć trwałego nonce’a:
- Utwórz i zainicjalizuj konto nonce za pomocą
CreateAccount+InitializeNonceAccount - Zbuduj transakcję z
AdvanceNonceAccountjako pierwszą instrukcją oraz nonce jakorecent_blockhash - Podpisz transakcję (można to zrobić offline, ponieważ nonce nie wygasa)
- Prześlij, gdy będziesz gotowy/gotowa
Wykrywanie nonce’a
Środowisko wykonawcze wykrywa transakcje z nonce’em, sprawdzając, czy pierwsza
instrukcja (indeks
NONCED_TX_MARKER_IX_INDEX
= 0) to wywołanie System Program z instrukcją AdvanceNonceAccount. Konto
nonce musi być pierwszym kontem tej instrukcji i musi mieć możliwość zapisu.
Zobacz
get_durable_nonce.
Przebieg walidacji nonce
Gdy recent_blockhash transakcji nie zostaje znaleziony w BlockhashQueue,
validator sprawdza, czy jest to poprawna transakcja nonce za pomocą
check_transaction_age:
- Zapisany
durable_noncenonce musi różnić się od kolejnego trwałego nonce (wyprowadzonego z bieżącego blockhasha). Zapewnia to, że nonce nie został już użyty w tym bloku - Konto nonce musi być załadowane i dać się sparsować jako
State::Initialized - Zapisany
durable_noncemusi odpowiadaćrecent_blockhashtransakcji
Sprawdzenie podpisu autorytetu nonce odbywa się później
(validate_transaction_nonce).
Jeśli wszystkie warunki zostaną spełnione, nonce jest przesuwany do kolejnej trwałej wartości nonce przed rozpoczęciem wykonania. W przypadku niepowodzenia wykonania, zaawansowany nonce oraz opłata pobrana od płatnika są nadal zatwierdzane (zapobiegając powtórzeniu transakcji i pobierając opłaty).
Zachowanie w przypadku błędu nonce
Jeśli transakcja nonce nie przejdzie walidacji (nonce już użyty, brak podpisu autorytetu, nie znaleziono konta), cała transakcja jest odrzucana. Nie są pobierane żadne opłaty, nie następują zmiany stanu.
Jeśli transakcja nonce przejdzie walidację, ale wykonanie się nie powiedzie (instrukcja zwraca błąd), nonce jest mimo to przesuwany, a opłaty są pobierane. Zapobiega to powtórzeniu transakcji i zapewnia wynagrodzenie validatorowi.
Is this page helpful?