Eine Transaktion mit niedrigem gasPrice lässt alle anderen Transaktionen im Wartezustand hängen

Ich habe ein kleines privates Netzwerk, das über eine Proof-of-Authority-Engine verfügt, die geth-cliquemithilfe von erstellt Geth Version: 1.8.3-unstablewurde. Derzeit gibt es drei Unterzeichnerknoten und zwei weitere Nicht-Unterzeichnerknoten (nennen wir sie peer-Aund peer-B). peer-Aund peer-Bsind mit drei Unterzeichnerknoten verbunden.

Zuerst habe ich eine Transaktion mit einem sehr niedrigen gasPriceWert wie 200 gesendet, peer-Awie unten gezeigt.

eth.sendTransaction({from:eth.accounts[0], to:eth.accounts[1], value: web3.toWei(0,0000, "ether"), gasPrice: 200})

Später, wenn ich mehr Transaktionen weitergeschickt habe, peer-Aselbst mit einem größeren gasPriceWert, bleiben alle diese Transaktionen im ausstehenden Zustand. Soweit ich weiß, funktionieren eingereichte Transaktionen als FIFO-Warteschlange und meine anstehenden Transaktionen stecken fest, da die erste Sendetransaktion mit sehr niedrigen gasPriceSperren andere sperrt.

Beispiel: (Zuerst peer-Aund peer-Bsendete einen Tx mit niedrigem gasPriceund später ihren anderen Tx mit hohem gasPrice, der in ihrem Pending-Zustand hängen blieb.)Geben Sie hier die Bildbeschreibung ein

Ich habe diese Situation behoben, indem ich mein chaindataon bereinigt habe peer-A, was auch alle ausstehenden Transaktionen bereinigt: rm -rf private/geth, und später sende ich meine Transaktionen mit größeren gasPrice. Ich nehme an, dies war eine sehr ineffiziente Lösung für Netzwerke mit einer großen Kette.

Also werden alle gesendeten Transaktionen als FIFO-Queue bereitgestellt? Warum wählten sie nicht danach aus, welche die höchste hat gasPrice?

Bitte beachten Sie, dass ich versucht habe:

eth.resend(eth.pendingTransactions[0], web3.toWei(1000, 'gwei'))

aber mit folgendem Fehler konfrontiert:

Error: intrinsic gas too lowoderError: replacement transaction underpriced error.

[F] Wie könnte ich dieses Problem lösen, wie könnte ich die ausstehende Transaktion auf dem System entfernen, die einen niedrigen Gaspreis hat, oder sie ablehnen oder ihren gasPriceWert und resend()sie aktualisieren?

Github-Problem: https://github.com/ethereum/go-ethereum/issues/16284

Antworten (2)

Die Antwort von Péter Szilágyi auf ( https://github.com/ethereum/go-ethereum/issues/16284 ) hilft mir, das Problem zu lösen.

Jedes Konto und jede Transaktion in Ethereum hat eine Nonce. Es kann immer nur die Transaktion mit der richtigen Nonce ausgeführt werden. Wenn Sie eine Transaktion mit einem niedrigen Gaspreis einreichen, werden alle nachfolgenden Transaktionen blockiert, da sie nicht einmalig ausführbar sind, nur die nächste Nonce ist ausführbar.

Sie müssen Ihren Kettendatenordner nicht löschen, ausstehende Transaktionen werden dort nicht gespeichert. Es gibt eine Transactions.rlp-Datei, die die lokalen Transaktionen speichert.

Ich habe eth.resend()mit zwei Parametern gearbeitet.

=> Hinzufügen gasLimitals dritter Parameter hat es gelöst, Beispiel:

eth.resend(eth.pendingTransactions[0], web3.toWei(20, 'gwei'), 2000000)

=> Oder stoppen Sie den Knoten, entfernen Sie die transactions.rlpDatei ( rm ~/examplePOA/private/geth/transactions.rlp) und starten Sie neu.

Eine einfachere Lösung (im Vergleich zum Zurücksetzen der Kette) besteht darin, eine Ersatztransaktion zu senden

  • hat dasselbe Konto (weitere Informationen hier ) wie die ausstehende Low-Gas-Transaktion
  • bietet höheren Gaspreis

Einen effizienten Algorithmus in Bezug auf das allgemeinere Problem von Nonce Singleton finden Sie in dieser Frage und ihren Antworten.

Ich habe versucht, einen höheren Gaspreis anzubieten, indem ich folgte ( ethereum.stackexchange.com/a/18154/4575 ), aber ich bin auf einige Fehler gestoßen. @Linmao-Lied
Gibt es Fehler aus dem web3- oder Geth/Parity-Protokoll für die Ersatztransaktion?
Ich habe Error: intrinsic gas too lowoder Error: replacement transaction underpriced error.@Linmao Song
Könnte es sein, dass der Gaspreis des Ersatzgeschäfts noch zu niedrig ist? Wie verhält sich der neue Gaspreis zum alten Preis, auch zum durchschnittlichen Gaspreis (zB web3.eth.gasPrice)?
web3.eth.gasPrice is 18000000000, habe ich versucht: eth.resend(eth.pendingTransactions[0], web3.toWei(1000, 'gwei'))aber immer noch der gleiche Fehler. @Linmao-Lied