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 geth
einen getBlockByNumber
RPC-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?
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 .blockHash
blockNumber
web3.eth.blockNumber
Um a zu validieren , bockHash
können Sie aufrufen web3.eth.getBlock(blockHash)
, wenn sich der Block nicht in der Hauptkette befindet, wird er null zurückgeben.
Der Quantenphysiker
Ismael