Ich habe ein kleines privates Netzwerk, das über eine Proof-of-Authority-Engine verfügt, die geth-clique
mithilfe von erstellt Geth Version: 1.8.3-unstable
wurde. Derzeit gibt es drei Unterzeichnerknoten und zwei weitere Nicht-Unterzeichnerknoten (nennen wir sie peer-A
und peer-B
). peer-A
und peer-B
sind mit drei Unterzeichnerknoten verbunden.
Zuerst habe ich eine Transaktion mit einem sehr niedrigen gasPrice
Wert wie 200 gesendet, peer-A
wie 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-A
selbst mit einem größeren gasPrice
Wert, 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 gasPrice
Sperren andere sperrt.
Beispiel: (Zuerst peer-A
und peer-B
sendete einen Tx mit niedrigem gasPrice
und später ihren anderen Tx mit hohem gasPrice, der in ihrem Pending-Zustand hängen blieb.)
Ich habe diese Situation behoben, indem ich mein chaindata
on 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 low
oderError: 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 gasPrice
Wert und resend()
sie aktualisieren?
Github-Problem: https://github.com/ethereum/go-ethereum/issues/16284
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 gasLimit
als 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.rlp
Datei ( 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
Einen effizienten Algorithmus in Bezug auf das allgemeinere Problem von Nonce Singleton finden Sie in dieser Frage und ihren Antworten.
Alper
Linmao-Lied
Alper
Error: intrinsic gas too low
oderError: replacement transaction underpriced error.
@Linmao SongLinmao-Lied
Alper
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