Fehler: Ersatzgeschäft unterbewertet

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

Versuchen Sie, Ihren Gaspreis zu erhöhen. Bitte teilen Sie mir das Ergebnis mit
Ich steigere bereits 40%

Antworten (5)

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:

  1. Hinzufügen eines Gaspreises, der um 10% höher ist als der Gaspreis der bestehenden nicht abgebauten Transaktion.
  2. Erhöhen Sie Ihre Nonce um eins höher als die ungeminte Transaktion.

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.

also, wenn ich 2. Option tun sollte: nonce = web3.eth.getTransactionCount() + 1 ?
Ich habe das gleiche Problem, ich codiere nicht, aber in einer Transaktion versuche ich, myetherwallet einzusenden. Ich denke, das Erhöhen der Nonce wird es lösen, aber wie mache ich das, wenn ich meine Transaktion über Metamask sende?
Wenn ich also eine nicht abgebaute Transaktion herumliegen habe, verschwindet sie dann jemals? Ich möchte mich nicht selbst mit der Nonce herumschlagen müssen!
Warum denkt das Netzwerk, dass die Transaktion neu ist? vergleicht es nicht die Daten und sieht, dass es anders ist?
Gibt es eine andere Möglichkeit, die ungeminte Transaktion in Quorum zu ersetzen, da der Gaspreis in Quorum immer 0 ist.
Dieser Fehler wird beim Ersetzen der Nonce auch bei einem Gaspreis von ~ +30% ausgelöst

Definieren Sie das Ziel

Möchten Sie:

  1. Senden Sie eine neue Transaktion, nachdem alle Ihre vorherigen Transaktionen abgeschlossen sind, oder ...
  2. Ersetzen Sie eine ausstehende (nicht abgebaute) Transaktion durch die neue Rohtransaktion.

Senden Sie eine neue Transaktion

Die Fehlermeldung impliziert, dass Sie versuchen, eine ausstehende Transaktion zu ersetzen. Das liegt daran, dass die Rohtransaktion, die Sie zu senden versuchen, mit nonceeiner 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().

Ersetzen Sie eine ausstehende Transaktion

Das 10%-Mindest

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.gasPricekann 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.

Bestimmung des Minimums

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.

Woher weiß metamask im Voraus die erforderliche Gaspreiserhöhung? Ich versuche es mit + 30% und es wird sofort mit dem Fehler "Ersatztransaktion unterbewertet" abgelehnt
@challet Woher bekommen Sie den Gaspreis der ausstehenden Transaktion? Meine Vermutung ist, dass Sie nicht wirklich 30 % mehr als die ausstehende Transaktion hinzufügen. Beispielsweise könnten Sie 30 % des aktuell geschätzten Preises für eine neue Transaktion erhöhen.

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 awaitoder ein zweites Mal im Erfolgs-Callback aufgerufen habe.

Meine Vermutung ist, dass Vertragsmethoden in web3js nicht threadsicher sind.

Überprüfen Sie Ihren Gaspreis. Sogar ich habe den Gaspreis eingerichtet, aber irgendwie auch den richtigen Gaspreis angewendet. Eines der folgenden Beispiel-Screenshots.Geben Sie hier die Bildbeschreibung ein

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:

  1. Navigieren Sie in MetaMask zu Einstellungen/Erweitert und klicken Sie auf Konto zurücksetzen.
  2. Starten Sie Ihren Browser neu.

Wenn das nicht hilft, versuchen Sie, MetaMask neu zu installieren.