Підсумок
Транзакції з довготривалими nonce замінюють останній blockhash на збережене значення nonce, усуваючи 150-слотове вікно закінчення терміну дії транзакції. Це дозволяє офлайн-підписання та відкладену відправку.
Довготривалі nonce можуть бути застарілими в майбутньому релізі. Дивіться обговорення SIMD для деталей.
Довготривалі nonce
Транзакція з довготривалим nonce замінює останній blockhash на збережене значення nonce, усуваючи 150-слотове вікно закінчення терміну дії. Це дозволяє офлайн-підписання та відкладену відправку.
Як працюють nonce-транзакції
Nonce-акаунт — це акаунт, що належить System Program і зберігає значення
State::Initialized, яке містить три поля: authority pubkey (хто може
просунути nonce), значення durable nonce (хеш, отриманий з останнього
blockhash) та lamports per signature (ставка комісії на момент останнього
просування nonce).
Щоб використовувати довготривалий nonce:
- Створіть та ініціалізуйте nonce-акаунт, використовуючи
CreateAccount+InitializeNonceAccount - Побудуйте транзакцію з
AdvanceNonceAccountяк першою інструкцією та значенням nonce якrecent_blockhash - Підпишіть транзакцію (можна зробити офлайн, оскільки nonce не закінчується)
- Відправте, коли буде готово
Виявлення nonce
Середовище виконання виявляє nonce-транзакції, перевіряючи, чи є перша
інструкція (індекс
NONCED_TX_MARKER_IX_INDEX
= 0) викликом System Program з інструкцією AdvanceNonceAccount.
Nonce-акаунт має бути першим акаунтом цієї інструкції та має бути доступним для
запису. Дивіться
get_durable_nonce.
Процес валідації nonce
Коли recent_blockhash транзакції не знайдено в BlockhashQueue, validator
перевіряє, чи є це дійсною nonce-транзакцією через
check_transaction_age:
- Збережене значення
durable_noncenonce має відрізнятися від наступного durable nonce (отриманого з поточного blockhash). Це гарантує, що nonce ще не було використано в цьому блоці - Обліковий запис nonce має бути завантажений і повинен розпізнаватися як
State::Initialized - Збережене значення
durable_nonceмає збігатися зrecent_blockhashтранзакції
Перевірка підпису nonce authority виконується пізніше
(validate_transaction_nonce).
Якщо всі перевірки пройдено успішно, nonce оновлюється до наступного значення durable nonce перед початком виконання. У разі невдалого виконання оновлений nonce та платник комісії зі списаною комісією все одно фіксуються (запобігаючи повторному відтворенню та стягуючи комісії).
Поведінка при невдачі nonce
Якщо nonce-транзакція не проходить валідацію (nonce вже використано, authority не підписано, обліковий запис не знайдено), вся транзакція відхиляється. Комісії не стягуються, зміни стану не відбуваються.
Якщо nonce-транзакція проходить валідацію, але виконання завершується невдачею (інструкція повертає помилку), nonce все одно оновлюється, а комісії стягуються. Це запобігає повторному відтворенню транзакції, водночас гарантуючи компенсацію validator.
Is this page helpful?