Chapitre 07 : La blockchain

La blockchain

La structure de données de la blockchain est une liste ordonnée et liée de blocs contenant des transactions. Les mineurs travaillent à ajouter un block, ce qui se produit environ toutes les 10 minutes. Chaque bloc contenir un lien vers le bloc précédent et cela se poursuit jusqu’au tout premier block (Genesis block).

Comme les transactions, chaque bock est identifié par un hash qui est le résultat de SHA256 sur l’entête du block et dans cet entête se trouve aussi le hash du block précédent. C’est ici que se trouve la clé de l’immutabilité de la blockchain. En effet, lorsque l’on calcule le hash du block courant, le contenu du block précédent fait partie du calcul : si voulez modifier un block, par exemple, le block 131, cela signifie que vous devez aussi recalculer le hash de tous les blocks qui sont au-dessus, car chaque hash de block dépend du hash du block précédent (et nous allons voir que ce n’est pas un “simple hash”).

Pour faire simple : pour changer le contenu d’un ancien bloc, vous devez recalculer TOUS les blocs qui sont au-dessus, il vous faut donc une énorme puissance de calcul, car ce n’est pas un simple calcul de hash comme nous allons le voir, mais c’est un hash très particulier que l’on trouve qu’avec beaucoup d’essais (c’est le travail des mineurs).

Imaginons le scénario suivant :

  • la blockchain en est eu bloc 746639.
  • à chaque block, pour trouver le hash, il y a environ 200 millions de TH testés par seconde.
  • toutes les 10 minutes un nouveau block est ajouté.
  • si vous voulez modifier le block 746630, cela signifie que, pendant les 10 prochaines minutes (avant qu’un nouveau block arrive), vous allez devoir calculer une nouvelle valeur de hash acceptée par le réseau pour les blocks 746630, 746631, 746632, 746633, 746634, 746635, 746636, 746637, 746638 et 746639!

Si vous ne réussissez pas dans ces 10 minutes (et que donc vous ayez plus de 2 000 millions de TH au moins de puissance de calcul), les autres mineurs, eux auront peut-être réussi à déjà produire le block 746670 et vous devrez tout recommencer ! Bref, il vous faudrait avoir investi dans une énorme puissance de calcul et j’avoue ne pas trop voir comment vous allez rentabiliser ces achats de matériel et d’électricité… à moins d’un gros short, mais très risqué et nécessitant, en amont, des fonds colossaux et du matériel spécifique acheté en grande quantité !.

Structure d’un block

Un block est fait d’un entête et d’une liste des transactions (le block 746639 a par exemple 3 103 transactions), voici sa structure :

  • Taille du block (4 bytes).
  • Entête du block (80 bytes).
  • Nombre de transactions (1–9 bytes).
  • Transactions.

Vous pouvez voir son contenu décodé avec cet outil.

L’entête contient :

  • Le numéro de version du protocole.
  • Le hash du block précédent.
  • Un arbre de Merkle (Un hachage de la racine de l’arbre Merkle des transactions de ce bloc, un résumé en fait).
  • L’heure approximative de création du block.
  • Cible de difficulté.
  • Nonce.

L’heure, la difficulté et le nonce sont liés au minage.

Qu’est-ce qu’un arbre de Merkle ?

Un arbre Merkle, également connu sous le nom d’arbre de hachage binaire, est une structure de données utilisée pour résumer et vérifier efficacement l’intégrité de grands ensembles de données. Les arbres de Merkle sont des arbres binaires contenant des hachages cryptographiques.

Un arbre merkle est construit en hachant récursivement des paires de nœuds jusqu’à ce qu’il n’y ait qu’un seul hachage, appelé racine, ou racine merkle.

Dans chaque block Bitcoin, vous avez un ensemble de transactions, ces transactions sont résumées en calculant un arbre de Merkle et celui-ci est stocké dans l’entête du block. Cette sorte d’empreinte permet notamment de vérifier très rapidement qu’une transaction se trouve dans un block.

Un arbre de Merkle se construit de bas en haut. Imaginons que vous ayez 4 transactions A, B, C, D, vous allez commencer par calculer le hash de ces 4 transactions :

Ha = SHA256(SHA256(Transaction A))
Hb = SHA256(SHA256(Transaction B))
Hc = SHA256(SHA256(Transaction C))
Hd = SHA256(SHA256(Transaction D))

On va ensuite fait les “feuilles”:

Hab = SHA256(SHA256(Ha + Hb))
Hcd = SHA256(SHA256(Hc + Hd))

Et ainsi de suite jusqu’à tout en haut, jusqu’à ce qu’il ne reste plus qu’un élément, l’arbre merkel.

Arbre merkel = SHA256(SHA256(Hab + Hcd))

Grâce à cela, en fournissant seulement une douzaine de hash, on peut prouver la présence d’une transaction dans un groupe de milliers de transactions.

Avec les arbres Merkle, un nœud peut télécharger uniquement les en-têtes de bloc (80 octets par bloc) et être toujours en mesure d’identifier l’inclusion d’une transaction dans un bloc en récupérant un petit chemin Merkle à partir d’un nœud complet, sans stocker ni transmettre la grande majorité de la blockchain, qui peut avoir une taille de plusieurs gigaoctets. Les nœuds qui ne maintiennent pas une blockchain complète, appelés nœuds de vérification simplifiée des paiements (SPV), utilisent des chemins Merkle pour vérifier les transactions sans télécharger des blocs complets.