Довготривалі 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-акаунт, зчитує збережений у ньому nonce і використовує цей nonce для надсилання переказу SOL. Він використовує локальний validator, щоб платник міг бути поповнений автоматично.

setTransactionMessageLifetimeUsingDurableNonce встановлює збережений nonce як час життя транзакції та додає на початок потрібну інструкцію AdvanceNonceAccount. Додавайте інші інструкції транзакції після застосування часу життя на основі durable nonce, щоб інструкція advance залишалася першою.

Після обробки цієї транзакції nonce-акаунт містить нове значення. Перезавантажте акаунт перед створенням наступної транзакції: транзакцію, підписану попереднім 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:

  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?