Glossar / Mining und Konsens
Block-Header
Auch bekannt als Header.
- Was ist ein Block-Header?
- Ein Block-Header ist die 80 Byte lange Zusammenfassung eines Blocks: Version, Hash des vorherigen Headers, Merkle-Wurzel, Zeitstempel, nBits und Nonce, und er ist der Teil, den Miner tatsächlich hashen.
Miner hashen nie die Zahlungen direkt. Sie hashen diesen Datensatz fester Größe, der über die Merkle-Wurzel die Transaktionsliste und über den Hash des vorherigen Headers jeden früheren Block festschreibt. Achtzig Byte pro Block sind so wenig, dass die vollständige Header-Kette seit Januar 2009 bequem auf ein Smartphone passt, und genau das macht eine leichte Verifizierung überhaupt erst möglich.
Wie es funktioniert
Ein Block-Header besteht aus sechs Feldern in fester Reihenfolge, und ihre Byte-Offsets verschieben sich nie.
Die Version belegt die Bytes 0 bis 3. Der Hash des vorherigen Block-Headers belegt die Bytes 4 bis 35. Die Merkle-Wurzel belegt die Bytes 36 bis 67. Der Zeitstempel, in Sekunden seit der Unix-Epoche, steht in den Bytes 68 bis 71. nBits, das kodierte Schwierigkeitsziel, steht in den Bytes 72 bis 75. Die Nonce füllt die Bytes 76 bis 79. Jedes Feld wird als Little Endian gespeichert, weshalb die Hex-Zeichenfolge in einem Explorer im Vergleich zur Hex-Zeichenfolge eines Rohdumps des Blocks byteweise umgekehrt aussieht.
Der Block-Hash ist keines dieser Felder. Er wird berechnet, indem SHA-256 zweimal über die 80 Bytes angewendet wird, und Nodes leiten ihn ab, statt ihm zu vertrauen, und genau deshalb kann ein Block nicht über seine eigene Identität lügen. Proof of Work ist dieselbe Operation mit einem angehängten Vergleich: Die resultierende Zahl muss gleich dem Ziel sein, das nBits kodiert, oder darunter liegen.
Zwei der Felder tragen Regeln, die Menschen überraschen. Der Zeitstempel muss nicht genau sein. Er muss nur den mittleren Zeitstempel der vorherigen elf Blöcke überschreiten und innerhalb von zwei Stunden von der eigenen Uhr des empfangenden Nodes liegen, daher sind Header mit leicht abweichenden Zeiten normal und gültig. Auch das Versionsfeld ist längst kein einfacher Zähler mehr. Die Soft-Fork-Signalisierung nach BIP9 und das Version Rolling nach BIP320 leihen sich beide Bits daraus, daher ist eine Versionsnummer in einem modernen Header ein Bitfeld und keine Versionsnummer einer Veröffentlichung.
Wo er auftaucht
Block-Header sind das Erste, was ein neuer Node herunterlädt, und das Einzige, was viele Wallets behalten.
Bitcoin Core synchronisiert seit Version 0.10, veröffentlicht im Februar 2015, zuerst die Header. Der Node lädt die Header-Kette herunter und validiert sie, bestätigt, dass sie echten Proof of Work trägt, und fragt erst dann die Blockinhalte an, was er bei mehreren Peers parallel tun kann, weil er bereits weiß, wonach er sucht. Leichte Clients bleiben bei diesem ersten Schritt stehen: Eine SPV- oder Neutrino-Wallet behält Header und prüft, dass der Merkle-Zweig einer Transaktion mit einem von ihnen verbunden ist. Bei 80 Bytes pro Header ist eine Kette aus 900.000 Headern 72 MB groß, weshalb das über mobile Daten funktioniert.
Der Genesis-Header ist das kanonische Beispiel zum Prüfen. Seine Version ist 1, sein Hash des vorherigen Headers besteht nur aus Nullen, seine Merkle-Wurzel ist 4a5e1e4b und so weiter, sein Zeitstempel ist 1231006505, das ist der 3. Januar 2009, sein nBits-Wert ist 0x1d00ffff, und seine Nonce ist 2083236893. Sie können diese 80 Bytes selbst hashen und erhalten den bekannten Block-Hash, der mit zehn Nullen beginnt. Wenn Sie einen anderen Header sehen möchten, liefert der RPC getblockheader von Bitcoin Core genau diese Felder und nichts anderes.