Я пытаюсь отправить необработанную транзакцию с помощью 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% к цене газа.
Я тоже столкнулся с этой проблемой. Сеть думает, что вы пытаетесь заменить существующую незаминированную транзакцию. Есть два способа избежать этого:
Я также получаю эту ошибку:
«Транзакция не была добыта в пределах 50 блоков, пожалуйста, убедитесь, что ваша транзакция была отправлена правильно. Имейте в виду, что она все еще может быть добыта!»
В моем случае я думаю, что транзакция каким-то образом застревает в подвешенном состоянии. Он никем не майнится, но и не удаляется из пула немайнинговых транзакций. Имейте в виду, что web3.eth.getTransactionCount(walletAddress)
вы получите только последний ПОДТВЕРЖДЕННЫЙ одноразовый номер. Таким образом, он не будет принимать во внимание незаминированные.
Вы хотите:
Сообщение об ошибке подразумевает, что вы пытаетесь заменить ожидающую транзакцию. Это потому, что необработанная транзакция, которую вы пытаетесь отправить, аналогична nonce
другой транзакции, которую вы ожидаете.
Поскольку замена транзакции не является вашей целью, просто увеличьте одноразовый номер на единицу больше, чем ваша последняя ожидающая транзакция. Возможно, вам придется отслеживать это внутренне, а не полагаться на файлы web3.eth.getTransactionCount()
.
Поскольку ваша цель — заменить ожидающую транзакцию, вы должны попытаться убедить майнеров использовать вашу новую транзакцию. Для этого вы должны использовать цену газа, которая на 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 процентов, чтобы убедиться, что это больше минимума.
Я видел это, когда дважды вызывал один и тот же метод контракта из JavaScript, не дожидаясь завершения первого вызова await
или вызывая второй раз в обратном вызове успеха.
Я предполагаю, что методы контракта в web3js не являются потокобезопасными.
Я использую Ganache, и MetaMask внезапно перестал обрабатывать транзакции, он поставил первую в очередь, и каждый последующий вызов либо ничего не возвращал, либо «транзакция занижена». Вот как это решить:
Если это не поможет, попробуйте переустановить MetaMask.
Аникет
Эрнан Луис