Устойчивые nonces

Кратко

Транзакции с устойчивым 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:

  1. Создайте и инициализируйте nonce-аккаунт с помощью CreateAccount + InitializeNonceAccount
  2. Соберите транзакцию, где AdvanceNonceAccount будет первой инструкцией, а значение nonce — recent_blockhash
  3. Подпишите транзакцию (можно сделать офлайн, так как nonce не истекает)
  4. Отправьте, когда будете готовы

Обнаружение nonce

Во время выполнения транзакции система определяет транзакции с nonce, проверяя, является ли первая инструкция (индекс NONCED_TX_MARKER_IX_INDEX = 0) вызовом System Program с инструкцией AdvanceNonceAccount. Nonce-аккаунт должен быть первым аккаунтом этой инструкции и должен быть доступен для записи. Подробнее см. get_durable_nonce.

Процесс проверки nonce

Если recent_blockhash транзакции не найден в BlockhashQueue, validator проверяет, является ли это допустимой транзакцией с nonce через check_transaction_age:

  1. Сохранённый durable_nonce в nonce должен отличаться от следующего устойчивого nonce (вычисленного на основе текущего blockhash). Это гарантирует, что nonce ещё не был использован в этом блоке
  2. Nonce-аккаунт должен быть загружен и корректно распознаваться как State::Initialized
  3. Сохранённый durable_nonce должен совпадать с recent_blockhash транзакции

Проверка подписи полномочий nonce выполняется позже (validate_transaction_nonce).

Если все проверки пройдены, nonce продвигается к следующему значению устойчивого nonce до начала исполнения. В случае ошибки исполнения продвинутый nonce и аккаунт плательщика комиссии с уже списанной комиссией всё равно фиксируются (это предотвращает повторное выполнение и обеспечивает сбор комиссии).

Поведение при ошибке nonce

Если транзакция с nonce не проходит проверку (nonce уже использован, нет подписи полномочий, аккаунт не найден), вся транзакция отклоняется. Комиссия не взимается, изменения состояния не происходят.

Если транзакция с nonce проходит проверку, но выполнение завершается ошибкой (инструкция возвращает ошибку), nonce всё равно продвигается, а комиссия взимается. Это предотвращает повторное выполнение транзакции и гарантирует, что validator получит вознаграждение.

Is this page helpful?

Содержание

Редактировать страницу

Управляется

© 2026 Solana Foundation.
Все права защищены.
Связаться с нами