Ошибка транзакции Ethereum представляет собой причину, по которой узел отклонил или не выполнил вашу транзакцию. «Nonce too low» означает, что этот номер транзакции уже использован, поэтому обновите кошелёк. «Replacement transaction underpriced» означает, что ваше ускорение или отмена недостаточно подняли комиссию, поэтому поднимите её минимум на 10 процентов. «Intrinsic gas too low» означает, что gas limit ниже базовой стоимости транзакции, поэтому поднимите его (минимум для простого перевода 21 000). «Insufficient funds for gas * price + value» означает, что аккаунт не может покрыть сумму плюс максимальную комиссию, поэтому добавьте нативной монеты. «Execution reverted» означает, что контракт отказал вызову: это проблема входных данных, а не комиссии.
Ни один из отказов не стоит gas, потому что транзакция так и не попала в блок. Gas стоят только две ошибки, «out of gas» и «execution reverted» у транзакции, которая попала в блок: сеть выполнила работу, работа не удалась, и комиссия всё равно уплачена.
Сообщения короткие, треды на форумах о них длинные, и большинство из них заканчивается без ответа. В этом руководстве взяты точные строки, которые выдаёт ПО узла Ethereum: для каждой объясняется, что именно она проверяет, стоила ли вам чего-нибудь неудачная попытка, и даётся исправление для пользователя кошелька и для разработчика. Те же сообщения встречаются в Base, Arbitrum, Optimism, Polygon, BNB Smart Chain и любой другой EVM-сети, потому что у них общий код узла.
Коротко
- Два семейства ошибок. Отказы до попадания транзакции в блок (nonce, комиссии, средства, gas limit) ничего не стоят. Сбои после включения в блок (out of gas, execution reverted) стоят полной комиссии.
- Строки приходят из go-ethereum: nonce too low · replacement transaction underpriced · intrinsic gas too low · insufficient funds for gas * price + value это проверки самой транзакции, а не сети.
- У большинства из них исправление в одну строку: обновите кошелёк, поднимите комиссию минимум на 10 процентов, добавьте gas или пополните баланс нативной монеты.
- Dapp, который падает на этапе «estimate gas», сообщает, что вызов контракта завершился бы revert. Измените входные данные; повышение gas limit не поможет.
1. Откуда берутся эти сообщения об ошибках?
Почти каждый кошелёк, библиотека и RPC-провайдер передают дальше текст ошибки, который формирует go-ethereum, самый распространённый клиент Ethereum, а клиенты сетей Layer 2 используют те же строки. MetaMask оборачивает их в собственный диалог, ethers.js добавляет код вроде NONCE_EXPIRED или REPLACEMENT_UNDERPRICED, а RPC-провайдер возвращает их как ошибку JSON-RPC с кодом -32000. Под всем этим сообщение одно и то же.
Узел выполняет два разных набора проверок. Первый срабатывает при получении транзакции: верный ли nonce, приемлема ли комиссия, разумен ли gas limit, может ли отправитель заплатить. Транзакция, не прошедшая здесь, отбрасывается, и в цепочке ничего не записывается. Второй срабатывает при выполнении транзакции внутри блока: завершается ли код контракта в пределах gas limit без revert. Транзакция, не прошедшая здесь, всё равно попадает в блок со статусом Fail в обозревателе, и комиссия тратится.
Зная, к какому семейству относится ошибка, вы сразу понимаете две вещи: потеряли ли вы деньги и где искать исправление, на вашей стороне (транзакция) или на стороне контракта (входные данные).
2. Краткий справочник: все частые ошибки
Точные строки в том порядке, в котором вы вероятнее всего с ними столкнётесь. Формулировки взяты из исходного кода go-ethereum; кошельки иногда их сокращают.
| Сообщение об ошибке | Значение | Списан ли gas? | Исправление |
|---|---|---|---|
| nonce too low | Транзакция с этим nonce уже подтверждена | Нет | Обновите кошелёк; перед повторной отправкой проверьте обозреватель |
| nonce too high | Ещё не хватает транзакции с меньшим nonce, поэтому эта пока не может выполниться | Нет | Отправьте недостающий nonce или очистите его; после перезапуска локальной цепочки сбросьте dev-кошелёк |
| replacement transaction underpriced | Тот же nonce, что у ожидающей транзакции, а комиссия поднята недостаточно | Нет | Поднимите оба поля комиссии минимум на 10 процентов |
| transaction underpriced | Комиссия ниже минимума узла | Нет | Поднимите max fee и priority fee |
| insufficient funds for gas * price + value | Баланс не покрывает сумму плюс gas limit, умноженный на max fee | Нет | Добавьте нативной монеты (ETH, POL, BNB) или уменьшите сумму |
| intrinsic gas too low | Gas limit ниже фиксированной базовой стоимости транзакции | Нет | Поднимите gas limit; для простого перевода 21 000 |
| exceeds block gas limit / transaction gas limit too high | Gas limit больше, чем допускает блок, или выше потолка 16 777 216 | Нет | Уменьшите gas limit |
| max fee per gas less than block base fee | Ваш max fee ниже текущего base fee | Нет | Поднимите max fee или дождитесь снижения base fee |
| max priority fee per gas higher than max fee per gas | Tip выше общего потолка комиссии | Нет | Установите priority fee не выше max fee |
| already known | У узла уже есть ровно эта транзакция | Нет | Ничего; дождитесь подтверждения |
| invalid sender | Подпись не восстанавливается, обычно из-за несовпадения chain ID | Нет | Подписывайте с тем chain ID, который сообщает RPC |
| execution reverted | Код контракта отказал вызову | Только если транзакция попала в блок | Исправьте входные данные: allowance, проскальзывание, баланс, deadline |
| out of gas | Выполнение внутри блока вышло за gas limit | Да | Отправьте заново с более высоким gas limit |
3. Что означает «nonce too low»?
Каждый аккаунт нумерует свои транзакции с нуля, и каждый номер можно использовать один раз. «Nonce too low» означает, что только что отправленная транзакция несёт номер, который сеть уже подтвердила для этого аккаунта. Узел сравнивает nonce в вашей транзакции со следующим ожидаемым nonce аккаунта и отклоняет всё, что ниже.
Это случается, когда представление кошелька о следующем nonce устарело: с того же аккаунта отправили транзакцию из другого кошелька или с другого устройства, ускорение или отмена уже заняли этот номер, или локальную dev-цепочку перезапустили, счётчик аккаунта вернулся к нулю, а MetaMask продолжил считать дальше. На аппаратном кошельке ошибка появляется и тогда, когда транзакцию подписали дважды.
Исправление в том, чтобы дать кошельку пересинхронизироваться. Сначала найдите адрес в обозревателе: если то, что вы пытались сделать, уже прошло под этим nonce, не отправляйте заново. Если кошелёк продолжает предлагать устаревший номер, пункт «Delete activity and nonce data» (удалить данные об активности и nonce) в MetaMask (Settings, Developer tools) очищает локальный счётчик для текущей сети. MetaMask предупреждает, что действие необратимо, затрагивает только текущую сеть и не трогает баланс. В коде читайте следующий nonce перед подписью через eth_getTransactionCount с тегом «pending» вместо того, чтобы вести собственный счётчик.
4. Что означает «nonce too high»?
Разрыв в другую сторону. Nonce транзакции выше следующего ожидаемого значения аккаунта, поэтому образуется дыра: какой-то меньший номер ещё не подтверждён. Узлы держат такую транзакцию в очереди вместо того, чтобы выполнять её, а некоторые сразу отклоняют с этим сообщением.
Типичная причина: пакет транзакций, в котором одна из ранних была отброшена, или сброс локальной цепочки в обратную сторону (цепочку сбросили, а кошелёк нет, и кошелёк отправляет nonce 40 в цепочку, которая ждёт nonce 0). Закройте дыру, отправив недостающий nonce, или очистите данные об активности кошелька, как описано выше.
5. Что означает «replacement transaction underpriced»?
Вы попытались заменить ожидающую транзакцию (ускорить, отменить или просто отправить заново с тем же nonce), а новая платит недостаточно больше старой. Узел меняет ожидающую транзакцию на другую с тем же nonce, только если комиссия выросла на минимальный процент; в go-ethereum этот price bump по умолчанию равен 10 процентам и применяется и к max fee, и к priority fee.
Nonce верный; проблема в цене. Поднимите оба поля комиссии минимум на 10 процентов относительно ожидающей транзакции, а не относительно текущей ставки сети. Собственная рекомендация MetaMask для родственного диалога «transaction underpriced»: priority fee минимум на 10 процентов выше и max fee минимум на 30 процентов выше. Чтобы вместо этого отменить транзакцию, отправьте 0 ETH на собственный адрес с тем же nonce и поднятой комиссией, как описано в руководстве MetaMask по ошибкам. В обоих случаях замена получает новый хеш транзакции, а старая отбрасывается.
6. Что означает «transaction underpriced»?
Без слова «replacement» это обычная проверка цены: комиссия вашей транзакции ниже той, с которой узел готов держать её в своём пуле. Узлы задают минимальную цену gas, чтобы отсекать спам, и в загруженный период «низкая» оценка комиссии в кошельке может оказаться под этим минимумом. Родственное сообщение «transaction gas price below minimum» означает то же самое.
Поднимите max fee и priority fee и отправьте заново. В цепочке ничего не записано, поэтому зависшей транзакции, которую нужно было бы убрать, нет. Если вы видите эту ошибку в одной сети раз за разом, минимум этой сети выше, чем значение по умолчанию в вашем кошельке; страницы трекера газа по отдельным сетям показывают текущую ставку.
7. Что означает «insufficient funds for gas * price + value»?
Баланс отправителя в нативной монете должен покрывать отправляемую сумму плюс комиссию в худшем случае, то есть gas limit, умноженный на max fee per gas. Это правило записано в EIP-1559: подписант должен быть в состоянии оплатить gas_limit, умноженный на max_fee_per_gas, сверх суммы value. Узел сверяет это с максимумом, а не с тем, сколько транзакция будет стоить на самом деле, поэтому транзакция может не пройти проверку, даже если итоговая комиссия уместилась бы.
Три причины покрывают почти все случаи. У вас есть токены, но нет нативной монеты: для USDC в Base нужен ETH на gas, для USDT в Polygon нужен POL, для чего угодно в BNB Smart Chain нужен BNB. Вы отправляете весь баланс и не оставили ничего на комиссию: сначала вычтите максимальную комиссию. Или gas limit раздут вызовом контракта, и худший случай оказывается далеко выше реальной стоимости.
Исправление: пополните нативную монету, отправьте меньшую сумму или уменьшите max fee либо gas limit, если они завышены. Родственное сообщение «insufficient funds for transfer» означает, что баланс не покрывает даже одну сумму value, ещё до учёта gas.
8. Intrinsic gas too low, out of gas и ошибки gas limit
Четыре сообщения касаются gas limit, и срабатывают они в разные моменты. «Intrinsic gas too low» это отказ до включения в блок: у каждой транзакции есть фиксированная базовая стоимость ещё до выполнения какого-либо кода, 21 000 gas для простого перевода плюс плата за каждый байт данных, и ваш gas limit ниже неё. Документация ethereum.org по gas оценивает стандартный перевод в 21 000 единиц; перевод токена или вызов контракта требует больше. Поднимите лимит или позвольте кошельку или библиотеке оценить его.
«Out of gas» это версия после включения в блок. Лимит покрыл базовую стоимость, транзакция попала в блок, а затем коду контракта понадобилось больше, чем позволял лимит. EVM откатывает все изменения состояния, но, как говорит та же документация, весь предоставленный gas всё равно расходуется на выполненную работу. Комиссия потеряна, и транзакция отображается в обозревателе как неудачная. Отправьте заново с более высоким лимитом; кошельки обычно добавляют запас к оценке именно по этой причине.
«Exceeds block gas limit» означает, что заданный вами лимит больше, чем может вместить целый блок в этой сети. «Transaction gas limit too high» появилось позже: начиная с EIP-7825 одна транзакция не может запрашивать больше 16 777 216 gas (2 в степени 24), и транзакция выше этого потолка отклоняется. Оба исправляются уменьшением лимита; легитимной транзакции никогда не нужно ничего близкого к этим числам.
9. Ошибки max fee и priority fee
Начиная с EIP-1559 транзакция несёт два поля комиссии: max fee per gas, максимум, который вы заплатите за единицу, и max priority fee per gas, tip для валидатора. Протокол требует двух соотношений между ними и base fee блока, и у каждого своя ошибка.
«Max fee per gas less than block base fee»: ваш max fee ниже текущего base fee, поэтому транзакцию нельзя включить в блок ни с каким tip. Это настигает транзакции, подписанные в спокойный период и разосланные после роста base fee, и транзакции, собранные с жёстко заданной комиссией. Поднимите max fee или подождите: base fee меняется от блока к блоку, и транзакция снова станет действительной, если он опустится ниже вашего потолка.
«Max priority fee per gas higher than max fee per gas»: tip превышает общий потолок, что спецификация запрещает, потому что сначала заполняется base fee, а tip может взяться только из остатка. Установите priority fee не выше max fee. У правильно собранной транзакции max fee равен примерно удвоенному base fee плюс tip, что оставляет base fee место для роста, пока транзакция ждёт.
10. Что означает «execution reverted»?
Контракт, который вы вызвали, намеренно остановил выполнение. Операторы require, revert и assert в Solidity заканчиваются этим сообщением, часто с собственной строкой причины от контракта: «ERC20: transfer amount exceeds allowance», «UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT», «Pausable: paused» и так далее. Когда причина пустая, вы видите только «execution reverted» или сырые данные ошибки.
Чаще всего вы видите её до отправки, потому что кошелёк прогоняет вызов через eth_estimateGas и симуляция завершается revert; MetaMask тогда сообщает, что не может оценить gas. Это дешёвая версия: ничего не отправлено. Дорогая версия это транзакция, которая прошла симуляцию, попала в блок и откатилась в цепочке, потому что состояние успело измениться (цена свопа ушла за ваше проскальзывание, кто-то другой купил последний предмет, истёк deadline). В обозревателе она показывается как Fail, и комиссия уплачена.
Исправление никогда не в более высоком gas limit. Прочитайте строку причины, затем измените входные данные: сначала выдайте approve на токен, расширьте проскальзывание или уменьшите сумму, проверьте, что контракт не на паузе, и убедитесь, что вы в той сети, где живёт контракт. Страница транзакции в обозревателе показывает причину revert для неудачных транзакций в блоке; руководство по Etherscan показывает, где её найти.
11. Already known, invalid sender и oversized data
«Already known» в практическом смысле вовсе не ошибка. У узла уже есть ровно та транзакция, которую вы отправили, обычно потому, что библиотека повторила broadcast или два кошелька отправили одни и те же подписанные байты. Дождитесь подтверждения оригинала.
«Invalid sender» означает, что узел не смог восстановить из подписи действительного подписанта. Начиная с EIP-155 chain ID входит в подписываемые данные, поэтому транзакция, подписанная для цепочки 1 и отправленная в цепочку 137, восстанавливается в мусор и отклоняется. Сверьте chain ID в конфигурации подписи с тем, что сообщает RPC-эндпоинт; список chain ID покрывает и сами номера, и случай несовпадения.
«Oversized data» означает, что размер транзакции в байтах больше того, что узел принимает в свой пул; это бывает только с очень большими деплоями контрактов или calldata. Разбейте данные или разверните контракт через фабрику.
12. Стоит ли неудачная транзакция gas?
Зависит от того, где она не прошла. Всё из первого семейства этого руководства (nonce, underpriced, insufficient funds, intrinsic gas, потолок комиссии, already known, invalid sender, oversized data) это отказ: узел отбросил транзакцию, ни один блок её не содержит, поэтому комиссия не списана, а в обозревателе нечего искать. Повторная отправка ничего дополнительно не стоит.
«Out of gas» и «execution reverted» у транзакции в блоке это второе семейство: транзакция лежит в блоке со статусом Fail, валидатор выполнил работу, и комиссия уплачена полностью. Документация ethereum.org прямо говорит, что комиссия уплачивается независимо от того, успешна транзакция или нет. Все ETH или токены, которые вы пытались переместить, остаются на месте; теряется только комиссия.
13. Как избежать этих ошибок в коде
Четыре привычки убирают большую часть этого списка из отправляющего сервиса: читайте pending nonce с узла вместо того, чтобы вести счётчик, берите оценки комиссии с узла той сети, в которой вы находитесь, оценивайте gas перед подписью и добавляйте запас, и проверяйте баланс против суммы плюс комиссии в худшем случае перед broadcast. SDK ChainGate делает все четыре внутри transfer() и выносит единственный случай, который нужно обработать самостоятельно, в типизированную ошибку:
import { ChainGate, importWallet, NotEnoughFundsError } from 'chaingate';
const cg = new ChainGate({ apiKey: process.env.CHAINGATE_API_KEY });
const wallet = importWallet({ phrase: process.env.MNEMONIC });
const eth = cg.connect(cg.networks.ethereum, wallet);
try {
// Nonce, gas limit and EIP-1559 fees are read from the node for you
const tx = await eth.transfer(cg.networks.ethereum.amount('0.05'), '0x...');
tx.setFee(tx.recommendedFees().normal);
if (!tx.enoughFunds()) {
// amount + worst-case fee exceeds the balance: nothing is broadcast
console.log('short by', tx.missingFunds());
return;
}
const sent = await tx.signAndBroadcast();
console.log(sent.transactionId);
} catch (err) {
if (err instanceof NotEnoughFundsError) {
console.error('Not enough ETH for amount + fee');
}
throw err;
}Руководство по отправке криптовалюты на JavaScript показывает полный процесс для Ethereum и UTXO-цепочек, а документация по transfer перечисляет уровни комиссии и поле missingFunds, которое говорит, сколько именно нативной монеты не хватает.
14. Куда дальше
Большинство этих ошибок связано с комиссиями, поэтому следующая страница для чтения о том, что такое gas fees и как сочетаются max fee, priority fee и base fee, а затем трекер газа с текущими ставками в каждой сети. Если транзакция всё же ушла и нужно узнать, что с ней случилось, руководство по хешу транзакции показывает, как её найти. А если нужна TypeScript-библиотека, которая берёт на себя nonce, комиссии и проверку баланса в Ethereum, EVM Layer 2 и Bitcoin, ChainGate и есть SDK, на котором работает этот сайт.
Частые вопросы
Что означает «nonce too low» в MetaMask?
Номер транзакции, который попытался использовать MetaMask, уже подтверждён для этого аккаунта, обычно потому, что его раньше заняли другой кошелёк, другое устройство или ускорение, или была сброшена локальная цепочка. Проверьте в обозревателе, прошло ли действие, затем очистите в MetaMask данные об активности и nonce для этой сети, чтобы он пересинхронизировался.
Как исправить «replacement transaction underpriced»?
Поднимите и max fee, и priority fee замещающей транзакции минимум на 10 процентов относительно той, которую она заменяет; минимальный bump по умолчанию в go-ethereum равен 10 процентам. Чтобы отменить, а не ускорить, отправьте 0 ETH самому себе с тем же nonce и более высокой комиссией.
Что означает «intrinsic gas too low»?
Gas limit транзакции ниже её фиксированной базовой стоимости, которая составляет 21 000 gas для простого перевода ETH и больше для переводов токенов и вызовов контрактов. Поднимите gas limit или позвольте кошельку оценить его. Транзакция отклонена до включения в блок, поэтому комиссия не списана.
Что означает «insufficient funds for gas * price + value»?
Баланс нативной монеты аккаунта не покрывает отправляемую сумму плюс gas limit, умноженный на max fee per gas. Держать токены недостаточно: gas оплачивается в ETH в Ethereum и Base, в POL в Polygon, в BNB в BNB Smart Chain. Пополните нативную монету или отправьте меньше.
Стоит ли «execution reverted» gas?
Только если транзакция попала в блок. Когда кошелёк сообщает об этом при оценке gas, ничего не отправлено и ничего не списано. Когда откатывается транзакция, уже попавшая в блок, комиссия уплачена полностью, и обозреватель показывает статус Fail.
Почему моя транзакция падает с «out of gas», хотя я задал gas limit?
Лимита хватило, чтобы транзакцию приняли, но не хватило коду контракта, который выполнялся. EVM откатывает изменения и расходует весь предоставленный gas, поэтому комиссия потрачена. Отправьте заново с более высоким лимитом; оценка из eth_estimateGas плюс запас позволяет этого избежать.
Что означает «max fee per gas less than block base fee»?
Max fee транзакции ниже текущего base fee, поэтому ни один блок не может её включить. Поднимите max fee или дождитесь, пока base fee опустится ниже вашего потолка. Обычно это случается, когда транзакцию подписали раньше с жёстко заданной комиссией.
Стоит ли чего-нибудь отклонённая транзакция?
Нет. Отказы вроде nonce too low, transaction underpriced, insufficient funds или intrinsic gas too low происходят до попадания транзакции в блок, поэтому комиссия не списывается и в обозревателе ничего не появляется. Комиссии стоят только транзакции в блоке, у которых закончился gas или которые откатились.
Одинаковы ли эти ошибки в Base, Arbitrum, Polygon и BNB Smart Chain?
Да. Эти сети работают на EVM-клиентах, произошедших от того же кода, поэтому сообщения, правила nonce и проверки комиссий одни и те же. Отличаются суммы: gas оплачивается в нативной монете каждой сети, а минимальные комиссии намного ниже, чем в основной сети Ethereum.
Создавай с ChainGate
Превращай идеи в код — ChainGate даёт кошельки, транзакции и управляемый RPC для Ethereum и 20+ блокчейнов в одной библиотеке.