NOUVEAU JEU CONCOURS : UNE PS5 À GAGNER CLIQUEZ ICI
Se connecter S'abonner

Plongeons dans le code du Bitcoin (BTC) : le Halving

Le Halving, cet événement qui rythme les bullruns, est l’une des clefs de la réussite du modèle Bitcoin. Il consiste à diviser en deux la prime de mining attribuée aux mineurs chaque fois que 210,000 blocs sont minés ! Il y a donc de moins en moins de Bitcoins émis, ce qui augmente indéniablement sa valeur au cours du temps, s’il se popularise.

Faisons un petit récap !

Cet article a pour objectif de proposer une vulgarisation du code source du Bitcoin responsable du Halving. Rassurez-vous, pas besoin d’être un expert en programmation pour comprendre ce qui suit ! Si ce format vous plaît, nous traiterons d’autres sujets comme la résolution de blocs ou comment les pools de mining se voient attribuer les transactions à valider. C’est parti !

Avant de rentrer dans des explications un peu plus techniques, faisons un rapide tour d’horizon. Les mineurs de la planète sont en compétition pour faire des calculs et être les premiers à en trouver le résultat. Si tel est le cas, ils peuvent réclamer une récompense, les nouveaux Bitcoins générés. Comme expliqué en intro, cette récompense est divisée par deux tous les 210.000 blocks : c’est le Halving. Rentrons un peu dans les détails !

Le mining Proof of Work, ça marche comment ?

Le consensus Proof of Work (PoW, preuve de travail en français) consiste à demander à des mineurs de résoudre des problèmes mathématiques complexes nécessitant une grosse puissance de calcul. Ces calculs effectués sont la base du système sur lequel repose la blockchain Bitcoin. En réalisant ces calculs, les mineurs valident des transactions et créent des blocs qui viennent s’attacher les uns aux autres pour créer une chaîne de blocs (block – chain). Pour expliquer grossièrement comment fonctionne ce calcul mathématique : le mineur reçoit un groupe de données auxquelles il applique un algorithme de hachage, que nous allons détailler dans la partie suivante !

Le Hachage

Les technologies blockchain sont nées d’une discipline appelée cryptographie, découlant de la cryptologie, visant à protéger des messages, souvent à l’aide de secrets ou de clefs.

Pour ce faire, les informaticiens du monde entier ont développé des fonctions appelées “fonctions de hachage”. Dans le cadre de la blockchain Bitcoin, l’algorithme utilisé se nomme “SHA256” (Secure Hash Algorithm 256 bits). Inventé par la National Security Agency (NSA) des Etats-Unis, son objectif est très simple : générer un “hash” (empreinte) unique en fonction d’un message initial.
L’exemple de Wikipédia ci-dessous illustre ce propos (l’algorithme utilisé, md5, a donné naissance au SHA256) :

mots et phrases et hash

Pour la blockchain Bitcoin, les mineurs essayent de résoudre cette fonction :

généralisation fonction de hachage

Les mineurs utilisent l’algorithme SHA256 avec ces paramètres : le “hash” du bloc précédent (previousBlockHash), les caractéristiques de la transaction du bloc actuel (newTrasnsactionHeadersToBeIncluded) et le “magic number”(c’est d’ailleurs avec ce mécanisme qu’une chaîne de bloc est formée : chaque nouveau bloc reprend le hash du dernier). Le “magic number” est également appelé un nonce (Number Used Once) et est différent à chaque itération (il peut être assimilé à un nombre généré aléatoirement à chaque fois que la fonction de hachage est utilisée).

Les mineurs appliquent donc leur fonction de hachage maintes et maintes fois pour générer des “hash”, différents à chaque fois. Pour reprendre l’exemple avec le renard ci-dessus, les données en entrée changent à chaque fois, il en sera donc de même pour la sortie de la fonction.

Pour résumer, leur objectif est de trouver un “magic number” qui leur donne le “hash” convenable. 

Mais alors, ils s’arrêtent quand ?

Une fois qu’ils trouvent un “hash” plus petit ou environ égal à la difficulté du réseau. 

Andreas M. Antonopoulos décrit très bien cette notion de difficulté de mining dans une citation : “Pour décrire le mining, on pourrait utiliser l’exemple d’un gigantesque concours de sudoku où les participants recommencent une nouvelle grille dès que quelqu’un trouve une solution, et dont la difficulté s’ajuste pour qu’en moyenne une grille soit résolue toutes les dix minutes. Imaginons une grille géante de sudoku, avec plusieurs milliers de lignes et de colonnes. Il serait assez facile de vérifier qu’une grille terminée est bien remplie. Mais […] il faudra beaucoup de travail pour la terminer ! La difficulté des grilles peut être ajustée en changeant leurs tailles […], mais elles peuvent toujours être vérifiées facilement même si elles sont très grandes. Les puzzles à résoudre dans le réseau bitcoin se basent sur les hashs cryptographiques et présentent les mêmes caractéristiques que ces grilles de sudoku : ils sont très difficiles à résoudre mais il est très facile de vérifier qu’une solution est bonne, et leur difficulté peut être ajustée.

La difficulté, dans les faits

Disclaimer : Les explications qui suivent vont vous paraître très simples, mais je vous assure que c’est aussi bête que ça !

La difficulté du réseau est déterminée par le résultat des différents hachages. Pour faire simple, la difficulté se résume au nombre de zéros qu’il y a devant le hash d’un bloc. Un hash n’est rien d’autre qu’un grand nombre dans le système hexadécimal : les chiffres ont la même valeur que dans le système décimal et les lettres de A à F valent respectivement de 10 à 15. Un rapide comparatif des “hash” au cours du temps montre bien l’augmentation de la difficulté sur le réseau ; le premier “hash” calculé ne contenait que 8 zéros : 

hash originel

Alors qu’avant le Halving de 2020, on comptait pas moins de 19 zéros devant le hash ! 

hash actuel

Pour récapituler : plus il y a de zéros, plus la valeur du “hash” est faible, et inversement plus la difficulté de mining est élevée !

Enfin, le génie de Satoshi Nakamoto dans cet algorithme réside dans la capacité du réseau à ajuster sa difficulté automatiquement. Vous en avez peut-être entendu parler, mais le réseau Bitcoin a récemment réajusté sa difficulté à la baisse, en raison du ban chinois. Je vous laisse aller lire l’article de Luc Jose Adjinacou sur le sujet pour plus de détails !

Récompense

Ok, déjà, félicitations si vous êtes arrivés jusque là ! 

Nous savons maintenant que les mineurs font la course pour trouver le bon “hash” et valider des blocs. Quand un mineur (ou groupe de mineurs) y parvient, il reçoit une récompense sous forme de Bitcoins nouvellement créés. Ces récompenses interviennent comme un remerciement de la part du réseau pour avoir participé à sa sécurisation.

Les nouveaux Bitcoins sont créés au travers d’une Coinbase Transaction, inscrite dans chaque bloc, qui rémunère les mineurs pour avoir trouvé le bon “hash” (vous l’aurez deviné, c’est probablement de là que le célèbre exchange récemment côté en bourse tient son nom).

Je ne peux pas vous épargner plus longtemps, allons mettre les mains dans le cambouis ! Après tout, c’est un peu aussi pour ça que vous êtes resté jusqu’ici … non ?

A l’attaque !

Le code du Bitcoin est, comme la quasi-totalité des projets blockchain, disponible en open source. Le projet compte des centaines de collaborateurs qui veillent à sa mise à jour et œuvrent pour renforcer la sécurité du réseau.

Le fichier src/validation.cpp renferme tous les secrets du halving. C’est dans ce fichier source que nous pouvons retrouver la fonction “GetBlockSubsidy”, traduit par “obtenir la subvention du bloc”, en charge de ce mécanisme.

La fonction, que vous retrouvez ci-après, est écrite en langage C et ne représente qu’une dizaine de lignes sur un fichier de 5065 lignes (et croyez moi, il y a un paquet de fichiers). C’est vous dire le chantier derrière tout ça !

fonction qui gère le halving, source : github/bitcoin

Bon, ça nous raconte quoi tout ça ?

Commençons par le commencement, la première ligne de la fonction (ce qu’il y a après les crochets) : 

int halving =

Le dernier paramètre de cette ligne, consensusParams.nSubsidyHalvingInterval est défini dans le fichier src/chainparams.cpp et constitue une règle du consensus. Ces règles doivent être honorées par tous les membres du réseau Bitcoin. Changer l’une de ces règles changerait le consensus de la blockchain et donnerait lieu à un “hard fork”.

Dans ce fichier, on retrouve la ligne suivante, qui définit noir sur blanc que tous les 210.000 blocs, un halving se produit :

consensus.n

Sur cette même ligne, on retrouve le paramêtre “nHeight“, qui renvoie au nombre de blocs qui ont déjà été miné. A l’heure où j’écris cet article, un peu plus de 690.000 blocs ont été miné, le calcul de cette première ligne devient donc :

int halvings = 690000 / 210000;

Le résultat de la division de 690000 par 210000 donne environ 3,29. Cependant, les trois lettres “int” devant le mot “halvings” indiquent que le résultat doit être un nombre entier, en l’occurrence “3”. Il y a donc eu 3 halvings depuis le début du projet, et le prochain aura lieu au 840 000ème bloc.

On tombe ensuite là dessus :

condition logique

On pourrait se méprendre et interpréter cette partie de la fonction comme “il y aura 64 halving du Bitcoin”. Nous verrons pourquoi, par la suite, il n’y aura que 33 halvings. De plus, ce morceau de code est apparu en 2014 pour corriger un bug. Nous ne nous attarderons pas dessus.

Les pépettes !

Ce qui intéresse les mineurs, c’est de connaître le montant de leur récompense ! Cette dernière est divisée par deux tous les 210.000 blocs, de l’anglais “cut in half”, “halving”.

Le bout de code suivant calcule la récompense à attribuer aux mineurs :

calcul des récompenses

A l’origine, chaque bloc miné rapportait 50 BTC à son mineur. En 2021, après avoir divisé cette récompense 3 fois (3 “halvings”), nous sommes rendus à 6.25 BTC par bloc miné. Un rapide calcul nous permet de comprendre que 10 500 000 BTC ont été générés avant le premier “halving” (315 milliards de dollars au prix actuel du marché, elle est pas belle la vie ?).

Ensuite, dans le morceau de code ci-dessus, la variable “nSubsidy” contient le nombre de Bitcoins que va recevoir le mineur (cette valeur est renvoyée au reste du programme dans la troisième ligne grâce au mot clef “return”). Pour être  plus précis, il faudrait plutôt dire que chaque coin est divisé en 100,000,000 d’unités, définies dans le fichier src/amount.h. Chaque mineur reçoit donc 50 * 100,000,000 fragments de Bitcoin.

Remplaçons dans le calcul, les variables avec tout ce que nous avons calculé jusque là :

les calcules se poursuivent

Nous avons ici remplacé la valeur de “COIN” par 100000000 (cf. paragraphe précédent) et “halvings” par 3 (cf. calcul un peu plus haut “int halvings”).

Analysons !

La variable nSubsidy vallait donc à l’origine 50 * 100000000 = 5,000,000,000 fractions de Bitcoin = 50 BTC. On est bon !

Pour comprendre la ligne suivante, il convient de tout convertir en binaire, ce qui donne :

100101010000001011111001000000000

La ligne nSubsidy >>= 3 veut dire : déplacez les bits de 3 crans vers la droite, ce qui nous donne la valeur binaire suivante :

100101010000001011111001000000

Quand on transforme cette valeur binaire en décimal, on tombe sur 625,000,000 (je vous laisse vérifier par vous même). Cette valeur est toujours en fragments de Bitcoin, qui lorsque l’on divise par 100,000,000 (valeur de COIN) nous ramène bien à 6.25 BTC, la récompense actuelle. On décale donc à droite la valeur binaire pour en diviser sa valeur ! On décalera encore d’un cran au prochain halving etc.

Je vous ai dit plus haut qu’il n’y aurait que 33 halvings. La raison paraît maintenant un peu plus évidente : la valeur binaire initiale de nSubsidy est sur 33 bits ! Arrivera un moment où nous ne pourrons plus décaler sa valeur à droite, après le 33ème halving, estimé pour l’an 2140 !

Conclusion

Toujours avec moi ? Nous arrivons au bout de cet article ayant pour objectif d’effleurer la dimension technique du Bitcoin. Je ne sais pas pour vous, mais je suis un peu fasciné par le fait qu’une fonction aussi minime et simpliste soit responsable d’un bouleversement tous les 4 ans dans l’écosystème blockchain ! Le code du Bitcoin regorge de mécanismes comme celui du Halving et j’espère que nous aurons l’occasion de parcourir à nouveau le code source de la crypto leader !

Plus d’actions
Partagez

Passionné d’innovation et de projets disruptifs, les technologies Blockchain ont rapidement attiré mon attention ! Je prends plaisir à évoluer dans cet écosystème bouillonnant et à en découvrir toutes ses facettes ! Pourquoi ne pas partager cela avec vous ?

DISCLAIMER
Les propos et opinions exprimés dans cet article n'engagent que leur auteur, et ne doivent pas être considérés comme des conseils en investissement. Effectuez vos propres recherches avant toute décision d'investissement.
Back To Top

Newsletter

Recevez le meilleur de l’actualité Crypto dans votre boite email

Inscription Newsletter

Archives

Lire les dernières Newsletters
Cliquez ici

Coaching Gratuit

Obtenez gratuitement un coaching
d'une heure avec un expert
Remplissez le formulaire
et notre expert vous contactera 
sous 24 heures

© Copyright Cointribune - tous droits réservés

Agence Tempo