Довготривалі nonce

Підсумок

Транзакції з довготривалими 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:

  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 має відрізнятися від наступного durable nonce (отриманого з поточного blockhash). Це гарантує, що nonce ще не було використано в цьому блоці
  2. Обліковий запис nonce має бути завантажений і повинен розпізнаватися як State::Initialized
  3. Збережене значення durable_nonce має збігатися з recent_blockhash транзакції

Перевірка підпису nonce authority виконується пізніше (validate_transaction_nonce).

Якщо всі перевірки пройдено успішно, nonce оновлюється до наступного значення durable nonce перед початком виконання. У разі невдалого виконання оновлений nonce та платник комісії зі списаною комісією все одно фіксуються (запобігаючи повторному відтворенню та стягуючи комісії).

Поведінка при невдачі nonce

Якщо nonce-транзакція не проходить валідацію (nonce вже використано, authority не підписано, обліковий запис не знайдено), вся транзакція відхиляється. Комісії не стягуються, зміни стану не відбуваються.

Якщо nonce-транзакція проходить валідацію, але виконання завершується невдачею (інструкція повертає помилку), nonce все одно оновлюється, а комісії стягуються. Це запобігає повторному відтворенню транзакції, водночас гарантуючи компенсацію validator.

Is this page helpful?

Зміст

Редагувати сторінку

Керується

© 2026 Фонд Solana.
Всі права захищені.
Залишайтеся на зв'язку