Wie werden txns in Merkle-Bäumen zwischen Knoten korrekt sortiert und per Proof of Work validiert?

Mich interessiert genau, was mit Transaktionen im ausstehenden Block passiert (Block, der gerade abgebaut wird). Soweit ich weiß, werden Transaktionen als Merkle-Tree-Hash innerhalb des Blocks gespeichert, zusammen mit dem übergeordneten Hash, dem Zeitstempel und der Nonce. Während des Mining hasht der Miner die Blockdaten mit verschiedenen Nonces, die versuchen, den Ziel-Hash zu erreichen. Ich nehme an, was sie hashen, sind alle Blockdaten, einschließlich der Merkle-Root. Aber die Merkle-Wurzel muss aufgrund der Transaktionsreihenfolge und der Generierungstransaktion für jeden Miner/Knoten unterschiedlich sein, also wie kommen andere Knoten zu einem Konsens, wenn ihre Transaktionen unterschiedlich sind. Da ist ein Loch in meinem Verständnis.

Wenn Transaktionen über das Netzwerk übertragen werden, empfangen Knoten sie außerdem aufgrund von Netzwerklatenz usw. zu unterschiedlichen Zeiten, und Bergleute können die Reihenfolge der Transaktionen aufgrund von Gebührenanreizen neu anordnen, aber dies ändert die Merkle-Wurzel. Ich verstehe, dass Miner beweisen, dass sie die Arbeit zur Validierung der Transaktionen geleistet haben, aber welche Schritte unternehmen andere Nodes, um „legitim auszusehen“. Ich stelle mir vor, dass sie die vom Blockersteller bereitgestellte Nonce verwenden würden, um ihre eigene Kopie des Blocks zu hashen und zu sehen, ob sie sich im Ziel befindet.

Außerdem, wenn PoW auf den Blockdaten mit dem Merkle-Root durchgeführt wird, wie können dem Block neue Transaktionen hinzugefügt werden? Müsste der Baum nicht erneut gehasht werden und der PoW müsste von vorne beginnen. Wartet ein Miner, bis das Blockgrößenlimit erreicht ist, bevor er PoW durchführt? Ich verstehe nicht, wie PoW für einen dynamischen Transaktionsfluss durchgeführt werden kann und wie jeder Knoten genau denselben Satz von allem haben kann, auf dem PoW ausgeführt werden kann.

Kann mir bitte jemand erklären, was mir fehlt? Wie werden Transaktionen nach verschiedenen Knoten sortiert? Wie gelangen Transaktionen in den Merkle-Baum? Wie validieren andere Nodes den neuen Block?

Vielen Dank.

Antworten (1)

Aber die Merkle-Root muss aufgrund der Transaktionsreihenfolge und der Generierungstransaktion für jeden Miner/Knoten unterschiedlich sein,

Richtig.

Wie kommen also andere Nodes zu einem Konsens, wenn ihre Transaktionen unterschiedlich sind?

Sie tun es nicht. Jeder Miner ist für die Wahl seiner eigenen Transaktionen voll verantwortlich. Es ist nicht erforderlich, dass sich verschiedene Miner auf die Transaktionsauswahl einigen. Der gewinnende Miner entscheidet über den Inhalt des Gewinnerblocks und andere schließen sich ihm an und akzeptieren ihre Transaktionsauswahl (es sei denn, die enthaltenen Transaktionen sind objektiv ungültig, was den Block ungültig macht – für Miner und andere Knoten).

Ich stelle mir vor, dass sie die vom Blockersteller bereitgestellte Nonce verwenden würden, um ihre eigene Kopie des Blocks zu hashen und zu sehen, ob sie sich im Ziel befindet.

Es gibt viele Blockgültigkeitsregeln, die von allen Knoten ausgeführt werden, einschließlich der Verifizierung von Proof-of-Work, wie Sie sagen. Andere Regeln umfassen die Überprüfung, dass alle Transaktionen gültig sind, dass kein Diebstahl aufgetreten ist, dass keine doppelten Ausgaben aufgetreten sind, dass kein Geld blockweise gedruckt wird (über die zulässige Subvention hinaus), ...

Müsste der Baum nicht nochmal gehasht werden

Ja.

Es gibt eine Reihe von Ebenen, die an der Aktualisierung des Kandidatenblocks eines Miners beteiligt sind. Jeder ist viel schneller als der vorherige, wird aber viel öfter ausgeführt:

  1. Typischerweise erstellt die Mining-Software gelegentlich (z. B. alle paar Sekunden) eine neue Blockvorlage, an der gearbeitet werden kann, einschließlich der Transaktionsauswahl.

  2. Eine Zwischenschicht ändert die Coinbase-Transaktion (die die Auszahlungsadresse sowie eine „zusätzliche Nonce“ enthält) von Zeit zu Zeit. Jedes Mal, wenn dies geschieht, ändert sich die Merkle-Wurzel. Durch das Zwischenspeichern der inneren Knoten des Merkle-Baums, die sich direkt rechts vom Zweig ganz links im Baum befinden, ist dies jedoch nur O (log (n)) Arbeit in der Anzahl der Transaktionen (z. B. ein Block mit 2048 Transaktionen benötigt nur 11 Hashing Schritte zur Neuberechnung der Merkle-Wurzel).

  3. Die Hardwareschicht der untersten Ebene durchläuft die 2 32 Nonces im Block-Header, alle mit derselben Merkle-Wurzel. Das ist äußerst effizient.

und der PoW müsste von vorne beginnen.

Ja, aber das ist irrelevant. PoW hat keinen "Fortschritt". Sie verlieren nichts, wenn Sie von vorne anfangen, solange Sie immer noch Hashes versuchen. Jeder von Ihnen ausprobierte Kandidatenblock (Kombination aus TX-Auswahl, Coinbase TX, Nonce) hat eine unabhängige Chance, das PoW-Ziel zu erreichen (eine Chance von 2 256 / Ziel). Wenn diese Chance 1/c beträgt und Sie h Hashes pro Tag ausführen, finden Sie h/c Block pro Tag – unabhängig davon, für welche Transaktionen diese Versuche gelten.

Danke Peiter! Wirklich sehr hilfreiche Antwort. Ich verstehe, dass Blöcke als legitim angesehen werden, wenn sie nicht später abgelehnt werden, was zu einer Gabelung führt. Wie erhalten Nodes Transaktionsinformationen aus dem Block, der gerade abgebaut wurde, um sie zu validieren? Müssen Full Nodes Transaktionen im Klartext speichern und andere Nodes fordern diese Informationen an? Ich verstehe nicht, wie Transaktionen von einem Merkle-Root gefunden werden können, es müsste "ungehasht" sein. Was die Bestätigung von Transaktionen über Kryptografie betrifft, wird dies getan, bevor sie an den Merkle-Baum angehängt werden? Oder irgendwie im mempool? Danke
Hinzufügen zu meinem Kommentar; Ich verstehe, dass die Merkle-Wurzel Teil des Block-Headers ist und txns von vollständigen Knoten gespeichert werden. Knoten können die Aufnahme von Transaktionen in einen Merkle-Baum nur von seiner Wurzel aus überprüfen? Wie ist das möglich, wenn die Wurzel ein Einweg-Hash ist? Wie erhalten Blockchain-Explorer auf ähnliche Weise die Informationen von Transaktionen (Eingabe, Ausgabe usw.) nur mit der Transaktions-ID?
Knoten fordern die vollständigen Blockdaten voneinander an, wenn sie einen neuen Block weiterleiten. Sie verifizieren die Merkle-Wurzel, indem sie sie aus den Transaktionen neu berechnen.