Erkennen, ob eine Transaktion abgebrochen wurde (weil ein Block verwaist ist)

Ich schreibe ein System, bei dem einige Transaktionen automatisch erkannt und 30 Blöcke gewartet werden müssen, um sicherzustellen, dass sie bestätigt werden. Ich lese alle neuen Blöcke und finde die Transaktionen, die zu meinen Adressen gehören.

Ich verwende getheinen getBlockByNumberRPC-Aufruf, und wenn ich dann eine Transaktion finde, die mir gehört, lege ich sie in einen Mempool und warte, bis 30 Blöcke verstrichen sind, und betrachte dann die Transaktion als endgültig.

Die Frage: Wie kann ich stornierte Transaktionen erkennen, um Doppelausgaben zu vermeiden?

Ich kann mir eine Situation vorstellen, in der ein Block verwaist und/oder auf irgendeine Weise abgebrochen wird. Wie kann ich überprüfen, ob die Transaktion noch gültig ist und nicht in irgendeiner Weise storniert wurde, bevor ich die Transaktion als endgültig betrachte?

Reicht es aus, nur denselben Block (nach Nummer) zu überprüfen, bevor die Transaktion als endgültig betrachtet wird, und zu prüfen, ob die Transaktion noch vorhanden ist? Gibt es andere Szenarien, um die ich mir Sorgen machen muss? (Onkel blockiert etc.) Wie kann ich das systematisch überprüfen?

Antworten (1)

Es ist möglich, dass sich eine Transaktion nach einer Kettenreorganisation in einem anderen Block befindet. Wenn beispielsweise eine Transaktion in Block 100 abgebaut wurde, ist es möglich, dass sie nach einer Reorganisation bei Block 102 oder Block 99 endet.

In einer Blockchain wie Ethereum (gesichert durch Proof of Work) sind Sie nie 100% sicher, dass eine Transaktion rückgängig gemacht wird. Aber zum Beispiel nach 12 Blockbestätigungen haben Sie ein sehr hohes Vertrauen, dass es nicht rückgängig gemacht wird, da es eine sehr große Menge an Hash-Power erfordert.

Um zu überprüfen, ob sich eine Transaktion in der Blockchain befindet, müssen Sie den von zurückgegebenen Wert überprüfen, der auf einen vorhandenen Block verweist und web3.eth.getTransaction(txid)genügend Bestätigungen vom besten von zurückgegebenen Block enthält .blockHashblockNumberweb3.eth.blockNumber

Um a zu validieren , bockHashkönnen Sie aufrufen web3.eth.getBlock(blockHash), wenn sich der Block nicht in der Hauptkette befindet, wird er null zurückgeben.

Jede Reorganisation von Blöcken wird definitiv den blockHash aller beteiligten Blöcke ändern, richtig? Das bedeutet, solange der blockHash gleich ist, hat sich nichts geändert und die von mir erkannte Transaktion befindet sich immer noch in dem Block, in dem ich sie gefunden habe. Ich frage, weil ich mich jedes Mal, wenn ich scanne, in der Kette rückwärts bewege und verifiziere, dass Block Nummer N denselben Hash hat, den ich zuvor gefunden habe. Wenn der Hash geändert wird, lösche ich diesen Block aus meinem Datensatz und gehe weiter rückwärts, bis der Hash übereinstimmt, und wenn dies der Fall ist, beginne ich erneut mit dem nächsten Block dort zu scannen. Ist das vernünftig?
Ja, das sollte funktionieren, eine Kettenreorganisation, die eine Transaktion betrifft, ändert den BlockHash.