Die Hash-Funktion verstehen

Kann jemand bitte die Komponenten des endgültigen Hashs, der den Gewinner des Blocks bestimmt, im Detail erklären?

Mein Verständnis ist, dass die Miner nehmen

  1. Die Merkle-Wurzel,
  2. Der Zeitstempel,
  3. Der Hash des vorherigen Blocks,
  4. Einige andere Komponenten??, zusammen mit
  5. Eine Nonce, die die Miner erraten müssen, damit der Hash all dieser Komponenten mit Sha256 mindestens 18 führende Nullen hat.

Meine Fragen sind:

  1. Liege ich bisher mit meinem Verständnis richtig?

  2. Kann jemand erklären, was die anderen Komponenten sind und in welcher Reihenfolge sie in die Hash-Funktion eingegeben werden?

  3. Kann ich mit den auf blockchain.info verfügbaren Daten zu jedem Block den gewinnenden Hash neu erstellen, indem ich dieselben Daten in einen Sha256-Rechner eingebe?

Danke.

Antworten (2)

Du bist ganz in der Nähe. Wie Mesh bereits dargelegt hat, hashen Miner die folgenden Daten:

  • nVersion (zB 02000000)
  • HashPrevBlock (dieser Hash wird umgekehrt, und dann werden alle zwei Bytes umgedreht)
  • HashMerkleRoot (dieser Hash wird umgekehrt, und dann werden alle zwei Bytes umgedreht)
  • nTime (muss in Hex konvertiert werden, z. B. 358b0553)
  • nBits (Zielschwierigkeit zB 535f0119)
  • nNonce (die zufälligen Daten)

Diese Informationen finden Sie in der Bitcoin Developer Reference oder im PDF .

Nun zu Ihrer dritten Frage: Ja, das können Sie! Ich habe gerade gestern ein kleines Programm in C# gebaut, um dies zu tun! Es ist ein kleiner Trick dabei, weil Sie die Daten nicht einfach direkt in einen Hash-Rechner stecken und verifizieren können. Zuerst fügen Sie alle Felder zu einer einzigen Zeichenfolge zusammen (nachdem die Hash-Umkehrung und -Umkehrung für den vorherigen Block-Hash und Merkle-Root durchgeführt wurde). Anschließend konvertieren Sie diese Zeichenfolge in Binärdaten. An diesem Punkt führen Sie den doppelten SHA256-Hash aus, um zu überprüfen, ob Sie einen gültigen Hash des Blocks erhalten.

Eine hilfreiche Ressource für Sie, um es auszuprobieren, ist Mining Bitcoin with Pencil and Paper sowie Bitcoin Wiki . Beide Ressourcen verfügen über Codebeispiele, die diesen Prozess in Aktion zeigen.

Aus der Bitcoin.org-Entwicklerdokumentation besteht ein Block-Header aus:

  • Ausführung
  • Header-Hash des vorherigen Blocks
  • Merkle-Wurzel
  • Zeitstempel
  • nBits-Feld
  • einmal

In dieser Reihenfolge. Wie Sie sagen, die einzige Komponente, die in Ihrer Liste fehlt, ist die Version und das nBits-Feld. Die Version ist selbsterklärend, das nBits-Feld jedoch nicht. Das nBits-Feld codiert das aktuelle Ziel für den Schwierigkeitsalgorithmus:

mindestens 18 führende Nullen haben.

Nicht immer 18 Nullen. Die Anzahl der führenden Nullen ändert sich je nachdem, wie schnell Blöcke in letzter Zeit gefunden wurden, um die Blockzeit trotz unterschiedlicher Hashpower im Netzwerk bei etwa 10 Minuten Durchschnitt zu halten. Wenn mehr Miner beitreten, steigt die Hashrate und damit auch die Schwierigkeit (dh es sind mehr Nullen erforderlich). Eine andere Möglichkeit, über die Nullen nachzudenken, besteht darin, dass die Ausgabe des SHA256 als Zahl kleiner als eine Zielzahl sein muss. Dieses Ziel ist im nBits-Feld codiert. Und ja, jeder kann überprüfen, ob der Block-Header zu einer Zahl unterhalb des Ziels gehasht wird, so überprüfen andere Clients, ob Blöcke gültig sind, da SHA256 immer dieselbe Ausgabe aus derselben Eingabe erzeugt - es ist deterministisch, eine Eigenschaft aller nützlichen Hashes Funktionen.