Warum speichert jeder Block eine Merkle-Wurzel?

Ich verstehe, wie eine Merkle-Wurzel berechnet und im Block gespeichert wird. Aber wie verifizieren Miner eine Transaktion mit der Merkle-Root?

Hier sind 18 Bedingungen, die eine Transaktion verifizieren. Keiner von ihnen verwendet Merkle-Root.

mögliches Duplikat von Was ist die Merkle-Wurzel?

Antworten (4)

Merkle-Wurzeln verifizieren keine Transaktionen, sie verifizieren eine Reihe von Transaktionen. Transaktions-IDs sind Hashes der Transaktion, und der Merkle-Baum wird aus diesen Hashes konstruiert. Das bedeutet, wenn sich ein einzelnes Detail in einer der Transaktionen ändert, ändert sich auch die Merkle-Wurzel. Das bedeutet auch, dass, wenn genau dieselben Transaktionen in einer anderen Reihenfolge aufgelistet werden, sich auch die Merkle-Wurzel ändert.

Die Merkle-Root ist also ein kryptografischer Beweis dafür, welche Transaktionen sich im Block befinden und in welcher Reihenfolge sie sich befinden. Sie bietet eine praktische Information, die in den Block-Header aufgenommen werden kann, der dann gehasht und in den nächsten Block-Header aufgenommen wird. Ohne die Merkle-Wurzel im Block-Header hätten wir keinen kryptografischen Beweis dafür, welche Transaktionen in einem Block enthalten sind, noch einen Beweis dafür, dass ihre Inhalte nicht manipuliert wurden.

Die Verwendung eines Merkle-Baums ist einer Hash-Kette oder einem Hash aus verketteten Transaktionen vorzuziehen, da dies einen viel schnelleren und einfacheren Test ermöglicht, ob eine bestimmte Transaktion in der Menge enthalten ist. Weitere Einzelheiten finden Sie im Abschnitt über Merkle-Bäume im Entwicklerhandbuch .

Diese Antwort würde verbessert, wenn die Verwendung des Merkle-Baums für Mitgliedschaftsnachweise erwähnt würde, weshalb ein Merkle-Baum verwendet wird, anstatt nur eine Zusammenfassung über alle Transaktionen. Siehe Antwort von Alin Tomescu .
@Murch, ich habe dies aktualisiert, um zu enthalten, warum andere Hash-Schemata nicht verwendet wurden.

Merkle-Wurzeln werden in Bitcoin-Block-Headern gespeichert, um effiziente Mitgliedschaftsnachweise für Transaktionen in einem Block zu ermöglichen, die für SPV-Knoten (Simple Verified Payment Verification) erforderlich sind, die nur Block-Header und keine Blockinhalte speichern.

Es ist irreführend zu sagen: „Ohne die Merkle-Wurzel im Block-Header hätten wir keinen kryptografischen Beweis dafür, welche Transaktionen in einem Block enthalten sind, noch einen Beweis dafür, dass ihr Inhalt nicht manipuliert wurde.“

Wir können immer nur Hash-Chain-Transaktionen zusammenfügen und zum Beispiel eine Hash-Chain-Wurzel im Block-Header speichern. (Oder wir können einfach alle TXIDs verketten und diesen Hash im Header speichern.)

Dies wäre jedoch nicht so effizient: Zugehörigkeitsnachweise in Bezug auf eine Hash-Kette erfolgen, O(n)wenn nTransaktionen in der Kette vorhanden sind, im Vergleich O(\log{n})zu Nachweisen in Bezug auf einen Merkle-Baum.

Viel später bearbeiten: Ich nehme an, niemand hat Ihre Frage tatsächlich beantwortet: "Aber wie verifizieren Miner eine Transaktion mit der Merkle-Root?" .

Wie ich Ihre Frage verstehe, lautet die Antwort, dass sie den Merkle-Baum nicht verwenden. Miner erhalten, genau wie Full Nodes im P2P-Netzwerk, neue Transaktionen von anderen Full Nodes und verifizieren sie, indem sie ihre digitale Signatur überprüfen und gültige Coins ausgeben (so ziemlich wie in Ihrem Link beschrieben). Merkle-Bäume sind an dieser Stelle nicht beteiligt. Später nimmt der Miner alle verifizierten Transaktionen und erstellt darüber einen Merkle-Baum. Wenn mehr Transaktionen zum Miner kommen, verifiziert der Miner sie und fügt sie dem Merkle-Baum hinzu.

Warum fügt der Miner dem Merkle-Baum Dinge hinzu? Wie ich oben beschrieben habe, ist der einzige Grund, warum wir Merkle-Bäume haben, der, dass SPV-Knoten effizient überprüfen können, ob Miner die Transaktionen im Block verifiziert haben.

Es gibt ein Szenario, das man als „Miner verifizieren eine Transaktion mit dem Merkle-Stamm“ beschreiben könnte, obwohl ich diese Formulierung nicht verwenden würde: Wenn ein Miner von einem neuen Block hört, wird er dessen Gültigkeit überprüfen wollen (denken Sie daran, dass Miner dies nicht tun eine ungültige Kette verlängern möchten). Als Teil der Verifizierung muss der Miner sicherstellen, dass der Merkle-Baum korrekt über die TXIDs berechnet wurde. Dies bedeutet jedoch nicht , dass Transaktionen verifiziert wurden: Der Miner muss die Transaktionen immer noch einzeln verifizieren, wie in Ihrem Link beschrieben. Eine Folge dieser Überprüfung ist die kostenlose SPV-Sicherheit : Wenn ein SPV-Knoten einen Merkle-Mitgliedschaftsnachweis für eine Transaktion sieht, kann er davon ausgehen, dass er gültig ist (weil SPV-Knoten davon ausgehen, dass Miner Blöcke verifizieren).

Eigentlich ist es nicht falsch. Würde die Merkle-Wurzel ersatzlos weggelassen, hätten wir tatsächlich keine Informationen über die Transaktionen oder deren Echtheit. Sie weisen jedoch zu Recht darauf hin, dass es nicht alternativlos ist und die obigen Formulierungen es auch so klingen lassen.
Genau, es ist falsch in dem Sinne, dass die Merkle-Wurzel für die Effizienz notwendig ist, nicht für die Integrität/Authentizität, wo eine einfache Hash-Kette oder nur ein Hash aller Transaktionen (keine Verkettung) genauso gut funktionieren würde.
Ich habe "falsch" in "irreführend" geändert, was meiner Meinung nach das Problem besser ausdrückt. Wenn es Ihnen etwas ausmacht, können Sie gerne einen Rollback durchführen. :)
Ja, das ist perfekt!

Merkle-Bäume sind nützlich, um die Set-Mitgliedschaft in einem verteilten System zu überprüfen. Zunächst eine kurze algorithmische Beschreibung:

Szenario: Alice, die Prüferin, ist im Besitz eines Digests einer Menge S (dh aber nicht ihrer Elemente), eines Elements x. Sie möchte wissen, ob x zu S gehört. Wenn die Antwort ja ist, möchte sie einen Beweis sehen. Da Alice kein S hat, fragt sie Bob, den Prüfer. Bob hat vermutlich alle Elemente von S.

Einfache Lösung: Bob prüft, ob x in S ist und gibt Alice die gesamte Menge S als Beweis zurück. Alice kann verifizieren, dass x wirklich in S ist, indem sie den Digest von S neu berechnet und mit dem, den sie hat, abgleicht.

Merkle-Lösung: Bob prüft, ob x in S ist, und gibt in diesem Fall log n Hashes der internen Knoten zurück, die Geschwister der Knoten auf dem Pfad von x zur Wurzel im Merkle-Baum von S sind. Alice kann unter Verwendung dieser Hashes kann die Merkle-Wurzel rekonstruieren und mit dem in ihrem Besitz befindlichen Hash vergleichen.

Beachten Sie, dass

  • In der Bitcoin-Originalarbeit werden diese Bäume als Möglichkeit erwähnt, Speicherplatz zurückzugewinnen: Bob fährt mit dem obigen Beispiel fort und stellt fest, dass bestimmte Elemente von S inaktiv wurden (z. B. vollständig ausgegebene Transaktionen in einem Block), solche, die Alice niemals anfordern wird Mitgliedschaft. Bob kann sie sicher löschen, solange er den relevanten Teil des Merkle-Baums speichert, der die aktiven/nicht ausgegebenen Transaktionen betrifft. In Bitcoin wirkt sich dies nicht auf den Blockdeskriptor aus, da die Merkle-Wurzel Teil jedes Merkle-Pfads wäre und daher intakt ist. Das Löschen veralteter Transaktionen ändert also nicht die Integrität der Blockchain. Andererseits wird das Speichern eines Hashs aller Transaktionen aus dem Block den Block naiverweise vor zukünftigen Löschungen "einfrieren".

  • Bei beiden Lösungen ist es für Bob kryptografisch unlösbar, einen Beweis zu erbringen, wenn er nicht im Besitz der Elemente von S ist, da Digests Einwegfunktionen sind.

  • Alice könnte ein Kunde sein, der aus Platzgründen nicht das gesamte Set aufbewahren möchte.

  • Bei der ersten Lösung muss der gesamte Satz S übertragen werden, obwohl Alice nur einen Hash durchführen muss.

  • Die Merkle-Lösung ist jedoch in Bezug auf die Kommunikation exponentiell überlegen, da nur log n-Hashes vom Beweiser zum Verifizierer übertragen werden, Alice jedoch log n-Hash-Berechnungen durchführen muss. Das Berechnen von Hash-Digests ist schnell, daher haben Merkle Trees hier Anwendungen gefunden.

Merkle root wird nicht verwendet, um die Integrität von Transaktionen im Block zu überprüfen, aber nicht, um die Transaktion selbst zu überprüfen.Merkle-Wurzel

Wenn eine Transaktion geändert wird, ändert der Merkle-Stamm seinen Wert. Um also die Integrität einer Gruppe von Transaktionen zu überprüfen, verwenden wir Merkle root.

Dies könnte helfen, was ein Merkle-Baum ist