Wie erhält ein Kunde den Merkle-Zweig einer Transaktion?

Wenn der Bitcoin-Client eine Transaktion erhält, prüft er, ob die Transaktion bestätigt wurde. Dies geschieht, indem überprüft wird, ob die Transaktion im Merkle-Baum korrekt zur Merkle-Wurzel in einem Block gehasht wird.

Woher weiß der Client, welcher Block die Merkle-Wurzel der Transaktion enthält?

Wie wird der Merkle-Zweig erworben, nachdem der richtige Block gefunden wurde?

Antworten (1)

Im aktuellen P2P-Protokoll gibt es keine Möglichkeit, eine historische (=bestätigte) Transaktion anzufordern, ohne den Block anzufordern, in dem sie sich befindet. Um dies zu unterstützen, müsste der Peer jemals einen vollständigen Index aller Transaktionen haben, was für den Normalfall nicht erforderlich ist Betrieb.

Um eine Transaktion anzufordern, werden Sie entweder:

  • Wird verwendet getdata MSG_TX <txid>, um einen Speicherpool oder eine kürzlich weitergeleitete Transaktion anzufordern. In diesem Fall sind keine Blockinformationen vorhanden.
  • Verwenden Sie getdata MSG_BLOCK <blkid>, um einen vollständigen Block anzufordern. In diesem Fall erhalten Sie den Block damit und müssen trotzdem den vollständigen Merkle-Baum überprüfen.
  • Verwenden getdata MSG_FILTERED_BLOCK <blkid>Sie diese Option, um einen gefilterten Block anzufordern (siehe BIP37). In diesem Fall können Sie den partiellen Merkle-Baum überprüfen, um sicherzustellen, dass die Transaktion tatsächlich Teil des Blocks ist.
Wie kann ein Client also wissen, welchen Block er anfordern muss?
Warum unterstützt mein Kunde die getdataMethode nicht? Ist es neu?
@summerbulb Sie fordern aufeinanderfolgende Blöcke als Teil des Synchronisierungsprozesses an (Sie rufen keine Blöcke ab, um bestimmte Transaktionen abzurufen, sie sind einfach Teil dieser Blöcke), indem Sie einen getblocks/ inv/ getdata/ block-Zyklus verwenden.
@StevenRoose getdataist eine P2P-Nachricht, kein RPC-Aufruf. Sie können nur die getblockund getblockhashRPC-Befehle verwenden, um Blöcke aus der Datenbank anzufordern.