Ich versuche, eine Rohtransaktion mit web3 an ropsten testnet zu senden, und erhalte diesen Fehler:
Ersatzgeschäft unterbewertet
wo manchmal mein tx funktioniert und manchmal bekomme ich diesen Fehler.
meine tx parameter:
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
Hinweis Ich füge bereits 40 % zu gasPrice hinzu
Ich bin auch auf dieses Problem gestoßen. Das Netzwerk geht davon aus, dass Sie versuchen, eine bestehende, nicht abgebaute Transaktion zu ersetzen. Es gibt zwei Möglichkeiten, dies zu vermeiden:
Ich habe auch diesen Fehler erhalten:
"Transaktion wurde nicht innerhalb von 50 Blöcken abgebaut, bitte stellen Sie sicher, dass Ihre Transaktion ordnungsgemäß gesendet wurde. Beachten Sie, dass sie möglicherweise noch abgebaut wird!"
In meinem Fall glaube ich, dass die Transaktion irgendwie in der Schwebe bleibt. Es wird von niemandem abgebaut, aber es wird nicht aus dem Pool der nicht abgebauten Transaktionen entfernt. Denken Sie daran, dass web3.eth.getTransactionCount(walletAddress)
Sie nur die letzte BESTÄTIGTE Nonce erhalten. Die nicht abgebauten werden also nicht berücksichtigt.
Möchten Sie:
Die Fehlermeldung impliziert, dass Sie versuchen, eine ausstehende Transaktion zu ersetzen. Das liegt daran, dass die Rohtransaktion, die Sie zu senden versuchen, mit nonce
einer anderen Transaktion identisch ist, die Sie ausstehend haben.
Da das Ersetzen einer Transaktion nicht Ihr Ziel ist, erhöhen Sie einfach die Nonce um eins höher als Ihre letzte ausstehende Transaktion. Möglicherweise müssen Sie dies intern nachverfolgen, anstatt sich auf zu verlassen web3.eth.getTransactionCount()
.
Da es Ihr Ziel ist, eine ausstehende Transaktion zu ersetzen, müssen Sie versuchen, die Miner davon zu überzeugen, Ihre neue Transaktion zu verwenden. Dazu müssen Sie einen Gaspreis verwenden, der 10 % höher* ist als der gasPrice
der ausstehenden Transaktion .
const gasPrice = web3.eth.gasPrice.toNumber() * 1.40
Hinweis Ich füge bereits 40 % zu gasPrice hinzu
Der zitierte Code fügt 40 % zu hinzu web3.eth.gasPrice
. Dieser darf nicht 10 % höher sein als der Gaspreis der schwebenden Transaktion. web3.eth.gasPrice
kann im Laufe der Zeit variieren und/oder Sie haben möglicherweise einen beliebigen Gaspreis für die ausstehende Transaktion festgelegt.
* 10 % sind im Protokoll nicht definiert, es ist nur die Art und Weise, wie die meisten Nodes und Miner es implementieren.
Wenn Sie den Hash der ausstehenden Transaktion haben, können Sie den erforderlichen Gaspreis mit etwas wie:
replacement_price = web3.eth.getTransaction(pending_txn_hash).gasPrice * 1.101
Beachten Sie, dass dies Fließkomma-Mathematik ist, die Rundungsfehler haben wird, also habe ich ein zusätzliches Zehntelprozent hineingeworfen, um sicherzugehen, dass es über dem Minimum liegt.
Ich habe dies gesehen, als ich dieselbe Vertragsmethode zweimal von JavaScript aus aufgerufen habe, ohne darauf zu warten, dass der erste Aufruf abgeschlossen ist, indem ich entweder await
oder ein zweites Mal im Erfolgs-Callback aufgerufen habe.
Meine Vermutung ist, dass Vertragsmethoden in web3js nicht threadsicher sind.
Ich verwende Ganache und MetaMask hörte plötzlich auf, Transaktionen zu verarbeiten, es stellte die erste in die Warteschlange und jeder nachfolgende Anruf gab entweder nichts oder "Transaktion unterbewertet" zurück. So lösen Sie es:
Wenn das nicht hilft, versuchen Sie, MetaMask neu zu installieren.
Aniket
Ernane Luis