Was ist ein Block Header?
Der Block Header ist der „Kopf“ eines Bitcoin-Blocks. Er enthält die wichtigsten Informationen über den Block, während die eigentlichen Transaktionen separat gespeichert werden.
Jeder Bitcoin-Block besitzt genau einen Header. Seine Struktur ist fest definiert und hat immer eine Größe von 80 Bytes.
Aus dem Block Header wird der Blockhash berechnet. Er verbindet den Block mit seinem Vorgänger, enthält die Merkle Root der Transaktionen und liefert die Daten, die für Proof-of-Work benötigt werden.
Aufbau eines Block Headers
Ein Block Header besteht aus sechs Feldern mit fester Reihenfolge und Größe.
Gemeinsam enthalten sie alle Informationen, die benötigt werden, um einen Block zu identifizieren, mit seinem Vorgänger zu verknüpfen und Proof-of-Work zu überprüfen. Beim Node laufen diese Prüfungen in der Blockvalidierung.
Der Header wird auf der Netzwerkebene und in der Blockchain nicht als Tabelle gespeichert, sondern als Folge von 80 Bytes serialisiert.
Der Header von Block 825000 sieht beispielsweise so aus:
00e0d020f6d6008880ac145009739b2833412709addcdb255aba010000000000000000000da 9542333c185a8add906acda78de91617a580d5cb8ee16fb74204d0401026092449d6569d803176c52eb4e
Die einzelnen Felder liegen dabei direkt hintereinander im Header. Das folgende Diagramm zeigt, welcher Bereich der Bytefolge zu welchem Feld gehört.
- Version
- Previous Block Hash
- Merkle Root
- Timestamp
- Bits
- Nonce
Bereich anklicken für Details.
Version
Die Version ist das erste Feld im Block Header und belegt 4 Bytes.
Im Header von Block 825000:
- Version
Feld anklicken für Detailansicht.
Da Zahlen im Block Header im Little-Endian-Format gespeichert werden, müssen die Bytes zunächst umgedreht werden, bevor der Wert gelesen werden kann.
Auf den ersten Blick wirkt dieser Wert ungewöhnlich. Man könnte erwarten, hier einfach eine Versionsnummer wie 1, 2, 3 oder 4 zu finden.
Tatsächlich wurde das Feld in den frühen Jahren von Bitcoin genau dafür verwendet. Alte Blöcke enthalten daher oft einfache Versionsnummern:
block 50 · Version 1
- Version 1
Feld anklicken für Detailansicht.
block 300.000 · Version 2
- Version 2
Feld anklicken für Detailansicht.
block 400.000 · Version 3
- Version 3
Feld anklicken für Detailansicht.
Mit der Zeit erhielt das Feld jedoch eine zusätzliche Aufgabe. Anstatt nur eine Versionsnummer zu speichern, können Miner heute einzelne Bits innerhalb dieses Feldes verwenden, um ihre Unterstützung für neue Konsensregeln zu signalisieren.
Deshalb enthalten moderne Blöcke häufig komplexe Werte statt einer einfachen Versionsnummer:
block 500.000 · 0x20000000
- 0x20000000
Feld anklicken für Detailansicht.
block 825.000 · 0x20d0e000
- 0x20d0e000
Feld anklicken für Detailansicht.
block 800.000 · 0x341d6000
- 0x341d6000
Feld anklicken für Detailansicht.
Die Version wird heute nicht mehr nur als einfache Versionsnummer verwendet. Stattdessen können einzelne Bits innerhalb der 32 Bit genutzt werden, um die Unterstützung neuer Konsensregeln zu signalisieren.
Auf diese Weise konnte das Bitcoin-Netzwerk in der Vergangenheit Änderungen wie SegWit oder Taproot koordinieren, ohne dass alle Teilnehmer gleichzeitig aktualisiert werden mussten.
Wie ein verteiltes Netzwerk neue Regeln einführt und welche Rolle Miner, Nodes und Softforks dabei spielen, betrachten wir später ausführlicher.
Beim Einlesen eines Blocks muss das Feld zusammen mit den übrigen Header-Feldern korrekt deserialisiert werden. Das ist Teil der Blockvalidierung, bevor Header-Regeln und Proof-of-Work greifen.
Previous Block Hash
Der Previous Block Hash ist das zweite Feld im Block Header und belegt 32 Bytes.
Im Header von Block 825000:
- Previous Block Hash
Feld anklicken für Detailansicht.
Dieses Feld enthält den Blockhash des vorherigen Blocks.
Block 825000 speichert hier also den Blockhash von Block 824999. Dadurch entsteht die Verkettung der Blockchain: Jeder neue Block verweist auf seinen direkten Vorgänger.
Wird ein neuer Block gefunden, übernimmt der Miner den Blockhash des aktuellen Spitzenblocks und speichert ihn als Previous Block Hash im Header des neuen Blocks.
Auf diese Weise entsteht eine fortlaufende Kette von Blöcken, bei der jeder Block kryptografisch mit seinem Vorgänger verbunden ist.
Warum ist dieses Feld wichtig?
Da jeder Block den Hash seines Vorgängers enthält, wirkt sich eine Änderung an einem Block auch auf alle nachfolgenden Blöcke aus.
Würde sich beispielsweise der Inhalt von Block 824999 ändern, entstünde ein anderer Blockhash. Der gespeicherte Previous Block Hash in Block 825000 würde dann nicht mehr zum tatsächlichen Hash von Block 824999 passen.
Die Verkettung wäre unterbrochen und der Block würde von den Nodes als ungültig erkannt. In der
Blockvalidierung muss hashPrevBlock auf einen bekannten Vorgänger zeigen.
Genau diese kryptografische Verkettung macht nachträgliche Änderungen an der Blockchain so aufwendig.
Merkle Root
Die Merkle Root ist das dritte Feld im Block Header und belegt 32 Bytes.
Im Header von Block 825000:
- Merkle Root
Feld anklicken für Detailansicht.
Dieses Feld enthält einen Hash, der alle Transaktionen des Blocks zusammenfasst.
Anstatt jede Transaktion direkt im Header zu speichern, wird aus allen Transaktionen zunächst ein Merkle Tree aufgebaut. Die oberste Hashsumme dieses Baums wird als Merkle Root im Block Header gespeichert.
Dadurch reichen 32 Bytes aus, um auf sämtliche Transaktionen des Blocks zu verweisen.
Warum ist dieses Feld wichtig?
Die Merkle Root verbindet den Block Header mit den Transaktionen des Blocks.
Bereits die Änderung einer einzigen Transaktion führt zu einer anderen Merkle Root. Da die Merkle Root Teil des Block Headers ist, verändert sich dadurch auch der Blockhash.
Sie ermöglicht es Nodes, effizient zu überprüfen, ob Transaktionen zu einem Block gehören, ohne alle Transaktionen speichern oder übertragen zu müssen.
Jeder Node berechnet den Merkle-Baum aus der Transaktionsliste neu und vergleicht das Ergebnis mit dem Header. Stimmt der Wert nicht, scheitert die Merkle-Root-Prüfung.
Timestamp
Der Timestamp ist das vierte Feld im Block Header und belegt 4 Bytes (32 Bit).
Im Header von Block 825000:
- Timestamp
Feld anklicken für Detailansicht.
Ein Unix Timestamp ist dabei nichts anderes als eine fortlaufende Zahl, die angibt, wie viele Sekunden seit dem Zeitpunkt Epoch (1970-01-01 00:00:00 UTC) vergangen sind.
Live Unix Timestamp
···
Sekunden seit dem 1. Januar 1970 (UTC)
Aktuelle Zeit (UTC)
···
Da Zahlen im Block Header im Little-Endian-Format gespeichert werden, müssen die Bytes zunächst umgedreht werden, bevor der Wert gelesen werden kann.
Warum ist der Timestamp wichtig?
Der Timestamp liefert dem Netzwerk einen gemeinsamen zeitlichen Bezugspunkt für Blöcke.
Er wird unter anderem bei der Difficulty-Anpassung verwendet. Alle 2016 Blöcke vergleicht Bitcoin die Zeitstempel des ersten und letzten Blocks eines Difficulty-Zeitraums, um abzuschätzen, wie schnell neue Blöcke gefunden wurden.
Außerdem spielt der Timestamp bei der Blockvalidierung eine Rolle. Nodes akzeptieren nur Zeitstempel, die innerhalb bestimmter Grenzen liegen und mit der bisherigen Blockchain konsistent sind: nicht zu früh gegenüber dem Median Time Past und nicht mehr als zwei Stunden in der Zukunft.
Der Timestamp ist damit ein wichtiger Bestandteil der Konsensregeln und der Difficulty-Anpassung.
Bits
Bits ist das fünfte Feld im Block Header und belegt 4 Bytes (32 Bit).
Im Header von Block 825000:
- Bits
Feld anklicken für Detailansicht.
Das Feld enthält das aktuelle Target in einer kompakten Darstellung.
Da das vollständige Target 256 Bit groß ist, würde seine Speicherung im Block Header viel Platz benötigen. Bitcoin speichert deshalb stattdessen einen verkürzten 32-Bit-Wert, aus dem jeder Node das ursprüngliche Target wieder berechnen kann.
Das daraus berechnete Target lautet:
Bits → Target · Block 825.000
Bits (kompakt)
0x1703d869
Exponent
0x17
23 Bytes
Mantisse
0x03d869
3 Bytes Koeffizient
Target als 32 Bytes (256 Bit)
Mantisse
9 führende Null-Bytes
Exponent · 23 Byte Target-Länge
Target
Hexadezimal · 256 Bit
00000000000000000003d8690000000000000000000000000000000000000000dieselbe 256-Bit-Zahl als Dezimalzahl
368.311.566.122.123.513.513.592.411.007.997.767.500.471.904.222.838.784Ein Block ist nur gültig, wenn sein Blockhash kleiner oder gleich dem aus Bits berechneten Target ist. Diese Prüfung ist Teil der Proof-of-Work-Regeln und wird von jedem Node bei der Blockvalidierung durchgeführt.
Zusätzlich muss nBits dem für die Blockhöhe erwarteten Schwierigkeitsziel entsprechen. Das prüft der Node in den
Header-Regeln (bad-diffbits).
Bits dient daher als kompakte Repräsentation der aktuellen Mining-Schwierigkeit und ermöglicht jedem Node die Überprüfung des Proof-of-Work.
Die genaue Umrechnung von Bits zum Target und zur Difficulty behandeln wir später ausführlich.
Nonce
Die Nonce ist das sechste Feld im Block Header und belegt 4 Bytes (32 Bit).
Im Header von Block 825000:
- Nonce
Feld anklicken für Detailansicht.
Die Nonce ist ein frei veränderbarer Zähler, den Miner während des Proof-of-Work verändern, um neue Blockhashes zu erzeugen.
Da die Nonce 32 Bit groß ist, existieren insgesamt 2³² = 4.294.967.296 mögliche Werte.
Für jeden Nonce-Wert wird ein neuer Blockhash berechnet. Bereits die Änderung eines einzelnen Bits der Nonce führt zu einem vollständig anderen Hashwert.
Sind alle 4.294.967.296 Nonce-Werte ausprobiert, verändert der Miner weitere Daten des Blockkandidaten, beispielsweise den Zeitstempel oder die Coinbase-Transaktion.
Dadurch entsteht ein neuer Block Header, dessen Nonce erneut von 0 bis 4.294.967.295 durchgezählt werden kann.
Ein Block ist nur gültig, wenn sein Hash kleiner oder gleich dem aktuellen Target ist. Ob das erfüllt ist, prüft der Node in der Proof-of-Work-Validierung.
Wie Miner dabei Milliarden von Hashversuchen erzeugen und welche Rolle die sogenannte Extra Nonce spielt, betrachten wir später im Detail auf der Seite Proof-of-Work.
Wie entsteht der Blockhash?
Der Blockhash entsteht durch zweimaliges SHA256-Hashing des vollständigen Block Headers.
Im folgenden Beispiel wird der serialisierte Header von Block 825000 gehasht. Die Eingabe der Hashfunktion ist dabei die 80 Byte lange Bytefolge des Headers, dargestellt als Hexadezimalwert.
Interpretierte Eingabe-Bytes
Input
00e0d020f6d6008880ac145009739b2833412709addcdb255aba010000000000000000000da9542333c185a8add906acda78de91617a580d5cb8ee16fb74204d0401026092449d6569d803176c52eb4eHex Decode
00e0d020f6d6008880ac145009739b2833412709addcdb255aba010000000000000000000da9542333c185a8add906acda78de91617a580d5cb8ee16fb74204d0401026092449d6569d803176c52eb4eBytes
00 e0 d0 20 f6 d6 00 88 80 ac 14 50 09 73 9b 28 33 41 27 09 ad dc db 25 5a ba 01 00 00 00 00 00 00 00 00 00 0d a9 54 23 33 c1 85 a8 ad d9 06 ac da 78 de 91 61 7a 58 0d 5c b8 ee 16 fb 74 20 4d 04 01 02 60 92 44 9d 65 69 d8 03 17 6c 52 eb 4eErster SHA-256-Durchlauf (Hex)
…Erster Durchlauf über die interpretierten Bytes.
Blockhash (Block 825.000)
…Anzeige-Reihenfolge der Hash-Bytes. Erwartet: 00000000000000000001432b1ea8b3b710c3fb7e628d605cf4a42c25d7822431.
Berechnung läuft …
Der Blockhash ist nicht direkt im Block gespeichert.
Er entsteht erst durch das zweimalige SHA256-Hashing des Block Headers und wird von jedem Node selbst berechnet.
Der oben gezeigte Blockhash ist daher das Ergebnis der Metadaten im Header von Block 825000.
Warum werden nur 80 Bytes gehasht?
Der Block Header ist immer genau 80 Bytes groß.
Die eigentlichen Transaktionen können dagegen mehrere Megabyte umfassen.
Da die Merkle Root bereits alle Transaktionen des Blocks kryptografisch zusammenfasst, genügt es, ausschließlich den Header zu hashen.
Bereits eine Änderung an einer einzigen Transaktion verändert die Merkle Root, den Header und damit auch den Blockhash. Für die Chainwork zählt deshalb der Hash über genau diese 80 Bytes.
Weiterführende Themen
Der Block Header verbindet viele zentrale Bestandteile des Bitcoin-Protokolls.
Wenn du die einzelnen Felder und den Blockhash verstanden hast, sind diese Themen die nächsten logischen Schritte:
- Merkle Tree
- SHA256
- Proof-of-Work
- Difficulty
- Blockvalidierung
- Header-Regeln
- Proof-of-Work-Validierung
- Merkle-Root-Prüfung
- Konsensregeln
- Chainwork
- Softforks
Live-Beispiel
Die folgenden Daten stammen von meiner eigenen Full Node und zeigen einen aktuellen Bitcoin-Block in Echtzeit.
Live-Kette · letzte 20 Blöcke
Quelle: BitcoinVonInnen Node · Tip: 966981
| Höhe | Blockhash | Previous Block Hash | Tx | Größe | Zeit (UTC) |
|---|---|---|---|---|---|
| 966981 | 0000000000000000000090c998be1fe38562663b21193eee2befaa86e16233ff | 000000000000000000018558890c2811e5d78fd09a69f773811bf4cff1941cd9 | 4.038 | 1.62 MB | 14.09.26, 15:30 |
| 966980 | 000000000000000000018558890c2811e5d78fd09a69f773811bf4cff1941cd9 | 00000000000000000000e6555c903b5ff30463667ed50555599c50d4eb690350 | 3.332 | 1.60 MB | 14.09.26, 15:25 |
| 966979 | 00000000000000000000e6555c903b5ff30463667ed50555599c50d4eb690350 | 00000000000000000001450ad441ab298859580a73eedfb5590a2f05193793db | 3.961 | 1.70 MB | 14.09.26, 15:10 |
| 966978 | 00000000000000000001450ad441ab298859580a73eedfb5590a2f05193793db | 00000000000000000001acd8d622169e7e5607d10959cd01a1a99f6658187748 | 2.912 | 1.47 MB | 14.09.26, 15:02 |
| 966977 | 00000000000000000001acd8d622169e7e5607d10959cd01a1a99f6658187748 | 000000000000000000004007771c36c28f182e68158404f092ed84a76c721bca | 4.292 | 1.58 MB | 14.09.26, 14:52 |
| 966976 | 000000000000000000004007771c36c28f182e68158404f092ed84a76c721bca | 000000000000000000007a4d75d5b822efcde947e3302bfcf8bf5e073cf9837e | 3.876 | 1.64 MB | 14.09.26, 14:17 |
| 966975 | 000000000000000000007a4d75d5b822efcde947e3302bfcf8bf5e073cf9837e | 000000000000000000015d231fbd3ee79e9d1194c40db42ea19391b6cd86c67a | 4.497 | 1.59 MB | 14.09.26, 14:02 |
| 966974 | 000000000000000000015d231fbd3ee79e9d1194c40db42ea19391b6cd86c67a | 0000000000000000000205076605b4db214facf3295cd351dbcf8e9b325d2e54 | 6.116 | 1.54 MB | 14.09.26, 13:40 |
| 966973 | 0000000000000000000205076605b4db214facf3295cd351dbcf8e9b325d2e54 | 00000000000000000001f4f0dd85e0837e46f3fdc748ca048fd8c8800fc9f097 | 6.510 | 1.61 MB | 14.09.26, 13:35 |
| 966972 | 00000000000000000001f4f0dd85e0837e46f3fdc748ca048fd8c8800fc9f097 | 00000000000000000000f575fc54a9750165f6cffdafc27d74e733ac0b96a063 | 5.656 | 1.62 MB | 14.09.26, 13:33 |
| 966971 | 00000000000000000000f575fc54a9750165f6cffdafc27d74e733ac0b96a063 | 000000000000000000009fab933a3db628c6d15d18c6a983ed1e25a21bdb1d2d | 5.603 | 1.53 MB | 14.09.26, 13:27 |
| 966970 | 000000000000000000009fab933a3db628c6d15d18c6a983ed1e25a21bdb1d2d | 000000000000000000022961ceabca60ebada84fea48508d3e6eb725eac42dee | 5.159 | 1.63 MB | 14.09.26, 13:24 |
| 966969 | 000000000000000000022961ceabca60ebada84fea48508d3e6eb725eac42dee | 000000000000000000006e1c8b9c32e38b1ddf03093c002b9d284fcb00d97247 | 4.707 | 1.67 MB | 14.09.26, 13:20 |
| 966968 | 000000000000000000006e1c8b9c32e38b1ddf03093c002b9d284fcb00d97247 | 000000000000000000004b0a5148825e964568afcbac4e267f48ce4b72527faf | 4.798 | 1.87 MB | 14.09.26, 13:12 |
| 966967 | 000000000000000000004b0a5148825e964568afcbac4e267f48ce4b72527faf | 000000000000000000003a35e6e8126c3d04be2a3ae2ed9426a5a82737248a25 | 2.919 | 1.47 MB | 14.09.26, 13:09 |
| 966966 | 000000000000000000003a35e6e8126c3d04be2a3ae2ed9426a5a82737248a25 | 0000000000000000000062e9eb491272ab4464bab926db09eb6042fd1d37d20e | 3.880 | 1.59 MB | 14.09.26, 13:01 |
| 966965 | 0000000000000000000062e9eb491272ab4464bab926db09eb6042fd1d37d20e | 0000000000000000000039a707dc637b17710542b77194b4bfa3e3d5537e1ad6 | 4.219 | 1.57 MB | 14.09.26, 13:01 |
| 966964 | 0000000000000000000039a707dc637b17710542b77194b4bfa3e3d5537e1ad6 | 000000000000000000007ef193446359587b8a6cdfd2a50bf9d29ecc3b09c64a | 4.252 | 1.75 MB | 14.09.26, 12:21 |
| 966963 | 000000000000000000007ef193446359587b8a6cdfd2a50bf9d29ecc3b09c64a | 00000000000000000000ec7c4ecaa60d2a3571a9c22124673ce014cb310e184f | 5.464 | 1.44 MB | 14.09.26, 12:05 |
| 966962 | 00000000000000000000ec7c4ecaa60d2a3571a9c22124673ce014cb310e184f | 000000000000000000005b463ae81cdffaa29265b4bca5e14f3662632d1abeda | 2.999 | 1.92 MB | 14.09.26, 12:05 |