Abbrechen/Überschreiben einer ausstehenden Transaktion mit geth JSON RPC

Dies ist ein privates Netzwerk

Es wurde eine Transaktion gesendet, um mithilfe des eth_sendTransactionRPC-Aufrufs einen Vertrag zu erstellen.

Die Transaktion wird „entfernt“ und mit „wird entfernt“ markiert, weil ihr das Gas ausgegangen ist, sie aber im pendingZustand bleibt und die Miner weiterhin versuchen, sie zu verarbeiten.

1- Gibt es eine Möglichkeit, eine ausstehende Transaktion zu stornieren?

Gemäß der sendTransaction Dokumentation ermöglicht das erneute Senden einer Transaktion mit derselben Nonce das "Überschreiben Ihrer eigenen ausstehenden Transaktion".

Mit eth_getTransactionByHashihm ist es möglich, die Nonce einer Transaktion wiederherzustellen.

Wenn Sie jedoch eine neue Transaktion mit derselben Nonce (und mehr Gas) senden, schlägt die neue Transaktion mit „TX (d37f7a1b) fehlgeschlagen, wird entfernt: Transaktion mit ungültiger Nonce“ fehl.

2- Wie "überschreiben" wir eine ausstehende Transaktion?

Danke schön


edit1: Ergebnis voneth.pendingTransactions

Die Eingabe ist dieselbe (gleicher Vertrag), ebenso die Nonce.

Die ersten 2 scheitern mit TX (49dcf54d/7e591a92) failed, will be removed: Out of gas, die dritte mitTX (d37f7a1b) failed, will be removed: Transaction w/ invalid nonce. tx=8 state=9)

[{
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 90000,
    gasPrice: 20000000000,
    hash: "0x49dcf54d52ddad2cfb57d9805b1a94bbc6b60ad44eaac9c117399530424d1300",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}, {
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 150000,
    gasPrice: 20000000000,
    hash: "0x7e591a92683453ea0ec6a7024d54198140ec2c23936b3662c4f3e0d9978fc828",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}, {
    blockHash: null,
    blockNumber: null,
    from: "0x766b8dc3ee1a98dd53444ce3cc5a185305570861",
    gas: 500000,
    gasPrice: 20000000000,
    hash: "0xd37f7a1bcedef089723f31bbf155b6c4c66f77fd0b5a5f6c3168a0b8ff3af299",
    input: "0x60606...5056",
    nonce: 8,
    to: null,
    transactionIndex: null,
    value: 0
}]

edit2: Änderung, nachdem der Knoten, der die Transaktionen erstellt hat, mit dem Mining begonnen hat

Die Situation änderte sich erst, als der Knoten, der die Transaktionen erstellte, mit dem Mining begann

  • Die erste Transaktion wurde entfernt
  • Die zweite Transaktion wurde, obwohl sie mit einem OOG zur Speicherzuweisung abgelehnt wurde, abgeschlossen und eine Vertragsadresse generiert
  • Die dritte Transaktion wurde entfernt

Ist dies das erwartete Verhalten, das der Knoten, der die ausstehende Transaktion erstellt hat, minen muss , damit eine Transaktion, die OOG auf einem anderen Miner ausführt, tatsächlich entfernt wird?

Die ursprüngliche Frage bleibt immer noch: Wie entfernen/stornieren/überschreiben wir eine ausstehende Transaktion?

Sind Sie sicher, dass die Transaktion nicht geschürft wurde? Was bedeutet "entfernt", denn die Bergleute werden gerne die Transaktion bearbeiten, bei der das Benzin ausgegangen ist, und die gesamte Gebühr einziehen. In der Konsole. Der Versuch ethereum.stackexchange.com/questions/645/… ist eine Möglichkeit, um festzustellen, ob die Transaktion noch aussteht.
@eth Hallo. Die Transaktionen stehen noch aus, siehe edit1 oben. Die genaue Meldung lautet "wird entfernt", aber sie sind es nicht. Wie entfernen/löschen/überschreiben wir sie?
@eth siehe edit2: Ich habe Probleme zu verstehen, warum ein Knoten, der eine Transaktion erstellt hat, minen muss , um die Situation zu klären. Auch bleibt die ursprüngliche Frage: Wie entfernen/stornieren/überschreiben wir ausstehende Transaktionen
Haben Sie versucht, den TX mit einer höheren Nonce und einem höheren Gas erneut zu senden, wenn das abgebaut wird, sollte jeder den ausstehenden TX mit einer niedrigeren Nonce fallen lassen.

Antworten (2)

Um die ursprüngliche Transaktion zu überschreiben, müssen Sie dieselbe Transaktion mit derselben Nonce, aber auch mit * > 10 % höherem Gaspreis als zuvor * erneut senden.

Wenn Sie die Transaktion stornieren möchten, übertragen Sie eine Transaktion mit Nullwert erneut, mit derselben Nonce, aber einem > 10 % höheren Gaspreis.

Nur eine der Transaktionen mit dieser Nonce kann in die Blockchain aufgenommen werden.

Wie machen Sie "Wenn Sie die Transaktion stornieren möchten, senden Sie eine Transaktion mit Nullwert erneut, mit derselben Nonce, aber > 10% höherem Gaspreis." Hast du einen Code?
Sie können dies von jeder Brieftasche aus tun, mit der Sie die Nonce manuell festlegen können. Zum Beispiel MyCrypto.

Ich hatte ein ähnliches Problem, ich habe versehentlich 20 Transaktionen mit GasPrice=0 durchgeführt, wodurch meine Geth-Instanz vollständig blockiert wurde. Ich habe die Schritte in diesem Artikel befolgt , um die Transaktionen zu stornieren. Was Sie im Wesentlichen tun möchten, ist:

  1. Holen Sie sich eine Geth-Konsoleninstanzgeth attach
  2. Überprüfen Sie, welche Transaktionen ausstehen (diese blockieren das Ganze) eth.pendingTransactions. Dadurch werden alle ausstehenden Transaktionen zurückgegeben. Ein oder mehrere Objekte, die so aussehen: { blockHash: null, blockNumber: null, from: "your account", gas: 179412, gasPrice: 0, hash: "hex stuff", input: "hex stuff", nonce: 260, r: "hex stuff", s: "hex stuff", to: "hex stuff", transactionIndex: 0, v: "0x29", value: 0 }

Jetzt kann eine von zwei Situationen auftreten, Sie haben nur eine ausstehende Transaktion oder Sie haben mehrere.

Nur eine Transaktion

  1. Suchen Sie nach der Transaktion nonce(im obigen Beispiel war 260)
  2. Entsperren Sie Ihr Konto,

    personal.unlockAccount('<YOUR_ACCOUNT>') Unlock account <YOUR_ACCOUNT> Passphrase: true

  3. Senden Sie eine Transaktion mit der gleichen Nonce und (mindestens) 10% höherem Gaswert an sich selbst,eth.sendTransaction({ from: '<YOUR_ACCOUNT>', to: '<YOUR_ACCOUNT>', value: 0, gasPrice: <NEW_HIGHER_GAS_PRICE>, gasLimit: 24000, nonce: '<NONCE_OF_YOUR_PENDING_TRANSACTION>' });

Mit mehreren Transaktionen

Das ist eine etwas seltsame Lösung, aber funktioniert :)

Führen Sie die gleichen Schritte 1 und 2 aus dem vorherigen Fall aus, dann:

  1. Kopieren Sie alle ausstehenden Transaktionsobjekte und fügen Sie sie in einen Texteditor mit Multi-Cursor-Funktionalität, wie z. B. sublime, ein
  2. Wählen Sie die Nonce-Werte aus (wählen Sie einen aus und dann Strg+D) und eliminieren Sie alles andere
  3. Pflegen Sie den Multi-Cursor, erstellen Sie eth.sendTransaction()den Nonce-Wert (Kontoadressen und Gaspreis vorher ausfüllen). Ich habe ein gif gemacht, das dies hier zeigt.
  4. Kopieren Sie diesen Code und fügen Sie ihn in die Geth-Konsole ein und drücken Sie die Eingabetaste.

Das sollte es tun.