ошибка: замещающая транзакция занижена

Я пытаюсь отправить необработанную транзакцию с помощью web3 в тестовую сеть ropsten, и я получаю эту ошибку:

замещающая сделка по заниженной цене

где иногда мой tx работает, а иногда я получаю эту ошибку.

мои параметры передачи:

const nonce = web3.eth.getTransactionCount(ethereumConfig.contract.account)
const block = web3.eth.getBlock("latest")
const gasLimit = block.gasLimit
const gasPrice = web3.eth.gasPrice.toNumber() * 1.40 

обратите внимание, что я уже добавляю 40% к цене газа.

Попробуйте поднять цену на газ. Пожалуйста, дайте мне знать результат
Я уже увеличиваю 40%

Ответы (5)

Я тоже столкнулся с этой проблемой. Сеть думает, что вы пытаетесь заменить существующую незаминированную транзакцию. Есть два способа избежать этого:

  1. Добавление цены на газ на 10 % выше, чем цена на газ в существующей незаминированной транзакции.
  2. Увеличьте свой одноразовый номер на единицу выше, чем у незаминированной транзакции.

Я также получаю эту ошибку:

«Транзакция не была добыта в пределах 50 блоков, пожалуйста, убедитесь, что ваша транзакция была отправлена ​​правильно. Имейте в виду, что она все еще может быть добыта!»

В моем случае я думаю, что транзакция каким-то образом застревает в подвешенном состоянии. Он никем не майнится, но и не удаляется из пула немайнинговых транзакций. Имейте в виду, что web3.eth.getTransactionCount(walletAddress)вы получите только последний ПОДТВЕРЖДЕННЫЙ одноразовый номер. Таким образом, он не будет принимать во внимание незаминированные.

так что, если я делаю 2. должен делать вариант: nonce = web3.eth.getTransactionCount() + 1 ?
У меня та же проблема, не кодирование, а транзакция, которую я пытаюсь отправить в myetherwallet. Я думаю, что увеличение одноразового номера решит эту проблему, но как мне это сделать, если я отправляю свою транзакцию через Metamask?
Итак, если у меня есть незаминированная транзакция, исчезнет ли она когда-нибудь? Я не хочу возиться с одноразовым номером сам!
Почему сеть считает транзакцию новой? Разве он не сравнивает данные и не видит, что они разные?
Есть ли другой способ заменить незаминированную транзакцию в Quorum, так как цена газа всегда равна 0 в Quorum.
Эта ошибка возникает при замене одноразового номера, даже при цене газа ~ +30%

Определите цель

Вы хотите:

  1. Отправьте новую транзакцию после завершения всех ваших предыдущих транзакций или...
  2. Замените ожидающую (незаминированную) транзакцию новой необработанной транзакцией.

Отправить новую транзакцию

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

Поскольку замена транзакции не является вашей целью, просто увеличьте одноразовый номер на единицу больше, чем ваша последняя ожидающая транзакция. Возможно, вам придется отслеживать это внутренне, а не полагаться на файлы web3.eth.getTransactionCount().

Заменить ожидающую транзакцию

Минимум 10%

Поскольку ваша цель — заменить ожидающую транзакцию, вы должны попытаться убедить майнеров использовать вашу новую транзакцию. Для этого вы должны использовать цену газа, которая на 10 % выше* цены gasPrice незавершенной транзакции .

const gasPrice = web3.eth.gasPrice.toNumber() * 1.40 

обратите внимание, что я уже добавляю 40% к цене газа.

Приведенный код добавляет 40% к web3.eth.gasPrice. Это не может быть на 10% выше, чем цена газа в незавершенной транзакции. web3.eth.gasPriceможет изменяться со временем, и/или вы могли установить любую произвольную цену на газ для ожидающей транзакции.

* 10% не определено в протоколе, это просто то, как его реализуют большинство узлов и майнеров.

Определение минимума

Если у вас есть хэш незавершенной транзакции, вы можете определить требуемую цену газа примерно так:

replacement_price = web3.eth.getTransaction(pending_txn_hash).gasPrice * 1.101

Обратите внимание, что это математика с плавающей запятой, которая будет иметь ошибки округления, поэтому я добавил дополнительные 10 процентов, чтобы убедиться, что это больше минимума.

Как метамаск заранее узнает необходимое повышение цены на газ? Пробую с +30% и тут же отклоняется с ошибкой "замена транзакции по заниженной цене"
@challet Откуда вы берете цену газа для незавершенной транзакции? Я предполагаю, что на самом деле вы не добавляете на 30% больше, чем ожидающая транзакция. Например, вы можете увеличить 30 % от текущей оценочной цены за новую транзакцию.

Я видел это, когда дважды вызывал один и тот же метод контракта из JavaScript, не дожидаясь завершения первого вызова awaitили вызывая второй раз в обратном вызове успеха.

Я предполагаю, что методы контракта в web3js не являются потокобезопасными.

Дважды проверьте цену на газ. Даже я также установил цену на газ, но каким-то образом применил правильную цену на газ. Один из примеров ниже скриншот.введите описание изображения здесь

Я использую Ganache, и MetaMask внезапно перестал обрабатывать транзакции, он поставил первую в очередь, и каждый последующий вызов либо ничего не возвращал, либо «транзакция занижена». Вот как это решить:

  1. В MetaMask перейдите в «Настройки/Дополнительно» и нажмите «Сбросить учетную запись».
  2. Перезапустите браузер.

Если это не поможет, попробуйте переустановить MetaMask.