Перейти к содержанию

Как исправить «replacement transaction underpriced»

Эта ошибка RPC означает, что транзакция того же отправителя с тем же nonce не выполнила правило узла по повышению комиссии. Узнайте, как безопасно проверить, ускорить или отменить её.

Обновлено

Только для образовательных целей; это не финансовая рекомендация и не совет по безопасности. Замена или отмена может выполнить нежелательную транзакцию, а сетевые комиссии необратимы.

Краткий ответ

replacement transaction underpriced — это отказ RPC или пула транзакций, а не откат контракта EVM. Обычно узел уже знает транзакцию того же отправителя с тем же nonce, но новая транзакция недостаточно повышает нужные поля комиссии для его политики замены.

Сначала проверьте сеть, отправителя, nonce и состояние всех известных хешей. Если исходная транзакция ещё ожидает и её нужно заменить, используйте точно тот же nonce и повысьте комиссии по правилам кошелька или узла. Увеличение только gasLimit, изменение проскальзывания или повторная отправка той же подписанной транзакции правило не выполняют.

Как это работает

  1. Nonce определяет позицию. Транзакции внешнего аккаунта используют последовательные nonce. Если у узла уже есть транзакция отправителя с этим nonce, другая на той же позиции считается кандидатом на замену. Более поздний nonce может ждать, пока предыдущие не будут включены или иначе разрешены.
  2. Замена — локальная политика пула. Консенсус Ethereum не задаёт единого процента. Клиенты, RPC-провайдеры и приватные ретрансляторы могут иметь другие правила или видеть разные ожидающие транзакции. Legacy pool Geth сейчас использует 10% по умолчанию, но настройка изменяема и не обязательна для других клиентов.
  3. EIP-1559 имеет два лимита. maxPriorityFeePerGas ограничивает чаевые, а maxFeePerGas — всю цену за gas с базовой комиссией. В legacy pool Geth новые fee cap и tip cap должны быть выше старых и настроенного порога. Кошелёк должен рассчитывать оба.
  4. Принятие пулом не является подтверждением. Один узел может принять замену, пока другие хранят оригинал. В каноническую последовательность попадёт только одна транзакция отправителя с этим nonce. Первая включённая допустимая кандидатура делает остальные непригодными в этой сети, хотя интерфейс обновится позже.
  5. Лимит и уплаченная сумма различаются. Эффективная цена EIP-1559 ограничена fee cap, а неиспользованный gas не оплачивается. Повышение maxFeePerGas увеличивает максимальный риск, но не обязательно итоговую цену; высокий лимит может быть уплачен, если этого требуют базовая комиссия и чаевые.

Порядок решения и пример

Пусть nonce равен 42, maxFeePerGas = 30 gwei, а maxPriorityFeePerGas = 2 gwei. Узел с требованием 10% может отклонить 31 gwei и 2.1 gwei; 35 gwei и 2.5 gwei превышают эти примерные пороги. Транзакция всё равно может ждать, если базовая комиссия оставляет слишком малые чаевые под fee cap 35 gwei. Процент — пример, а не гарантия сети.

Действуйте по порядку:

  1. Проверьте сеть и отправителя. Запросите исходный и все заменяющие хеши в кошельке и через независимый RPC или обозреватель.
  2. Сравните подтверждённый счётчик с представлением pending. Если nonce 42 подтверждён, не создавайте другую транзакцию, считая его открытым.
  3. Декодируйте to, value и data. Для ускорения сохраните операцию и nonce. Для отмены кошельки часто отправляют 0 ETH самому отправителю с тем же nonce; это конкурирующая замена, а не отзыв на уровне протокола.
  4. По возможности используйте функцию кошелька. Иначе узнайте текущую политику и оценку комиссии, увеличьте оба лимита EIP-1559 с запасом на округление и проверьте покрытие value + gasLimit x maxFeePerGas.
  5. Перепроверьте всё до подписи. Отправьте один раз, сохраните каждый хеш и следите за квитанциями всех кандидатов. У pending-хеша нет квитанции; квитанция в правильной сети и блоке подтверждает выполнение.

Риски

  • Отмена не гарантирована. Исходная транзакция может попасть в блок раньше, а приватная или плохо распространённая транзакция может быть невидима вашему RPC.
  • Неверный nonce может создать новый платёж или вызов. Повторная подпись устаревших calldata может выполнить операцию с изменившимися ценой, allowance, сроком или состоянием.
  • Один endpoint может принять замену, другой — отклонить. Частая смена RPC оставляет кандидатов в разных пулах и запутывает интерфейс кошелька.
  • Повышение gasLimit не улучшает приоритет. Слепое повышение лимитов увеличивает максимальные затраты; изменение проскальзывания или calldata меняет выполнение, но не правило пула.
  • Blob-транзакции, user operations абстракции аккаунта, L2 и приватные ретрансляторы могут использовать другие пулы и правила. Обычная политика EVM Geth к ним автоматически не применяется.

Остановитесь, если отправитель или nonce незнакомы, calldata не декодируются, транзакция могла подтвердиться, кошелёк предлагает другого получателя или сумму либо RPC просит seed-фразу или приватный ключ. Настоящее устранение ошибки не требует секретов восстановления.

Распространённые заблуждения

  • «На аккаунте мало средств.» Это другая ошибка. Данное сообщение касается конкурирующей транзакции и цены замены.
  • «Повышение на 10% всегда работает.» Это частое значение Geth, не правило консенсуса. Настройка, клиент, тип и округление могут требовать больше.
  • «Более дорогая транзакция заменила исходную везде.» Пулы локальны. Принятие одним RPC не удаляет оригинал из всех пулов и не гарантирует порядок.
  • «Отмена возвращает подтверждённую транзакцию.» Нет. Она конкурирует лишь пока nonce не разрешён; подтверждённое изменение требует прикладного средства, если оно существует.

Похожие темы

Источники

Навигация

Поиск по вики...