Leçons 1/4 · 20 min
Construire un arbre de Merkle
La question de départ
Un commerçant reçoit un lot de quatre paiements. Il veut une seule valeur courte qui change si n'importe lequel des quatre est modifié, et qui permette ensuite de prouver qu'un paiement précis en fait partie. Hacher la concaténation de tout le lot donne la première propriété, mais pas la seconde : pour prouver un paiement, il faudrait rendre les trois autres. L'arbre de Merkle donne les deux.
Le concept (convention jouet de cet atelier)
Règles, que tous les outils du cours appliquent :
- Feuille = SHA-256 du texte de la donnée (par exemple une transaction).
- Nœud parent = SHA-256 de la concaténation des deux empreintes enfants, en octets bruts, gauche puis droite.
- Si un niveau compte un nombre impair de nœuds, le dernier est dupliqué.
- On répète jusqu'à un seul nœud : la racine de Merkle.
Exemple détaillé : quatre transactions
Textes : tx0:Amina->Bello:20, tx1:Bello->Chantal:5, tx2:Chantal->Didier:12, tx3:Didier->Amina:7. Empreintes calculées avec SHA-256, tronquées à 8 caractères hexadécimaux pour la lecture :
| Nœud | Calcul | Début de l'empreinte |
|---|---|---|
| L0 | SHA-256(tx0) | 801c17a0… |
| L1 | SHA-256(tx1) | 251f1575… |
| L2 | SHA-256(tx2) | b25a5829… |
| L3 | SHA-256(tx3) | f62a1b13… |
| N1 | SHA-256(L0 ‖ L1) | 82bcaf46… |
| N2 | SHA-256(L2 ‖ L3) | 024b1837… |
| Racine | SHA-256(N1 ‖ N2) | 803bff37… |
Le symbole ‖ désigne la concaténation. Vous pouvez recalculer chaque ligne avec les outils : sha256 pour les feuilles, hexhash pour les nœuds (en entrant les deux empreintes complètes l'une après l'autre).
Ce que la racine garantit
- Si une seule feuille change d'un bit, sa feuille change, puis chaque nœud sur le chemin jusqu'à la racine : la racine change (effet d'avalanche, atelier 104).
- La racine dépend aussi de l'ordre des feuilles : échanger tx0 et tx1 donne une autre racine, car L0 ‖ L1 ≠ L1 ‖ L0.
- Cela suppose que SHA-256 est résistant aux collisions : on ne sait pas, aujourd'hui, produire deux entrées différentes de même empreinte.
Un cas à nombre impair de feuilles
Avec trois feuilles a, b, c : on calcule N1 = H(La ‖ Lb), puis N2 = H(Lc ‖ Lc) (c est dupliquée), puis la racine H(N1 ‖ N2). Pour cinq feuilles, la duplication intervient à deux niveaux. L'outil merkle-explorer le montre : saisissez 5 feuilles et regardez les nœuds copiés.
Ce que cela ne garantit pas
La racine ne dit rien de la validité des données (une transaction peut être frauduleuse et figurer joliment dans l'arbre), ni de leur origine : c'est une empreinte, pas une signature. Et la règle de duplication a un revers, vu en leçon 3.
En bref
- Racine = résumé de 32 octets de tout l'ensemble, sensible à chaque bit et à l'ordre.
- Feuille = H(donnée) ; nœud = H(gauche ‖ droite) ; niveau impair : dupliquer le dernier.
- La racine prouve la cohérence d'un ensemble, pas sa validité.
Outil interactif
Empreinte SHA-256
Tapez un texte : l'empreinte se met à jour à chaque caractère. Comparez avec un second texte pour mesurer l'effet d'avalanche.
Empreinte (64 caractères hexadécimaux)
…Empreinte du second texte
…Les caractères différents sont soulignés et en gras. Le texte est encodé en UTF-8 sans ajout d'espace ni de retour à la ligne.
Outil 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.
Outil interactif
Explorateur d'arbre de Merkle (jouet)
Une feuille par ligne (2 à 8). Choisissez une feuille pour voir sa preuve d'inclusion ; modifiez un texte pour voir quels nœuds changent.
5 feuilles
Les nœuds modifiés depuis la dernière saisie valide sont soulignés et marqués « modifié ». Les nœuds sur le chemin de la feuille choisie sont entourés. Dernier nœud d'un niveau impair : il est dupliqué comme son propre frère.
Convention : feuille = SHA-256(texte UTF-8) ; parent = SHA-256(gauche ‖ droite, octets bruts) ; nœud impair dupliqué. Arbre jouet : Bitcoin double le hachage et sérialise autrement.
