Merkle-Root Vs Transaktions-Hashes

Mir ist nicht klar, warum wir Transaktions-Hashes nicht einfach in einem Block-Header speichern können, anstatt die Merkle-Root zu speichern. Ich verstehe, dass das Speichern von Transaktions-Hashes die Größe eines Block-Headers leicht erhöht. Der Transaktionsverifizierungsprozess wird jedoch stark vereinfacht, da man den Merkle-Baum nicht berechnen muss. In diesem Fall kann man eine Transaktion verifizieren, indem man einfach nach diesem Transaktions-Hash im Header sucht.

Noman Aslam

Antworten (2)

Das Speichern des Hashs jeder Transaktion im Blockheader könnte den Blockheader viel größer machen, als er derzeit ist. Im Moment beträgt der gesamte Header 80 Bytes, und die tx Merkle-Root umfasst 32 Bytes davon. Sie können eine beliebige Anzahl von Transaktionen in einen 32-Byte-Merkle-Root hashen, sodass dies sehr gut als kryptografisch sichere Komprimierungstechnik funktioniert.

Ich kann mir einige Auswirkungen größerer Blockheader vorstellen:

  • SPV-Wallets wären ressourcenintensiver zu betreiben, sie würden viel mehr Speicherplatz und Bandbreite benötigen. Ich denke, die Berechnung des Merkle-Zweigs ist wahrscheinlich selten der Hardware-Engpass, der beim Entwerfen von Brieftaschen berücksichtigt werden muss.
  • Bergleute würden Anreize erhalten, kleine Blöcke abzubauen. Dies liegt daran, dass ein größerer Blockheader einen größeren Eingabewert für die SHA-256-Hash-Funktion bedeuten würde, sodass die Berechnung des Hashs länger dauern würde. Das ist wichtig: Der schnellste Block-Hash, den ein Miner berechnen könnte, wäre einer ohne Transaktionen (außer der Coinbase).
  • Sie könnten weniger Transaktionen in einen Block packen, da mehr Blockspace vom Header verwendet würde. Eine gute Implementierung würde die Anzahl der Transaktionen, die Sie in einen Block passen könnten, nicht ändern, siehe Pieters Kommentare unten.

Es gibt wahrscheinlich noch mehr, Sie können diese Liste gerne erweitern.

Das letzte Argument gilt nicht. Nur weil der Block-Header alle txids enthält, macht nicht jeder Store alle. Das ist ähnlich, wie der Merkle-Baum selbst nirgendwo gespeichert wird, sondern durch die Transaktionen impliziert wird.
@PieterWuille Ich bin mir nicht sicher, ob ich folge. Auf der einfachsten Ebene: Wenn das maximale Blockgewicht gleich bleibt und das Einfügen von txids anstelle eines Merkle-Roots den Header größer macht, dann bleibt im Body weniger Platz für Transaktionen, oder? Ich interpretierte die Frage von OP als "Warum nicht nur eine naive Implementierung, die alle txids hintereinander auflistet?"
Sie könnten Teil des Block-Headers sein, ohne sie zu speichern (in jeder Situation, in der Sie die Transaktionen auch bereits speichern). Wir könnten jetzt dasselbe nur mit der Wurzel machen (wie es auch durch die Transaktionen impliziert wird), aber für nur 32 Bytes lohnt es sich nicht wirklich.
Ich verstehe, danke. Ich habe die Antwort bearbeitet, um genauer zu sein.

Ich verstehe, dass das Speichern von Transaktions-Hashes die Größe eines Block-Headers leicht erhöht.

Das ist eine Untertreibung. Laut dieser Antwort beträgt die Mindesttransaktionsgröße 60 Bytes. Ein Block voll davon würde den txhash-Teil des Block-Headers auf 560 kb statt 32 Bytes machen, wie es derzeit der Fall ist.

Nur zur Verdeutlichung, ich spreche von Hashes von Transaktionen, die im Header gespeichert werden sollen, anstatt von der gesamten Transaktion. Falls ein Block 2000 Transaktionen hat (was heutzutage normalerweise der Durchschnitt ist), erhöht sich die Blockgröße auf 32 * 2000 = 64 KB, wenn SHA-256 zur Berechnung des Hash verwendet wird. Daher ist es kein Weg in die Nähe von 560 KB.
Wenn die Transaktion 60 Bytes lang ist (Mindestgröße), kann ein Block 17476 Transaktionen aufnehmen. Jede txid ist 32 Bytes groß, also 17476 * 32 Bytes = 560 KB