Enthält merkle root Hashes von Transaktionen aus früheren Blöcken?

Jeder Block in einer Blockchain enthält den Merkle-Root-Wert. Für jeden Block gibt es also eine Liste von Transaktionen und Sie erstellen einen Merkle-Baum basierend auf diesen Transaktionen. Für andere Blöcke wird derselbe Vorgang wiederholt.

Meine Frage ist: Nehmen wir an, dass A, B, C, D Transaktionen sind und wir erstellen einen Merkle-Baum und fügen die Merkle-Wurzel im Block hinzu. Jetzt später haben wir die Transaktionen E,F,G,H so:

  1. ob der Merkle-Baum nur auf E, F, G, H basiert
  2. oder es basiert auf A,B,C,D,E,F,G,H .

Ich möchte wissen, dass wir für einen Block einen Merkle-Root-Wert basierend auf A, B, C, D erstellt haben. Für andere blockieren Sie, ob wir vorherige Transaktionen in neue Transaktionen einbeziehen und einen Merkle-Baum erstellen. Oder mit nur neuen Transaktionen wird ein Merkle-Baum erstellt.

Antworten (3)

Die Blockchain ist der Mechanismus für Bitcoin, um in einem gemeinsamen Zustand zusammenzulaufen. Die Teilnehmer übermitteln Zahlungsaufträge in Form von unbestätigten Transaktionen an das Netzwerk, aus denen die Miner dann eine Reihe von Transaktionen für ihre Blockkandidaten auswählen. Die Merkle-Wurzel stellt hiermit ein Bekenntnis zu einer bestimmten Liste von zuvor unbestätigten, gültigen Transaktionen dar. Wenn ein neuer Block erstellt wird, validieren alle Netzwerkteilnehmer den Block und übernehmen dann den neuen Saldensatz als aktuellen Netzwerkstatus.

Neben der Merkle-Root als Verpflichtung zu den Transaktionen dieses Blocks verpflichtet sich der Block-Header auch zu genau einem vorangehenden Block als übergeordnetem Block, indem er den Hash dieses Vorgängerblocks enthält. Da der Vorgänger wiederum seinem eigenen Vorgänger verpflichtet ist, verpflichtet sich ein neuer Block daher induktiv zur vollständigen Geschichte seit dem Genesis-Block.

Da jeder vorangehende Block wiederum eine Merkle-Wurzel enthält, mit der er sich auf seinen eigenen Satz von Transaktionen verpflichtet, verpflichtet sich jeder neue Block auch indirekt zur vollständigen Historie aller Transaktionen.

Um auf Ihr Beispiel zurückzukommen, bedeutet dies, dass, wenn Block#1 auf festgeschrieben wird {A, B, C, D}, die Merkle-Root in Block#2 nur auf festschreiben würde {E, F, G, H}. Block Nr. 2 verpflichtet sich jedoch {A, B, C, D}indirekt, indem er Block Nr. 1 zu seinem Vorgänger erklärt.

Danke für diese wertvolle Information. Es ist wirklich hilfreich für mich.

Die Merkle-Wurzel ist blockspezifisch, sodass jeder Block eine andere Merkle-Wurzel hat. Wenn die Transaktionen AH zum selben Block gehören, müssen Sie die Merkle-Root mit allen Transaktionen aus AH berechnen, wenn nicht, haben Sie die Merkle-Root, die die Transaktion AD in Block N enthält, und die Merkle-Root, die die Transaktionen EH in Block N+1 enthält.

Blöcke verpflichten sich zum vorherigen Block mit previousblockhash, was der doppelte SHA-256-Hash des Headers des vorherigen Blocks ist. Der Header eines Blocks enthält unter anderem Merkle Root, Hash des vorherigen Blocks, Zeitstempel. Indem Sie also den Hash des Headers des vorherigen Blocks im Header des aktuellen Blocks verwenden, verpflichten Sie sich im Wesentlichen indirekt zu den Transaktionen, die im vorherigen Block enthalten waren, und bilden so eine Kette.

Das bedeutet, dass, wenn wir irgendwann einige Transaktionen sammeln, sagen wir T(1) als Merkle-Wurzel basierend auf diesen Transaktionen. Sagen wir nach einiger Zeit T(2), wenn wir eine andere Transaktion sammeln, dann Merkle-Root, basierend auf den Transaktionen, die wir zum Zeitpunkt T(2) sammeln. Frühere Transaktionen werden nicht in den aktuellen Merkle-Baum aufgenommen, um den Merkle-Wurzelwert zu erhalten.
@SanjeevDwivedi Ja, das ist richtig, wenn Sie Transaktionen in einem Block meinten. Es gibt unbestätigte Transaktionen, die nicht in den Blöcken enthalten sind (die verwendete Gebühr kann niedrig sein usw.), die in keinem Block Teil der Merkle-Wurzel bilden. Die Merkle-Root enthält keine Transaktionen aus vorherigen Blöcken. Aber die Verwendung des vorherigen Block-Header-Hashes im Header des aktuellen Blocks verpflichtet sich indirekt zu den Transaktionen im vorherigen Block.

Für jeden neuen Block gibt es einen neuen Merkle-Baum von Transaktionen. Sobald der Block in die Blockchain aufgenommen wurde, wird der Merkle-Baum (und damit die Merkle-Wurzel) für diesen Block nicht geändert. Wenn Sie in Ihrem Beispiel ein Miner sind, der versucht, einen Block abzubauen, können Sie wählen, ob Sie mit den Transaktionen A, B, C und D fortfahren oder einen neuen Merkle-Baum mit A, B, C, D, E, F, G und H bilden möchten Je höher die Transaktionsgebühren auf E, F, G und H, desto wahrscheinlicher wechselt der Miner von dem Versuch, einen Block mit A, B, C und D abzubauen, zu dem Versuch, einen Block mit A, B, C, D abzubauen. E, F, G und H.

Der entscheidende Punkt dabei ist, dass Merkle-Bäume von Transaktionen nicht mehr geändert werden können, sobald sie in die globale Blockchain aufgenommen wurden, aber vorher können sie lokal beliebig oft geändert werden.