Jeder Block beginnt mit einem 80-Byte-Header. Miner hashen nur diesen Header, immer wieder, daher muss er alles im Block festschreiben.
Die sechs Felder
- Version (4 Bytes): auch für Soft-Fork-Signalisierung über Version Bits (BIP9) genutzt.
- Previous block hash (32 Bytes): verknüpft mit dem Elternblock und bildet die Kette.
- Merkle-Wurzel (32 Bytes): verpflichtet sich auf jede Transaktion.
- Time (4 Bytes): Unix-Zeitstempel. Er muss größer sein als der Median der vorherigen 11 Blöcke, und Nodes lehnen Blöcke ab, die mehr als 2 Stunden vor ihrer eigenen Uhr liegen.
- nBits (4 Bytes): das Difficulty-Ziel in kompakter Form.
- Nonce (4 Bytes): die Zahl, die Miner ändern.
Der Hash
Der Block-Hash ist SHA-256, zweimal auf den Header angewandt. Ein Block ist nur gültig, wenn dieser Hash, als Zahl gelesen, am oder unter dem Ziel liegt. Deshalb beginnen Block-Hashes mit vielen Nullen.
Nicht genug Nonce
Die Nonce hat nur etwa 4,3 Milliarden Werte, und moderne ASICs erschöpfen das in einem Bruchteil einer Sekunde. Miner ändern auch Zeitstempel, Version Bits und die extraNonce in der Coinbase-Transaktion. Eine Änderung der Coinbase ändert die Merkle-Wurzel und gibt einen frischen Suchraum.
Der Merkle-Baum
Die Transaktions-TxIDs werden paarweise gehasht, dann die Ergebnisse paarweise, bis zu einer Wurzel. Hat eine Ebene eine ungerade Anzahl, wird die letzte dupliziert. Ein Beweis, dass eine Transaktion in einem Block ist, braucht nur etwa log2(n) Hashes. Das nutzen leichte (SPV)-Wallets.
Die Duplizierungsregel verursachte CVE-2012-2459: zwei verschiedene Transaktionslisten konnten dieselbe Wurzel ergeben. Bitcoin Core erkennt solche Blöcke.
SegWits zweiter Baum
Witness-Daten sind nicht im TxID-Baum. Stattdessen enthält die Coinbase eine OP_RETURN-Ausgabe, die sich auf eine zweite Merkle-Wurzel der WtxIDs verpflichtet (BIP141). So ist der Witness auch durch Proof of Work abgedeckt.
Headers zuerst
Weil Header klein sind, kann ein Node alle herunterladen (fast eine Million Header, deutlich unter 100 MB) und den Proof of Work prüfen, bevor er Blöcke lädt.