Wie sucht ein Knoten eine Transaktion zwischen verschiedenen Blöcken in der Blockchain?

Lassen Sie mich ausdrücken, was ich über Blockchain weiß und wo ich feststecke.

Transaktionen werden in Form von Merkel-Bäumen innerhalb eines Blocks gespeichert. (Ich weiß, wie ein Merkelbaum gemacht wird). Eine Merkel-Wurzel wird berechnet und im Blockheader gespeichert. Ein SPV kann einen vollständigen Knoten nach dem Kontostand einer Adresse fragen (was eine Verschlüsselung eines öffentlichen Schlüssels ist).

Jetzt soll ein vollständiger Knoten einen Merkel-Root-Hash aller Blöcke geben, die die Transaktionen enthalten (der die UTXOs enthält, die vom Inhaber des privaten Schlüssels ausgegeben werden können, indem er sein Ausgabeskript mit seiner digitalen Signatur entsperrt).

Ich möchte wissen, wie der vollständige Knoten erfährt, welche Blöcke genau diese UTXOs enthalten? Ist es der Traverse-Merkel-Baum jedes Blocks bis zum Genesis-Block? oder gibt es eine Möglichkeit zu wissen, ob der Block diese Transaktion enthält oder nicht, nur indem er seine Merkel-Wurzel verwendet.

Antworten (1)

Transaktionen werden in Form von Merkel-Bäumen innerhalb eines Blocks gespeichert. (Ich weiß, wie ein Merkelbaum gemacht wird). Eine Merkel-Wurzel wird berechnet und im Blockheader gespeichert. 

Alles richtig.

Ein SPV kann einen Full Node nach dem Kontostand einer Adresse fragen

Nein, es kann nur ein Nachweis verlangt werden, dass eine bestimmte Transaktion in die Blockchain aufgenommen wurde. Der Merkle-Baum hat Transaktionen als Blätter, keine Adressen

Auf Protokollebene gibt es keine Salden, nur UTXOs. UTXOs (oder „Münzen“) sind Dinge mit einem Wert und einer Adresse, und jede Transaktion „schmiedet“ einfach Münzen neu. Es listet explizit bestimmte Input-Münzen auf, die vollständig eingeschmolzen werden (wobei diese Münzen dabei zerstört werden), und konstruiert dann neue Münzen, deren Wert den Wert der verbrauchten Münzen nicht übersteigt. Nirgendwo in diesem System erscheint ein Gleichgewicht.

(was eine Verschlüsselung des öffentlichen Schlüssels ist).

Ein Hash, keine Verschlüsselung. Es gibt nirgendwo in Bitcoin eine Verschlüsselung (außer lokal, um Ihre Wallet-Datei mit einem Passwort zu protokollieren).

Ich möchte wissen, wie der vollständige Knoten erfährt, welche Blöcke genau diese UTXOs enthalten?

Dies ist unabhängig. Blöcke enthalten Merkle-Wurzeln von Transaktionen. Sie enthalten keine UTXOs.

Eine Betrachtungsweise ist, dass es für jeden Block einen implizit definierten Satz von UTXOs gibt. Diese Menge ist für den Genesis-Block leer. Jede verarbeitete Transaktion löscht die verbrauchten UTXOs aus diesem Satz und fügt neue UTXOs für jede Ausgabe hinzu, die sie hat. Da Blöcke Gruppen von Transaktionen sind, sind sie auch nur Ansammlungen von Gruppen von UTXOs, die aus dem UTXO-Set gelöscht und ihm hinzugefügt werden.

Tatsächlich funktionieren Full Nodes so. Sie unterhalten lediglich eine Datenbank mit allen nicht ausgegebenen Ausgaben. Jeder Block ist nur ein authentifizierter "Patch" von Änderungen, die am UTXO-Set vorgenommen werden müssen.

Ist es der Traverse-Merkel-Baum jedes Blocks bis zum Genesis-Block? oder gibt es eine Möglichkeit zu wissen, ob der Block diese Transaktion enthält oder nicht, nur indem er seine Merkel-Wurzel verwendet.

Ich nehme an, Sie sprechen von BIP37 Bloom-Filtern? Es ist überhaupt keine Suche erforderlich. Ein Light-Client teilt einem Full Node mit: „Hey, ich bin an Transaktionen interessiert, um X zu adressieren“. Dann fragt es nach einer Reihe von Blöcken. Der vollständige Knoten liest diese Blöcke durch, und wenn eine passende Transaktion gefunden wird, sendet er sie zusammen mit einem Merkle-Zweig an den Light-Client, der beweist, dass sich die Transaktion tatsächlich in diesem Block befand.

Dieser Ansatz hat verschiedene Nachteile. Erstens ist es ineffizient, da es erfordert, dass der gesamte beteiligte Knoten alle Transaktionen in allen Blöcken liest und durchsucht. Zweitens ist es schrecklich für die Privatsphäre. Auch wenn der Satz von Adressen, an denen der Light-Client interessiert ist, in einem Bloom-Filter verborgen ist, ist es sehr schwer, ihn nicht durchsickern zu lassen, welche Transaktionen ein Knoten interessiert.

BIP157/BIP158 spezifizieren ein effizienteres und privateres Protokoll namens Neutrino, um dasselbe zu erreichen.

Vielen Dank Pieter für diese ausführliche Antwort. Könnten Sie bitte klarstellen, dass Sie nicht mit dieser zitierten Aussage suchen wollten? "Der Full Node liest diese Blöcke durch und wenn eine passende Transaktion gefunden wird, sendet er sie an den Light Client "
Ich denke, ich würde das nicht Suchen nennen, da es nichts Intelligentes daran ist ... keine Indizes, keine ausgefallenen Datenstrukturen ... lesen Sie einfach von vorne nach hinten und senden Sie zurück, was passt.