| Поле сообщения | Recent blockhash | Durable nonce |
|---|---|---|
| Источник значения | getLatestBlockhash | Текущий state выбранного Nonce Account |
| Граница пригодности | lastValidBlockHeight | Пока nonce on-chain не заменён |
| Первая instruction | Любая допустимая | AdvanceNonceAccount для этого account |
| После исполнения | Blockhash стареет независимо | Nonce заменяется и старый payload нельзя replay |
- Поле сообщения
- Источник значения
- Recent blockhash
- getLatestBlockhash
- Durable nonce
- Текущий state выбранного Nonce Account
- Поле сообщения
- Граница пригодности
- Recent blockhash
- lastValidBlockHeight
- Durable nonce
- Пока nonce on-chain не заменён
- Поле сообщения
- Первая instruction
- Recent blockhash
- Любая допустимая
- Durable nonce
- AdvanceNonceAccount для этого account
- Поле сообщения
- После исполнения
- Recent blockhash
- Blockhash стареет независимо
- Durable nonce
- Nonce заменяется и старый payload нельзя replay
Nonce Account — это on-chain state, а не случайное число
Nonce Account — системный account, принадлежащий System Program. В initialized state он хранит authority pubkey, durable nonce и lamports per signature. Authority вправе advance nonce, изменить authority или вывести средства по правилам System Program; поэтому этот ключ отделяют от fee payer и от ключей перевода, когда операционная модель это позволяет.
Обычная транзакция Solana использует recent blockhash и lastValidBlockHeight. Durable-вариант записывает текущий nonce в поле recent_blockhash и ставит AdvanceNonceAccount первой instruction. Другой порядок не превращается в durable transaction. RPC-узел нужен для block-pinned чтения account до сборки и ещё раз перед broadcast, но ответ одного провайдера полезно сверять независимо.
Подпись фиксирует весь message, включая nonce
Офлайн-устройство подписывает не намерение «отправить позже», а точные bytes compiled message: сеть, fee payer, nonce value, nonce account, authority, порядок accounts и все instructions. Любая правка recipient, amount, program, compute budget или nonce требует новой подписи. Перед переносом покажите человеку декодированное содержание и отдельно объясните, что именно вы подписываете.
Сначала определите состояние, затем отправляйте
| Проверка | Если да | Если нет |
|---|---|---|
| Account принадлежит System Program и initialized | Продолжить проверку полей | Не отправлять; адрес или state неверен |
| Stored nonce равен recent_blockhash payload | Payload ещё кандидат на исполнение | Старая подпись уже непригодна |
| Первая instruction — AdvanceNonceAccount этого account | Проверить authority signer | Пересобрать и подписать заново |
| Authority подписал exact message | Проверить fee payer и program calls | Валидация nonce не пройдёт |
| Signature уже найдена on-chain | Разбирать один найденный результат | Можно broadcast после финальной human review |
- Проверка
- Account принадлежит System Program и initialized
- Если да
- Продолжить проверку полей
- Если нет
- Не отправлять; адрес или state неверен
- Проверка
- Stored nonce равен recent_blockhash payload
- Если да
- Payload ещё кандидат на исполнение
- Если нет
- Старая подпись уже непригодна
- Проверка
- Первая instruction — AdvanceNonceAccount этого account
- Если да
- Проверить authority signer
- Если нет
- Пересобрать и подписать заново
- Проверка
- Authority подписал exact message
- Если да
- Проверить fee payer и program calls
- Если нет
- Валидация nonce не пройдёт
- Проверка
- Signature уже найдена on-chain
- Если да
- Разбирать один найденный результат
- Если нет
- Можно broadcast после финальной human review
Контролируемая офлайн-сессия
- 1Закрепите cluster
Запишите genesis hash или допустимый cluster, RPC endpoint, nonce account и наблюдаемый slot.
- 2Считайте account
Сохраните owner, initialized state, authority, durable nonce, balance и fee-rate field.
- 3Соберите один message
Поставьте advance первым, затем целевые instructions; зафиксируйте fee payer и полный список accounts.
- 4Декодируйте офлайн
Сверьте recipient, суммы, program IDs, writable/signers и hash/bytes сообщения на каждом устройстве.
- 5Соберите подписи
Передавайте неизменяемый payload; не смешивайте подписи от двух версий сообщения.
- 6Перечитайте nonce и отправьте один раз
Непосредственно перед broadcast подтвердите совпадение on-chain nonce и отсутствие уже найденной signature.
Ошибка до и после nonce-валидации имеет разный итог
Если account отсутствует, nonce не совпал или authority не подписал, nonce-валидация не проходит: транзакцию отбрасывают без fee и state changes. Если валидация прошла, но более поздняя instruction вернула ошибку, Solana всё равно сохраняет новый nonce и списанную fee; остальные изменения failed execution откатываются. Поэтому повтор тех же bytes не является recovery — нужен свежий nonce, исправленный message и новые подписи.
Stop-сигналы
- посредник не показывает nonce account, authority или первую instruction;
- в payload одновременно менялись fields после первой подписи;
- stored nonce уже отличается, но предлагают повторить старые serialized bytes;
- один nonce используют для нескольких конкурирующих платежей и обещают, что исполнятся все;
- получатель, сумма или program ID не проходят процедуру безопасного перевода криптовалюты;
- план полагается на будущую поддержку durable nonces без monitoring официального deprecation warning.
Результат считается закрытым только после поиска exact signature и чтения transaction meta: status, fee, logs и ожидаемые account deltas. При неизвестном результате не advance nonce вручную до проверки нескольких RPC и истории. Если подписи нет, но nonce уже новый, старый payload восстановить нельзя; сохраните evidence, заново выполните безопасный перевод криптовалюты с текущим state и не просите подписантов подписывать непрочитанные bytes.
Источники
Мы используем прямые ссылки и фиксируем дату проверки. Полный текст чужих материалов не перепечатывается.
- Solana Docs — Durable Nonces Solana Foundation · Проверено 22 августа 2026 г. в 10:35 GMT+5
- Solana Cookbook — Transaction Confirmation & Expiration Solana Foundation · Проверено 22 августа 2026 г. в 10:35 GMT+5
- Anza Kit — Transaction Messages Anza · Проверено 22 августа 2026 г. в 10:35 GMT+5
- Agave — nonce transaction runtime implementation Anza · Проверено 22 августа 2026 г. в 10:35 GMT+5
