К основному содержимому

Введите слово из вопроса или названия статьи.

2 · Практика

Анатомия транзакции: nonce, газ, mempool и подтверждения

Что происходит от нажатия «Подписать» до подтверждения в блоке: поля транзакции, nonce, mempool, включение в блок, финальность и причины застрявших транзакций.

3 мин чтенияОбновлено:
В этой статье

Вы нажимаете «Подтвердить» в приложении, кошелёк предлагает подписать - и через несколько секунд интерфейс сообщает, что всё прошло. Между этими моментами происходит целая цепочка событий. Её понимание помогает не паниковать, когда «что-то зависло», и читать данные в обозревателе блоков.

Из чего состоит транзакция

Транзакция - это структура данных. Основные поля:

  • from - отправитель (определяется по подписи).
  • to - получатель: другой адрес или адрес контракта. Для создания нового контракта поле пустое.
  • value - сколько основной монеты передаётся (может быть нуль).
  • data - для вызова контракта: какую функцию вызвать и с какими аргументами. Пусто при простом переводе. Формат описан в статье про ABI.
  • nonce - порядковый номер транзакции отправителя.
  • gas limit - максимум газа, который вы готовы потратить.
  • maxFeePerGas и maxPriorityFeePerGas - предельные цены газа (см. статью о комиссиях).
  • chainId - идентификатор сети. Он защищает от воспроизведения: транзакция, подписанная для Base, не будет принята в Ethereum.
  • подпись - доказательство, что транзакцию отправил владелец ключа.

Жизненный путь транзакции

1. Создание и подпись. Интерфейс формирует транзакцию, кошелёк показывает её вам, вы подписываете закрытым ключом. Подпись происходит локально, ключ никуда не отправляется.

2. Отправка узлу. Кошелёк отправляет подписанную транзакцию на RPC-узел сети - компьютер, который принимает запросы. Узел проверяет подпись, nonce и баланс.

3. Mempool. Узел рассылает транзакцию соседям, она попадает в mempool - общий «зал ожидания». Здесь все ждут включения в блок. В это время транзакция видна всем, но ещё не исполнена.

4. Включение в блок. Валидатор, формирующий очередной блок, выбирает транзакции из mempool - преимущественно с наибольшими чаевыми. Транзакция исполняется: контракт меняет своё состояние, результат записывается.

5. Подтверждения. Каждый следующий блок поверх вашего добавляет уверенности, что запись не откатится. В Ethereum финальность - гарантия, что блок не будет переписан, - наступает примерно через 13 минут (две эпохи). Для практических целей обычно хватает нескольких блоков.

Что такое nonce

Nonce - счётчик транзакций вашего адреса: 0, 1, 2… Сеть принимает их строго по порядку. Это защищает от дублирования: нельзя исполнить дважды одну и ту же подписанную транзакцию, потому что её nonce уже занят.

Отсюда следствие, которое выручает при проблемах: транзакция с nonce 5 не исполнится, пока не исполнена транзакция с nonce 4. Если «застряла» одна, все следующие стоят за ней в очереди.

Почему транзакция «зависла»

Самая частая причина - слишком низкая цена газа. Вы отправили транзакцию, когда сеть была свободной, цена выросла, и валидаторам стало невыгодно брать вашу. Транзакция висит в mempool.

Что можно сделать:

  • Подождать. Часто нагрузка спадает, и транзакция проходит сама.
  • Ускорить. Кошельки позволяют отправить ту же транзакцию (тот же nonce) с более высокой ценой газа, и она заменит старую.
  • Отменить. Отправьте с тем же nonce транзакцию себе на себя с нулевой суммой и более высокой ценой газа.

Статусы в обозревателе

  • Pending - в mempool, ещё не включена.
  • Success - выполнена, результат записан.
  • Failed (Reverted) - выполнение остановлено ошибкой. Состояние контракта не изменилось, но газ потрачен.

Ошибка контракта обычно сопровождается причиной - например, «WrongStatus» или «NotAuthorized». Хорошие интерфейсы переводят эти технические сообщения на понятный язык.

«Транзакция отправлена, а статус не обновляется»

Интерфейс узнаёт о результате опросом сети: ждёт, когда по хешу транзакции появится квитанция (receipt). Иногда публичный узел отвечает с задержкой, пока интерфейс уже показал состояние «отправлено». Это не ошибка: подождите минуту и обновите страницу. Окончательную правду показывает обозреватель блоков - об этом в статье как читать Etherscan.

Что почитать дальше

Одна из самых частых транзакций для токенов - разрешение, или approve. Она вызывает больше всего вопросов и рисков: ERC-20 и approve. А чтобы читать происходящее самостоятельно - руководство по обозревателю блоков.

Упоминается в статьях

Готовы попробовать?

Создайте первую сделку за пару минут. Деньги блокируются в смарт-контракте и выплачиваются по правилам, которые видны заранее.