Кратко
Транзакции с устойчивым nonce заменяют недавний blockhash на сохранённое значение nonce, устраняя ограничение по времени в 150 slot для транзакции. Это позволяет использовать офлайн-подпись и отложенную отправку.
Устойчивые nonces могут быть устаревшими в будущих версиях. Подробнее см. обсуждение SIMD.
Устойчивые nonces
Транзакция с устойчивым nonce заменяет недавний blockhash на сохранённое значение nonce, устраняя ограничение по времени в 150 slot. Это позволяет использовать офлайн-подпись и отложенную отправку.
Как работают транзакции с nonce
Nonce-аккаунт — это аккаунт, принадлежащий System Program, который хранит
значение State::Initialized с тремя полями: authority pubkey (кто
может продвигать nonce), устойчивое значение nonce (хеш, полученный из
недавнего blockhash), и lamports за подпись (текущий тариф комиссии на
момент последнего продвижения 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_nonceв nonce должен отличаться от следующего устойчивого nonce (вычисленного на основе текущего blockhash). Это гарантирует, что nonce ещё не был использован в этом блоке - Nonce-аккаунт должен быть загружен и корректно распознаваться как
State::Initialized - Сохранённый
durable_nonceдолжен совпадать сrecent_blockhashтранзакции
Проверка подписи полномочий nonce выполняется позже
(validate_transaction_nonce).
Если все проверки пройдены, nonce продвигается к следующему значению устойчивого nonce до начала исполнения. В случае ошибки исполнения продвинутый nonce и аккаунт плательщика комиссии с уже списанной комиссией всё равно фиксируются (это предотвращает повторное выполнение и обеспечивает сбор комиссии).
Поведение при ошибке nonce
Если транзакция с nonce не проходит проверку (nonce уже использован, нет подписи полномочий, аккаунт не найден), вся транзакция отклоняется. Комиссия не взимается, изменения состояния не происходят.
Если транзакция с nonce проходит проверку, но выполнение завершается ошибкой (инструкция возвращает ошибку), nonce всё равно продвигается, а комиссия взимается. Это предотвращает повторное выполнение транзакции и гарантирует, что validator получит вознаграждение.
Is this page helpful?