Wird der Hash der Coinbase-Transaktion für die Merkle-Root benötigt?

das erste mal hier posten.

Ich war daran interessiert, wie Mining-Software bis auf die Bytes funktioniert. Ich bin auf diesen gut geschriebenen Artikel hier gestoßen:

http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

Unter „Notes and References“ stellt er ein Python-Programm bereit, das den Merkle-Stamm aus einer Liste von Transaktions-Hashes generiert. Was ich jedoch nicht verstehe, ist, warum oder wie der Hash der Coinbase-Transaktion in dieser Liste enthalten ist.

Nehmen wir an, Sie sind dabei, einen neuen Block abzubauen. Sie erstellen Ihre Liste mit Transaktions-Hashes (ohne die Coinbase-Transaktion, da Sie den Block nicht abgebaut haben), erstellen die Merkle-Root und erraten die Nonce, bis Sie einen Block erstellen. Jetzt findet die Coinbase-Transaktion statt und Sie erhalten Ihre Bitcoins, der Coinbase-Transaktions-Hash muss nun in die Liste der Transaktions-Hashes aufgenommen werden. Aber das ändert die Merkle-Wurzel und damit den gesamten Block, was ihn ungültig machen würde.

Wie wird das gelöst? Kennen Sie den Hash der Coinbase-Transaktion im Voraus? Oder schließen Sie die Coinbase-Transaktion für den neuen Block nicht ein und der Python-Code ist nicht korrekt?

Eine Nebenfrage ist auch, dass mich dieser Teil im Python-Code etwas verwirrt:

 h = hashlib.sha256(hashlib.sha256(a1+b1).digest()).digest()

Bedeutet a1+b1, dass Sie die Hash-Werte addieren oder einfach die beiden Hash-Werte aneinander hängen?

Danke im Voraus,

Fihdi

Antworten (1)

Sie erstellen Ihre Liste mit Transaktions-Hashes (ohne die Coinbase-Transaktion, da Sie den Block nicht abgebaut haben),

Hier liegt das Problem in Ihrem Verständnis. Die Coinbase-Transaktion wird generiert, bevor der Block abgebaut wird, nicht danach, da sie wie alle anderen in die Liste der Transaktionen aufgenommen werden muss. Es ist die erste Transaktion im Block, und ihr Hash wird beim Erstellen der Merkle-Root genauso verwendet wie alle anderen.

Sobald die Coinbase-Transaktion erstellt und die Merkle-Wurzel berechnet wurde, wird die Nonce variiert und der Block abgebaut.

Bedeutet a1+b1, dass Sie die Hash-Werte addieren oder einfach die beiden Hash-Werte aneinander hängen?

Hängen Sie die Hashes an, fügen Sie sie nicht hinzu

Das ist richtig. Zu den Vorteilen dieses Ansatzes gehört, dass die Coinbase-Transaktion nicht geändert werden kann, nachdem ein Block mit einem „korrekten“ Blockheaderhash übermittelt wurde, was beispielsweise die Mining-Belohnung manipulieren könnte, die der Miner erhält. Ein weiterer Vorteil besteht darin, dass der Miner dadurch eine zusätzliche Nonce innerhalb der Coinbase-Transaktion hinzufügen kann. Dies ist sehr vorteilhaft, da die möglichen unterschiedlichen Kombinationen von Werten in der 4-Byte-Nonce im Blockheader zu klein für moderne Miner sind, die alle verschiedenen Kombinationen in weniger als einer Sekunde ausschöpfen (und das Zeitstempelfeld im Blockheader ändert).