Как разобраться, почему транзакция не прошла: открыть её в обозревателе блоков и посмотреть статус в квитанции. Если там стоит ошибка, операция попала в блок и была исполнена, но её действие откатилось — плата при этом списана, а результата нет. Это не зависание и не отмена. Причину ищут в четырёх местах: лимит газа, проверка внутри контракта, выданное разрешение на токен, допуск по проскальзыванию.

Неудачная транзакция — это операция, включённая в блок и исполненная узлами, но завершившаяся откатом изменений, из-за которого плата за вычисления удержана, а заявленное действие не состоялось.

Почему это происходит: механика без упрощений

Ключ к пониманию лежит в квитанции операции. Спецификация EIP-658 заменила в квитанции промежуточный корень состояния на код статуса: значение 1 означает успех, значение 0 — отказ «due to any operation that can cause the transaction or top-level call to revert». Обозреватели рисуют этот код словами «Fail» или красной пометкой. Код 0 — не отсутствие операции в сети. Операция есть, блок у неё есть, работа узлов выполнена, и потому оплачена.

Второе правило касается газа. По тексту спецификации EIP-140, которая ввела инструкцию REVERT, «the rollback itself does not consume all gas, the contract only has to pay for memory», тогда как исчерпание газа и недопустимая инструкция «will consume all remaining gas». Отсюда практическая разница, которую читатели ощущают кошельком: аккуратный отказ по проверке внутри контракта возвращает неизрасходованный остаток, а операция, упёршаяся в лимит, съедает весь заявленный газ целиком.

Третий слой — экономика платы. Базовый перевод по документации Ethereum расходует 21 000 единиц газа, вызов контракта — существенно больше, и израсходованный объём умножается на цену за единицу независимо от того, чем кончилась работа. Сеть продаёт вычисление, а не результат.

Как понять, что именно случилось

Диагностика идёт по квитанции, а не по ощущениям. Порядок такой.

  1. Статус и блок. Есть номер блока и пометка об ошибке — случай именно этот. Нет блока — операция в пуле, и разбирать нужно плату, а не отказ.
  2. Израсходованный газ против лимита. Израсходовано почти сто процентов лимита — типовой признак исчерпания газа. Израсходована малая доля — сработала проверка внутри контракта.
  3. Текст причины. Обозреватели показывают строку отказа, переданную контрактом: по ней видно, какое условие не выполнилось.
  4. Входные данные вызова. Расшифрованные параметры показывают, к какому контракту и методу шёл вызов и с какими аргументами.
  5. Сеть и стандарт токена. Токен живёт в конкретной сети по конкретному стандарту; вызов не того контракта даёт отказ, который выглядит загадочно, пока не сверены сеть и стандарт.
Схема из пяти шагов: открыть квитанцию операции в обозревателе, прочитать код статуса, сравнить израсходованный газ с лимитом, прочитать строку причины отказа, разобрать входные данные вызова
Схема из пяти шагов: открыть квитанцию операции в обозревателе, прочитать код статуса, сравнить израсходованный газ с лимитом, прочитать строку причины отказа, разобрать входные данные вызова

Расшифровку входных данных и чтение состояния контракта подробно разбирают два материала: о том, как читать данные смарт-контракта в обозревателе, и о том, как понять, кто вызывал контракт и с какими параметрами. Без этих двух навыков разбор отказа упирается в догадки.

Четыре типовые причины отказа

Причина Признак в обозревателе Что делать
Кончился лимит газа: вычислений оказалось больше, чем заявлено в операции Израсходовано почти сто процентов лимита; по EIP-140 такое исключение забирает весь остаток газа Повторить вызов с увеличенным лимитом. Лимит — не цена за единицу, а количество единиц: его рост не поднимает цену газа
Сработала проверка внутри контракта: условие в коде не выполнилось Израсходована малая доля лимита, передана строка причины отказа; неизрасходованный остаток возвращён Прочитать строку причины и состояние контракта: пауза, лимит на адрес, закрытый список участников, незавершённый этап
Недостаточно разрешения на токен: контракт не имеет права списать нужный объём Отказ на методе перевода от имени владельца; стандарт EIP-20 описывает allowance как объём, который получателю ещё позволено списать Выдать разрешение на требуемый объём отдельной операцией, затем повторить вызов. Старое разрешение иногда нужно обнулить
Проскальзывание вышло за допуск: цена сдвинулась между подписью и исполнением Строка причины ссылается на недостаточный объём на выходе: в опубликованном коде маршрутизатора это require с текстом INSUFFICIENT_OUTPUT_AMOUNT Повторить с увеличенным допуском либо в спокойный час. Для крупной суммы — дробить на части
Истёк срок вызова: подпись пришла в сеть позже заданного времени Строка причины ссылается на срок; в том же коде маршрутизатора это require с текстом EXPIRED Собрать вызов заново с актуальным сроком. Для длинной очереди срок ставят с запасом
Отказ не означает, что средства «сгорели». Плата удержана за вычисления, а переводимая сумма осталась на вашем адресе — убедитесь в этом по обозревателю, прежде чем делать выводы. И ни один сервис «восстановления неудачных транзакций» не должен получать ваши приватные ключи или сид-фразу: в протоколе нет механизма, которым третья сторона откатила бы запись в блоке.

Пошаговое решение

  1. Откройте квитанцию по хешу операции и зафиксируйте код статуса. Это отправная точка.
  2. Сравните израсходованный газ с заявленным лимитом и запишите долю. Доля решает, куда идти дальше.
  3. Прочитайте строку причины отказа и переведите её на язык действий: не хватило лимита, не прошла проверка, не хватило разрешения, не сошлось по допуску.
  4. Проверьте состояние контракта по его публичным методам: не стоит ли он на паузе, не исчерпан ли лимит выпуска, не закрыт ли приём.
  5. Исправьте один параметр за раз. Меняя сразу лимит газа, допуск и объём, вы потеряете понимание, что именно помогло.
  6. Повторите вызов и сверьте результат по квитанции: статус 1 означает, что действие состоялось.

Сколько это стоит

Неудачная операция стоит столько же, сколько успешная за тот же объём вычислений. Исчерпание лимита — худший случай: по EIP-140 такое исключение забирает весь заявленный газ. Отказ по проверке внутри контракта дешевле, поскольку остаток возвращается. Условный пример: лимит 200 000 единиц, израсходовано 48 000 — вы платите за 48 000, остальное не списывается; числа взяты для счёта, а не как рыночные. Текущая цена за единицу в статье не приводится намеренно: она меняется каждый блок.

Повторная попытка в час высокой нагрузки обходится дороже и чаще упирается в допуск по проскальзыванию. Выбрать окно помогает материал о том, как оценить нагрузку сети по историческим данным.

Как не повторить

  • Не правьте лимит газа вниз «для экономии»: лимит задаёт количество единиц, а не цену, и его нехватка стоит всего заявленного газа.
  • Выдавайте разрешение на токен ровно под задачу и проверяйте остаток разрешения перед повторным вызовом.
  • Крупный обмен дробите, а допуск ставьте по текущей глубине рынка, а не по значению из прошлого раза.
  • Перед вызовом незнакомого контракта читайте его публичные данные: пауза и ограничения видны заранее.
  • Перевод между сетями начинайте с пробной суммы — варианты маршрутов сравнивает разбор о том, какие мосты в сеть Base существуют и чем они различаются.

Итог

Отказ — это оплаченная работа без результата, а не потеря средств. Код статуса в квитанции по EIP-658 отделяет успех от отказа одним значением. Доля израсходованного газа указывает, упёрлась операция в лимит или была остановлена проверкой внутри контракта. Строка причины и расшифрованные параметры вызова закрывают вопрос окончательно. Повторять стоит с одним изменённым параметром.

Материалы по теме:

Частые вопросы

Почему списалась плата, если операция не прошла?

Узлы выполнили вычисления и включили операцию в блок, а оплачивается именно работа. Откат изменений не отменяет того, что работа сделана. По EIP-140 отказ через REVERT возвращает неизрасходованный остаток газа, а исчерпание лимита забирает весь заявленный объём. Переводимая сумма при отказе остаётся на вашем адресе.

Как отличить отказ от зависания?

По наличию блока. У зависшей операции блока нет, статус «Pending», и лечится она подменой по номеру с большей платой. У неудачной операции блок есть, а статус показывает ошибку, и подменять тут нечего — нужен повторный вызов с исправленными параметрами.

Поможет ли увеличение лимита газа всегда?

Только в случае, когда операция упёрлась в лимит: это видно по доле израсходованного газа, близкой к ста процентам. Если отказ пришёл от проверки внутри контракта, рост лимита ничего не изменит — условие в коде останется невыполненным, и повторная попытка снова будет стоить денег.

Что значит отказ по разрешению на токен?

Контракт пытался списать токены от вашего имени, но выданного разрешения не хватило. Стандарт EIP-20 определяет allowance как объём, который указанному адресу ещё позволено списать с вашего. Решение — отдельная операция выдачи разрешения на нужный объём, после чего основной вызов повторяют.

Можно ли вернуть средства после неудачной операции?

Переводимую сумму возвращать не нужно: при откате она не уходила. Удержанную плату не вернёт никто — она ушла производителю блока и в сжигание базовой части. Сервисы, предлагающие «вернуть неудачную транзакцию», механизма для этого не имеют и опасны по существу.

Вердикт

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