Leçons 1/4 · 20 min
L'en-tête d'un bloc, octet par octet
Une carte d'identité de 80 octets
Un bloc se compose d'un en-tête (petit, de taille fixe dans Bitcoin) et d'un corps (la liste des transactions). L'en-tête résume le bloc et le relie à la chaîne. Commençons par Bitcoin, dont le format est le plus simple : l'en-tête fait exactement 80 octets.
| Octets | Taille | Champ | Rôle |
|---|---|---|---|
| 0–3 | 4 | version | Jeu de règles que le mineur annonce suivre |
| 4–35 | 32 | empreinte du bloc précédent | Lien vers le parent (atelier 104) |
| 36–67 | 32 | racine de Merkle | Résumé de toutes les transactions (atelier 106) |
| 68–71 | 4 | horodatage | Secondes depuis le 1er janvier 1970 UTC, annoncées par le mineur |
| 72–75 | 4 | bits | Cible de difficulté sous forme compacte |
| 76–79 | 4 | nonce | Compteur modifié par le mineur (atelier 109) |
Les entiers de 4 octets sont en petit-boutiste : l'octet de poids faible vient en premier. L'empreinte du bloc (souvent appelée « hash du bloc ») est le SHA-256 appliqué deux fois à ces 80 octets. Dans Bitcoin, les explorateurs affichent ce résultat avec les octets en ordre inversé ; l'ordre « interne » est celui du calcul.
Lire des champs à la main
Version : les octets 00 00 00 20 lus en petit-boutiste donnent l'entier 0x20000000, soit 536 870 912 en décimal.
Horodatage : les octets 00 3c 9a 65 donnent 0x659a3c00 = 1 704 606 720 secondes, c'est-à-dire le 7 janvier 2024 à 05:52:00 UTC. (Valeur d'exemple choisie pour l'exercice, sans rapport avec un bloc précis.)
Nonce : les octets 2a 00 00 00 donnent 0x2a = 42.
L'outil bytes ci-dessous fait ces lectures pour vous : collez de l'hexadécimal, découpez des plages, lisez en petit- ou grand-boutiste, inversez l'ordre.
Le champ « bits » : la cible en format compact
Les 4 octets ff ff 00 1d se lisent 0x1d00ffff. L'octet de poids fort, 0x1d = 29, est l'exposant ; les trois suivants, 0x00ffff, sont la mantisse. La cible vaut mantisse × 256^(exposant − 3), ici 0xffff × 256^26. L'empreinte d'un bloc, lue comme un grand nombre, doit être inférieure ou égale à la cible. Une cible plus petite exige plus de zéros au début de l'empreinte affichée : c'est la difficulté.
Et ailleurs ?
Tous les réseaux n'ont pas cet en-tête. Un en-tête Ethereum contient, entre autres, l'empreinte du parent, une racine d'état, une racine des transactions, une racine des reçus, un numéro de bloc, un horodatage et des champs liés aux frais. Un en-tête CometBFT contient, entre autres, l'identifiant du bloc précédent, l'empreinte de l'ensemble des validateurs et un champ app_hash qui engage l'état de l'application. Les noms et les tailles changent ; l'idée reste la même : un petit objet qui s'engage sur tout le reste.
Ce que cela ne garantit PAS
- L'horodatage est annoncé par le mineur : il est contraint par des règles de tolérance, mais ce n'est pas une horloge exacte.
- Le champ version ne prouve pas qu'un mineur applique réellement les règles qu'il annonce.
- Une empreinte de bloc basse prouve du travail effectué, pas que les transactions du corps sont valides.
À retenir
L'en-tête est un engagement de 80 octets (dans Bitcoin) : parent, résumé des transactions, difficulté, nonce. Son double SHA-256 est l'identité du bloc.
Outil interactif
Inspecteur d'octets
Collez un hexadécimal, découpez une tranche et lisez-la comme un entier petit-boutiste ou gros-boutiste.
Longueur : 14 octets
| 0000 | 02 | 00 | 00 | 00 | 0a | 00 | 6c | 1f |
|---|---|---|---|---|---|---|---|---|
| 0008 | 4d | 5e | 1d | 00 | ff | ff |
Tranche en hexadécimal
02000000Entier non signé petit-boutiste (little-endian)
2Entier signé petit-boutiste (complément à deux)
2Entier non signé gros-boutiste (big-endian)
33 554 432Entier signé gros-boutiste (complément à deux)
33 554 432Octets en ordre inverse (hex)
00000002Date UTC de la tranche (petit-boutiste) : 1970-01-01T00:00:02Z
Par exemple l'horodatage d'un en-tête de bloc. Peut être lu depuis la tranche ci-dessus.
2009-01-03T18:15:05ZOutil interactif
SHA-256 d'octets hexadécimaux
Collez des octets en hexadécimal : le hachage porte sur les octets, pas sur le texte des chiffres. Un second champ est concaténé après le premier.
Empreinte
…Espaces, retours à la ligne et préfixes 0x sont ignorés.
