Une conversation récente avec un ami qui travaille chez Google (hello Aurélien!) m'a rappelé opportunément que la technologie bitcoin est une invention incroyablement ingénieuse dont chaque facette gagne à être connue.
Notamment la présence d'une "racine" de Merkle dans l'en-tête de chaque blocs.
Arbre de Merkle avec sa "racine" au sommet
De quoi s'agit il et pourquoi faire ?
La racine de Merkle qu'on trouve dans l'en-tête d'un bloc est tout simplement une empreinte numérique condensée de l'ensemble des transactions du bloc.
La moindre modification d'une transaction dans le bloc modifie cette racine.
Voici comment se construit un arbre de Merkle:prenons un bloc comportant par exemple 3 transactions a, b et c.
h1 = hash(a) # où hash(a) = SHA256(SHA256(a))
h2 = hash(b)
h3 = hash(c)
h4 = hash(c) # comme nous avons un nombre impair de transactions (3), nous dupliquons la dernière, c.
Cette duplication permet d'avoir un nombre pair de feuilles sur l'arbre, même si le nombre de transactions est impair.
h5 = hash(h1+h2) # + signifie ici la concaténation des chaînes de caractères h1 et h2
h6 = hash(h3+h4)
h7 = hash(h5+h6) # h7 est la racine Merkle du bloc.
Maintenant on peut donc se demander pourquoi Satoshi n'a pas tout simplement stipuler d'inclure une empreinte numérique simple (SHA256 ou autre) de l'ensemble des transactions concaténées dans un fichier texte:
h7 = hash(a+b+c) ?
C'est qu'il a décrit dans son papier fondateur le moyen de concevoir un porte-monnaie bitcoin qui pourrait se connecter très rapidement au réseau: un tel porte-monnaie fonctionne sur un mode particulier appelé "Simple Payment Verification" ou SPV.
La structure de l'arbre de Merkle est utilisée dans le mode SPV, qui ne serait pas possible si on avait seulement un hash de l'ensemble des transaction du bloc.
Le mode SPV est utilisé par les clients légers du type Electrum ou Multibit qui, contrairement au client officiel (bitcoin-qt), ne téléchargent que les en-têtes des blocs (block headers).
Le client léger s'assure simplement que les en-têtes des blocs s'enchainent correctement les uns aux autres et que leur difficulté (nombre de zéros au début des hash de ses blocs) est suffisante par rapport au niveau de difficulté exigé par le réseau.
Ces clients ont la propriété très intéressante d'être "instant on", c'est à dire de fonctionner immédiatement sans avoir à se synchroniser bloc par bloc avec la blockchain entre deux démarrages.
Dans le mode SPV ("Simplified Payment Verification") décrit par Satoshi, le client léger se connecte à un noeud du réseau qui détient la chaîne de blocs complète.
Le client léger comporte en général un nombre limité d'adresses de réception: il demande au noeud du réseau une copie des transactions qui concernent ces adresses avec la branche de l'arbre de Merkle qui permet de relier chacune de ces transactions à la racine de Merkle du bloc où elle se trouve.
Ce mode SPV permet donc de prouver l'inclusion d'une transaction dans la chaîne de blocs sans avoir à télécharger l'ensemble du bloc où elle se trouve.