Как разобраться, почему транзакция не прошла: открыть её в обозревателе блоков и посмотреть статус в квитанции. Если там стоит ошибка, операция попала в блок и была исполнена, но её действие откатилось — плата при этом списана, а результата нет. Это не зависание и не отмена. Причину ищут в четырёх местах: лимит газа, проверка внутри контракта, выданное разрешение на токен, допуск по проскальзыванию.
Почему это происходит: механика без упрощений
Ключ к пониманию лежит в квитанции операции. Спецификация 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 единиц газа, вызов контракта — существенно больше, и израсходованный объём умножается на цену за единицу независимо от того, чем кончилась работа. Сеть продаёт вычисление, а не результат.
Как понять, что именно случилось
Диагностика идёт по квитанции, а не по ощущениям. Порядок такой.
- Статус и блок. Есть номер блока и пометка об ошибке — случай именно этот. Нет блока — операция в пуле, и разбирать нужно плату, а не отказ.
- Израсходованный газ против лимита. Израсходовано почти сто процентов лимита — типовой признак исчерпания газа. Израсходована малая доля — сработала проверка внутри контракта.
- Текст причины. Обозреватели показывают строку отказа, переданную контрактом: по ней видно, какое условие не выполнилось.
- Входные данные вызова. Расшифрованные параметры показывают, к какому контракту и методу шёл вызов и с какими аргументами.
- Сеть и стандарт токена. Токен живёт в конкретной сети по конкретному стандарту; вызов не того контракта даёт отказ, который выглядит загадочно, пока не сверены сеть и стандарт.

Расшифровку входных данных и чтение состояния контракта подробно разбирают два материала: о том, как читать данные смарт-контракта в обозревателе, и о том, как понять, кто вызывал контракт и с какими параметрами. Без этих двух навыков разбор отказа упирается в догадки.
Четыре типовые причины отказа
| Причина | Признак в обозревателе | Что делать |
|---|---|---|
| Кончился лимит газа: вычислений оказалось больше, чем заявлено в операции | Израсходовано почти сто процентов лимита; по EIP-140 такое исключение забирает весь остаток газа | Повторить вызов с увеличенным лимитом. Лимит — не цена за единицу, а количество единиц: его рост не поднимает цену газа |
| Сработала проверка внутри контракта: условие в коде не выполнилось | Израсходована малая доля лимита, передана строка причины отказа; неизрасходованный остаток возвращён | Прочитать строку причины и состояние контракта: пауза, лимит на адрес, закрытый список участников, незавершённый этап |
| Недостаточно разрешения на токен: контракт не имеет права списать нужный объём | Отказ на методе перевода от имени владельца; стандарт EIP-20 описывает allowance как объём, который получателю ещё позволено списать | Выдать разрешение на требуемый объём отдельной операцией, затем повторить вызов. Старое разрешение иногда нужно обнулить |
| Проскальзывание вышло за допуск: цена сдвинулась между подписью и исполнением | Строка причины ссылается на недостаточный объём на выходе: в опубликованном коде маршрутизатора это require с текстом INSUFFICIENT_OUTPUT_AMOUNT | Повторить с увеличенным допуском либо в спокойный час. Для крупной суммы — дробить на части |
| Истёк срок вызова: подпись пришла в сеть позже заданного времени | Строка причины ссылается на срок; в том же коде маршрутизатора это require с текстом EXPIRED | Собрать вызов заново с актуальным сроком. Для длинной очереди срок ставят с запасом |
Пошаговое решение
- Откройте квитанцию по хешу операции и зафиксируйте код статуса. Это отправная точка.
- Сравните израсходованный газ с заявленным лимитом и запишите долю. Доля решает, куда идти дальше.
- Прочитайте строку причины отказа и переведите её на язык действий: не хватило лимита, не прошла проверка, не хватило разрешения, не сошлось по допуску.
- Проверьте состояние контракта по его публичным методам: не стоит ли он на паузе, не исчерпан ли лимит выпуска, не закрыт ли приём.
- Исправьте один параметр за раз. Меняя сразу лимит газа, допуск и объём, вы потеряете понимание, что именно помогло.
- Повторите вызов и сверьте результат по квитанции: статус 1 означает, что действие состоялось.
Сколько это стоит
Повторная попытка в час высокой нагрузки обходится дороже и чаще упирается в допуск по проскальзыванию. Выбрать окно помогает материал о том, как оценить нагрузку сети по историческим данным.
Как не повторить
- Не правьте лимит газа вниз «для экономии»: лимит задаёт количество единиц, а не цену, и его нехватка стоит всего заявленного газа.
- Выдавайте разрешение на токен ровно под задачу и проверяйте остаток разрешения перед повторным вызовом.
- Крупный обмен дробите, а допуск ставьте по текущей глубине рынка, а не по значению из прошлого раза.
- Перед вызовом незнакомого контракта читайте его публичные данные: пауза и ограничения видны заранее.
- Перевод между сетями начинайте с пробной суммы — варианты маршрутов сравнивает разбор о том, какие мосты в сеть Base существуют и чем они различаются.
Итог
Отказ — это оплаченная работа без результата, а не потеря средств. Код статуса в квитанции по EIP-658 отделяет успех от отказа одним значением. Доля израсходованного газа указывает, упёрлась операция в лимит или была остановлена проверкой внутри контракта. Строка причины и расшифрованные параметры вызова закрывают вопрос окончательно. Повторять стоит с одним изменённым параметром.
Материалы по теме:
- Как читать данные смарт-контракта в обозревателе — как проверить состояние контракта до повторного вызова.
- Как понять, кто вызывал контракт и с какими параметрами — расшифровка входных данных операции.
- Как оценить нагрузку сети по историческим данным — когда повторная попытка дешевле и надёжнее.
- Мосты в сеть Base: сравнение вариантов перевода эфира — где отказ случается на стороне маршрута, а не контракта.
Частые вопросы
Почему списалась плата, если операция не прошла?
Узлы выполнили вычисления и включили операцию в блок, а оплачивается именно работа. Откат изменений не отменяет того, что работа сделана. По EIP-140 отказ через REVERT возвращает неизрасходованный остаток газа, а исчерпание лимита забирает весь заявленный объём. Переводимая сумма при отказе остаётся на вашем адресе.
Как отличить отказ от зависания?
По наличию блока. У зависшей операции блока нет, статус «Pending», и лечится она подменой по номеру с большей платой. У неудачной операции блок есть, а статус показывает ошибку, и подменять тут нечего — нужен повторный вызов с исправленными параметрами.
Поможет ли увеличение лимита газа всегда?
Только в случае, когда операция упёрлась в лимит: это видно по доле израсходованного газа, близкой к ста процентам. Если отказ пришёл от проверки внутри контракта, рост лимита ничего не изменит — условие в коде останется невыполненным, и повторная попытка снова будет стоить денег.
Что значит отказ по разрешению на токен?
Контракт пытался списать токены от вашего имени, но выданного разрешения не хватило. Стандарт EIP-20 определяет allowance как объём, который указанному адресу ещё позволено списать с вашего. Решение — отдельная операция выдачи разрешения на нужный объём, после чего основной вызов повторяют.
Можно ли вернуть средства после неудачной операции?
Переводимую сумму возвращать не нужно: при откате она не уходила. Удержанную плату не вернёт никто — она ушла производителю блока и в сжигание базовой части. Сервисы, предлагающие «вернуть неудачную транзакцию», механизма для этого не имеют и опасны по существу.
Вердикт
В обращениях читателей отказ почти всегда описывают словами «деньги пропали», хотя квитанция говорит обратное: ушла плата, сумма на месте. Разбор занимает минуты, если смотреть на три вещи — код статуса, долю израсходованного газа и строку причины. Повторять вызов наугад дороже, чем прочитать квитанцию, поскольку каждая попытка оплачивается отдельно и неудачная в этом смысле ничем не отличается от успешной. Разборы механики контрактов и переводов выходят в нашем Telegram-канале.
Обсуждение
Добавить комментарий