Ожидающие транзакции Ethereum: nonce, замена и отмена
Разберитесь, почему транзакции Ethereum ждут, как nonce упорядочивают операции аккаунта и что могут и чего не могут сделать функции ускорения и отмены в кошельке.
В этом руководствеСтатус «ожидает» означает, что транзакция еще не включена в блок
Краткое резюме
Транзакции Ethereum, отправленные с обычного внешнего аккаунта (EOA), используют последовательные nonce. Транзакция с более поздним nonce не может выполниться, пока не будет использован более ранний nonce этого аккаунта. Функция ускорения или отмены в кошельке обычно создает конкурирующую транзакцию с тем же nonce; это не обещает включение в блок, а уже подтвержденную транзакцию нельзя отменить.
Статус «ожидает» означает, что транзакция еще не включена в блок
После подписания транзакции Ethereum кошелек может отправить ее клиенту исполнения или сервису транзакций. Узлы, которые ее принимают, могут передать ее соседним узлам, а позднее предлагающий блок может включить ее в блок. До включения транзакция не меняет состояние канонической цепочки. Статус «ожидает» в кошельке или обозревателе обычно означает, что сервис знает о транзакции, но еще не видел ее в блоке; он не указывает на существование одной общей сетевой очереди. Путь от подписания и распространения до включения в блок описан в руководстве Ethereum.org по транзакциям.
Транзакция может ждать по разным причинам. Указанные пределы комиссии могут не подходить для включения в блок, более ранняя транзакция того же аккаунта может оставаться нерешенной, узел мог не получить ее, а кошелек может показывать устаревшие данные или сведения конкретного провайдера. Для каждой причины нужны разные проверки. Повышение комиссии не исправит ошибочно выбранную сеть, а отправка еще одного платежа без проверки первого может привести к повторной оплате.
Статус «ожидает» также отличается от статусов «подтверждена», «финализирована» и «не выполнена». Хеш транзакции может отображаться до появления квитанции; квитанция становится доступна после включения транзакции. Затем блоки Ethereum проходят этапы консенсуса. Кошельки и обозреватели могут по-разному использовать эти обозначения, поэтому проверяйте хеш, блок, квитанцию и текущее состояние цепочки, а не полагайтесь на одну короткую метку.
Nonce — это порядковый номер транзакции аккаунта
У обычного внешнего аккаунта Ethereum (EOA) есть nonce, который задает порядок его транзакций. Это счетчик, а не комиссия, временная метка или уникальный хеш транзакции. Для каждого аккаунта цепочка принимает транзакцию только с тем nonce, который следующим ожидается согласно состоянию аккаунта. В канонической цепочке один аккаунт не может выполнить две транзакции с одинаковым nonce. В документации Ethereum.org об аккаунтах nonce описан как счетчик транзакций аккаунта и механизм защиты от повторного воспроизведения.
Предположим, следующий неиспользованный nonce аккаунта равен 41. Для следующей допустимой транзакции нужен nonce 41; после ее включения и применения следующая транзакция использует nonce 42. Nonce относится к отправляющему аккаунту, а не к адресу получателя. У двух разных аккаунтов одновременно может быть транзакция с номером 41, потому что у каждого своя последовательность.
Транзакцию можно подписать с nonce выше текущего ончейн-значения аккаунта, но при выполнении она не сможет перескочить через последовательность. Сначала должен быть использован пропущенный более ранний nonce. Транзакция с nonce, уже использованным аккаунтом, устарела и не может выполниться как новая. Благодаря такому порядку сеть обрабатывает транзакции каждого аккаунта последовательно, даже если они отправлены в разное время или пришли через разные узлы.
Правило nonce относится к обычным транзакциям EOA в слое исполнения Ethereum. Оно не описывает универсально все абстракции кошельков, секвенсоры роллапов или блокчейны. Системы смарт-аккаунтов могут добавлять собственные правила операций и nonce; они рассматриваются далее.
«Ожидает» и «в очереди» — локальные обозначения пула транзакций
В Ethereum нет единой синхронизированной комнаты ожидания, которую все кошельки, узлы, обозреватели блоков и предлагающие блоки видят одинаково. Каждый клиент исполнения хранит локальный пул полученных транзакций, которые считает допустимыми согласно собственным ограничениям и политикам. Транзакция может быть в пуле одного узла и отсутствовать у другого. В документации Geth по RPC txpool показаны локальные группы pending и queued этого клиента; там также отмечено, что с одним отправителем и nonce могут быть связаны несколько транзакций.
В терминологии Geth pending обычно означает транзакции, которые можно обработать по nonce, начиная с текущего состояния аккаунта; queued может включать транзакции с будущим nonce, ожидающие устранения пропуска. Эти названия относятся к интерфейсу клиента, а не к состояниям уровня консенсуса, которые должны показывать все программы Ethereum. Кошелек может называть весь список неподтвержденных транзакций «ожидающими», а обозреватель — показывать только те транзакции, которые увидели его собственные поставщики данных.
Например, если узел знает транзакцию с nonce 41 и другую с nonce 43, он не может выполнить 43 раньше 42. Узел может держать 43 в очереди, пока не получит 42 или состояние аккаунта не изменится иным образом. Другой узел, который не получил 43, вообще ее не покажет. Поэтому два обозревателя могут по-разному обозначать транзакцию — как ожидающую или отсутствующую, — и ни один экран не доказывает, что именно увидели все валидаторы.
Некоторые клиенты также допускают несколько неподтвержденных кандидатов на транзакцию с одним отправителем и nonce. Это альтернативы, конкурирующие за одно и то же место в последовательности, а не две транзакции, которые могут выполниться обе по порядку. Емкость пула, срок хранения транзакций и правила замены — политики реализации; они могут меняться между версиями ПО. Например, среди настраиваемых параметров пула транзакций Geth есть порог повышения цены, специфичный для клиента. Его нельзя считать универсальным правилом комиссии Ethereum. Область действия этих параметров описана в справочнике параметров командной строки Geth.
Один неразрешенный nonce может задержать последующие транзакции
Представим, что следующий ончейн-nonce аккаунта равен 41. Вы распространяете транзакцию A с nonce 41, а затем транзакцию B с nonce 42. Пока A не разрешена, B не может выполниться первой. B может оставаться в локальной очереди, отображаться только как ожидающая в кошельке или отсутствовать в обозревателе, который ее не получал. Важен порядок nonce, а не то, в каком порядке кошелек создал или показал транзакции.
Если A в итоге включат в блок, nonce аккаунта перейдет к 42, и B может стать допустимой — при условии, что она сама действительна, удовлетворяет условиям комиссии и правилам пула. Если A заменена другой допустимой транзакцией с nonce 41, заменяющая транзакция займет то же место в последовательности, если именно она будет включена. Если другая транзакция аккаунта уже использовала nonce 41, старый кандидат с номером 41 устаревает и больше не сможет выполниться.
Поэтому отправка новой транзакции с более высоким nonce — не универсальный способ разблокировать застрявшую. Она лишь добавляет еще одну транзакцию за пропуском. Отмена B также не решит проблему A, если B уже идет позже. Прежде чем что-либо менять, найдите самый ранний неразрешенный nonce аккаунта и проверьте его состояние.
Пропуск может быть временным или сохраняться долго. Более ранняя транзакция могла не попасть на проверяемый узел, иметь настройки комиссии, непривлекательные или недостаточные для текущих условий, либо быть удалена из пула конкретного узла. Кошелек может также показывать транзакцию в очереди, созданную на другом устройстве. По одному экрану нельзя понять, что именно произошло: сравните подтвержденный nonce аккаунта, хеши транзакций и данные более чем одного надежного источника.

Настройки комиссии влияют на включение, но не меняют порядок nonce
Порядок nonce и допустимость комиссии — разные ограничения. Транзакция со следующим правильным nonce все равно может ждать, если ее параметры комиссии не подходят для включения в блок. Транзакция с более высоким nonce не перескочит вперед только потому, что предлагает большую чаевую часть комиссии. Повышение комиссии для nonce 42 не устраняет nonce 41.
Для стандартной транзакции EIP-1559 максимальная комиссия должна покрывать базовую комиссию блока, в который ее включат, а приоритетная комиссия может повлиять на выбор предлагающего блок. Пока транзакция ждет, базовая комиссия и доступное место в блоках могут меняться. Максимальная комиссия — это предел; увеличение предела не гарантирует включение к определенному времени. В руководстве по комиссиям за газ Ethereum объясняются эти поля и расчет фактической комиссии.
Узел или кошелек может применять дополнительные правила распространения или замены. Они определяют, какие транзакции готов принять или передать конкретный сервис; не все такие правила являются правилами консенсуса. Например, Geth позволяет задавать порог повышения цены для замены ожидающей транзакции в собственном пуле. Другой клиент, провайдер, кошелек или версия программы могут вести себя иначе. Не полагайтесь на запомненный процент или фиксированное время ожидания как на гарантию для всей сети.
Если транзакция ждет из-за неразрешенного меньшего nonce, сначала найдите транзакцию, занимающую этот nonce. Если причина в том, что предел комиссии не покрывает текущие условия базовой комиссии, разберитесь в полях комиссии до изменения. Руководство по комиссиям Ethereum поможет с расчетами; эта статья посвящена отдельной проблеме последовательности.
Ускорение отправляет кандидата на замену с тем же nonce
Функция «ускорить» в кошельке обычно создает новую транзакцию от того же аккаунта с тем же nonce и измененными параметрами комиссии. Эти два кандидата конфликтуют, потому что аккаунт может выполнить только одну транзакцию с этим nonce. Если замену примут соответствующие пулы и включат в блок, она может занять место этого nonce; исходная транзакция уже не сможет выполниться одновременно с ней в канонической цепочке. В инструкции MetaMask по ожидающим транзакциям функция ускорения описана применительно к этому кошельку как повторная отправка с тем же nonce и более высокой комиссией.
Замена может сохранить исходного получателя и действие, изменив только поля комиссии, но не следует так предполагать: проверьте экран подписания. Интерфейс конкретного кошелька может показывать дополнительные поля или называть действие иначе. Перед подписанием замены проверьте отправляющий аккаунт, nonce, адрес назначения, сумму и данные контракта. Если действие транзакции изменилось, это уже не просто безобидная корректировка комиссии.
Нет гарантии, что замена будет принята повсюду или быстро включена в блок. Исходная транзакция могла уже попасть в блок; узел может отклонить замену по своей политике; сама замена может оставаться неинтересной предлагающему блок; сервис может не передать ее узлам, за которыми вы наблюдаете. Если исходная транзакция уже подтверждена, другая транзакция с использованным nonce не отменит ее и обычно будет отклонена как устаревшая.
Здесь «замена» означает конкурирующую транзакцию от того же аккаунта с тем же nonce. Не переносите в Ethereum процедуры Bitcoin RBF или CPFP. В Bitcoin используется другая модель транзакций, поэтому его способы повышения комиссии не являются инструкциями для аккаунтов Ethereum.
Отмена — это попытка занять то же место в последовательности nonce
После распространения подписанной транзакции Ethereum нет протокольной команды отмены, которая отзывает ее у всех узлов. Некоторые кошельки предлагают отмену, пока транзакция не подтверждена. Обычно эта функция пытается распространить другую транзакцию того же аккаунта с тем же nonce; распространенный вариант — транзакция на нулевую сумму на собственный адрес отправителя. Если кандидат на отмену примут и включат раньше исходной транзакции, он использует nonce и сделает исходный кандидат недопустимым для последующего выполнения. Точная конструкция и доступность функции зависят от кошелька.
Исходная транзакция и кандидат на отмену соревнуются. Если первой включат исходную, отправленная позже отмена не сможет обратить ее эффекты. Если не примут и не включат ни одну из них, nonce может остаться неразрешенным. Нажатие кнопки или сообщение об успехе в кошельке не доказывает, что отмена выиграла. Проверьте полученный хеш транзакции и состояние канонической цепочки. В инструкции MetaMask попытка отмены ограничена еще ожидающей транзакцией; там также сказано, что подтвержденную транзакцию отменить нельзя.
Перед подписанием транзакции отмены убедитесь, что она использует тот же аккаунт и nonce, что и транзакция, которую вы хотите вытеснить; проверьте все показанные кошельком поля. Если отмену включат в блок, может потребоваться еще одна сетевая комиссия. Кандидат на отмену тоже может ждать или не заменить исходную транзакцию из-за правил соответствующих пулов. Слово «отменена» в кошельке не означает протокольного отката; считать действие успешным следует только после проверки того, какая транзакция использовала nonce.
Если транзакция уже выполнила одобрение токена, вызов контракта или перевод, отмена более поздней транзакции не обратит завершенное изменение состояния. У некоторых действий контракта есть отдельные последующие методы, но их наличие и последствия зависят от контракта. Не подписывайте незнакомую транзакцию лишь потому, что интерфейс называет ее отменой.
Включена, выполнена с откатом, удалена или не найдена — разные наблюдения
У включенной транзакции есть блок и квитанция. При успешном выполнении предполагаемые изменения состояния могли примениться. Если исполнение EVM откатилось, изменения состояния этой операции отменяются, но транзакция все равно использовала nonce аккаунта и могла потребовать оплату газа. Проверяйте квитанцию и результат выполнения, а не делайте вывод по уведомлению кошелька. Различие между включением и результатом исполнения описано в руководстве Ethereum.org по транзакциям и руководстве по газовым комиссиям.
Метка «удалена» или «не найдена» часто описывает только один кошелек, обозреватель, RPC-провайдер или локальный пул. Сама по себе она не доказывает, что протокол отменил транзакцию или что nonce свободен. Другой узел может по-прежнему знать о ней; кошелек может повторно передать подписанную транзакцию; позднее блок может показать, что nonce аккаунта уже изменился. И наоборот, транзакции может не быть в проверенных источниках, хотя подтвержденный nonce аккаунта не изменился.
Если хеш транзакции не находится, проверьте, что выбраны та же сеть и аккаунт, с которых ее отправляли. Сравните последний ончейн-nonce аккаунта с nonce транзакции и посмотрите недавние транзакции этого отправителя. Ответ nonce too low указывает, что с точки зрения данного узла nonce уже мог быть использован; это не повод многократно повторять тот же запрос. Уточните, какая транзакция его использовала и остается ли соответствующий блок каноническим.
На включенную транзакцию также может повлиять кратковременная реорганизация цепочки до ее стабилизации. Кошельки и обозреватели могут обновлять статус по мере изменения наблюдаемой ими цепочки. Для важного перевода соблюдайте правила подтверждений получающего сервиса и, когда это необходимо, дождитесь более сильной финальности консенсуса. «Увидели в одном блоке» и «ни при каких обстоятельствах нельзя обратить» — не одно и то же.
Перед действием найдите самый ранний неразрешенный nonce
Сначала проверьте сеть, отправляющий аккаунт и хеш транзакции. Найдите этот хеш в надежном обозревателе для нужной сети. Проверьте наличие квитанции, использованный nonce, успешность выполнения и наличие более поздних транзакций аккаунта. Не раскрывайте и не вводите seed-фразу, чтобы проверить транзакцию: для поиска по публичной цепочке достаточно публичного адреса и хеша транзакции.
Если хеш не виден, сравните последний подтвержденный nonce аккаунта с номером в кошельке. Разработчик или оператор узла может вызвать eth_getTransactionCount с тегами блока latest и pending. В справочнике Ethereum.org по JSON-RPC указано, что latest относится к состоянию последнего блока, а pending — к состоянию с ожидающими транзакциями. Результат pending все равно зависит от представления конкретного RPC-узла; два провайдера могут вернуть разные значения. Большинству пользователей первые подсказки доступны в истории аккаунта кошелька и надежном обозревателе — запускать команды не обязательно.
Далее разбирайтесь начиная с наименьшего nonce, который еще не использован. Если исходная транзакция видна и кошелек поддерживает замену, проверьте точные поля и комиссию новой транзакции до подписания. Если исходную не видно, спросите кошелек или RPC-провайдера, как он обрабатывает повторную отправку и замену, а не предполагайте, что транзакция исчезла из сети. Если nonce уже использован, сначала установите, какая транзакция была включена. Не отправляйте снова и снова транзакции с более поздними nonce: очередь может увеличиться, а первый пропуск останется.
Эти шаги относятся к обычным транзакциям внешних аккаунтов Ethereum. Системы абстракции аккаунтов могут отправлять UserOperation через бандлеры, а смарт-аккаунты могут использовать ключи nonce и последовательности сложнее одного счетчика. EIP-4337 определяет структуру nonce для таких операций, поэтому кошелек с абстракцией аккаунта может вести себя иначе, чем в примерах с EOA. Сведения о сети назначения, адресах и состоянии перевода можно продолжить проверять по чек-листу перевода криптовалюты.
Частые вопросы
Q1Можно ли отменить транзакцию Ethereum после подтверждения?
Нет. Пока транзакция не подтверждена, кошелек может попытаться заменить ее транзакцией с тем же nonce, но он не может отменить транзакцию, уже включенную и выполненную. Перед действием проверьте хеш транзакции и состояние цепочки.
Q2Почему следующая транзакция Ethereum тоже ждет?
Обычные транзакции EOA выполняются в порядке nonce. Если более ранний nonce остается неразрешенным, более поздние не могут выполниться первыми, даже если они видны в кошельке или предлагают более высокую комиссию.
Q3Означает ли метка «удалена», что транзакция отменена?
Не обязательно. Возможно, транзакцию больше не видит один кошелек, обозреватель или узел. Прежде чем считать nonce свободным, проверьте хеш транзакции и последний nonce аккаунта в правильной сети.
Источники и дополнительное чтение
Сообщить о проблеме
Мы подготовим письмо со ссылкой на эту статью. Mark получит сообщение только после отправки
Быстрая проверка
Прочитали руководство? Проверьте себя в 3 вопросах
Вопрос 01
У аккаунта есть неразрешенная транзакция с nonce 41 и другая транзакция с nonce 42. Что может произойти со второй транзакцией?
Выберите ответ, чтобы увидеть объяснение
Словарь опционов
Состояние, при котором страйк опциона близок к рыночной цене базового актива. Внутренняя стоимость может быть малой или нулевой, но премия способна сохраняться из-за оставшегося времени и неопределённости.
Читать подробное руководствоколл-опционКонтракт, который даёт держателю право, но не обязанность, купить базовый актив по страйку на условиях контракта. Продавец несёт соответствующую обязанность при исполнении и назначении.
Читать подробное руководство