Blockchain: Une introduction technique

INTRODUCTION

Tout le monde a déjà entendu parler de la blockchain, pourtant très peu de personnes sont capables d’expliquer comment elle fonctionne ;)

Une blockchain est en fait constituée d’éléments très simples qui peuvent être expliqués en quelques minutes. Nous allons le faire de manière très visuelle, en utilisant blockchaindemo.io et anders.com/blockchain afin d’illustrer chaque principe séparément.

Nous verrons que la blockchain est en fait un assemblage très intelligent de briques techniques cryptographiques qui existent déjà depuis de nombreuses années, voire plusieurs dizaines d'années pour certaines. Toute la beauté de la blockchain est d’avoir su organiser ces briques de manière cohérente pour créer un système d’échange de données décentralisé et sûr.

1- HASH

Commençons par la base, le hash. Un hash est un nombre souvent hexadécimal calculé à partir d’une donnée. Il représente en quelque sorte une empreinte digitale servant à identifier rapidement la donnée initiale. Il existe plusieurs fonctions de hachage. La plus commune est le SHA256, utilisée entre autres par le Bitcoin. L’algorithme SHA256 transforme n’importe quelle chaîne de caractères en un nombre hexadécimal de 64 caractères (ou 256 bits). Par exemple, la fig. 1 montre le hash de la chaîne très courte “OCTO” et la fig. 2 montre le hash d’une chaîne beaucoup plus longue, l’article de 1200 mots sur le secteur d’activité d’OCTO. Remarquez que les deux hashs sont totalement différents, mais toujours de 64 caractères. De la même manière, vous pourriez taper l’ensemble des ouvrages d’une bibliothèque, ou bien rien du tout (chaine vide), et vous auriez un hash de 64 caractères. Notez que pour deux chaînes identiques vous aurez toujours le même hash, et que pour deux chaînes différentes vous aurez toujours deux hashs différents (à quelques collisions près, mais cela est extrêmement improbable). Cela vous permet de rapidement vérifier que la donnée initiale n’a pas été modifiée.

Fig. 1: Le hash d’une petite chaîne de caractères.

Fig. 2: Le hash d’une grande chaîne de caractères.

2- BLOC

Un bloc est simplement une structure contenant son numéro de bloc, de la donnée (data), un numéro arbitraire appelé NONCE (diminutif de Number used ONCE), et le hash de toutes ces données. La fig. 3 représente un exemple de bloc. Remarquez que le hash commence par 27f. Ce bloc est considéré comme non signé. Pourquoi? Il existe différentes règles de validation d’un bloc selon la blockchain considérée. La plupart des blockchains utilisent une preuve de travail qui consiste a prouver qu’un travail de validation a été effectuée sur le bloc.

Par exemple, une règle de validation très utilisée est que le hash doit commencer par 000. Le bloc va donc devoir être miné, c’est-à-dire qu’il va falloir trouver un NONCE tel que le hash du bloc commence par 000. Notez que ce choix est totalement arbitraire. Les concepteurs d’une blockchain peuvent par exemple choisir que le hash doive commencer par 123 ou que le hash en base 10 soit inférieur à 1000 (cas de l’Ethereum). Il faut simplement une règle qui prouve qu’un travail de validation a été effectué sur le bloc. Quand la règle est validée, le bloc est alors signé.

Dans notre exemple fig. 4, nous allons simplement incrémenter NONCE et recalculer le hash jusqu'à ce que l’on obtienne un hash commençant par 000. Ce processus n’est pas fixe en temps, il peut être très court ou très long, car chaque essai de NONCE est équiprobable. En l'occurrence, nous devons incrémenter le NONCE jusqu’à 2958. Le bloc est maintenant signé.

Miner consiste donc à calculer le hash encore et encore jusqu'à ce que la règle de validation soit validée. C’est pour cela qu’il est possible de créer des ASIC (Application Specific Integrated Circuit) optimisés pour le minage. Pour le Bitcoin, les ASIC intègrent des puces spécifiquement conçues pour faire du SHA256 afin de trouver le NONCE très rapidement.

Notez enfin que si l’on tente de modifier quoi que ce soit dans un bloc signé, il perd sa signature, car le hash change et il faut de nouveau miner le bloc pour trouver un nouveau hash commençant par 000.

Fig. 3: Le hash de DATA, du NONCE et du numéro de block ne commence pas par 000, le bloc est non signé

Fig. 4: Le hash de DATA, du NONCE et du numéro de bloc commence par 000, le bloc est signé

3- BLOCKCHAIN

Vous comprenez maintenant ce qu’est une blockchain. Il s’agit simplement d’une liste de blocs pour lesquels chaque bloc contient une référence au bloc précédent : son hash. Ils sont donc “chaînées”. À la fig. 5, vous pouvez voir que le bloc #2 contient sa data, son NONCE, son numéro de bloc et en plus le hash du bloc précédent #1. Pour signer le bloc #2, on le mine pour trouver un hash commençant par 000, puis le hash est utilisé par le bloc #3 que l’on mine, etc.

Vous comprenez donc que si on change quoi que ce soit dans un bloc, ce bloc et tous les blocs suivants perdent leur signature. Par exemple, si je change super par top dans la data du bloc #2, son hash change et le bloc n’est plus signé. Puisque la liste est chaînée, le nouveau hash du bloc #2 se retrouve dans le bloc #3 qui à son tour change de hash. Le bloc #3 n’est plus signé, etc. L’ensemble des blocs qui suivent ne sont plus signés (voir fig. 6). Il est donc très facile de savoir si la moindre information d’une blockchain a été changée et dans quel bloc.

Il est cependant possible de miner à nouveau ces blocs non signés depuis le dernier bloc signé et revalider l’ensemble de la chaîne (voir fig. 7). Mais alors, si on peut resigner les blocs, peut-on altérer une blockchain? Non, déjà parce que miner un bloc est très demandeur en puissance de calcul. Pour le Bitcoin, miner un bloc demanderait plusieurs années à votre ordinateur de bureau. D’autant que plus vous remontez dans le temps et modifiez un bloc ancien et plus vous aurez de blocs à miner.

Cependant, c’est surtout grâce à son aspect distribué que la blockchain est véritablement sûre et immuable.

Fig. 5: Une blockchain valide (tous les blocs sont signés)

Fig. 6: Une blockchain invalide (certains blocs ne sont pas signés à cause de la modification de la data)

Fig. 7: Une blockchain de nouveau valide (tous les blocs suivant la modification ont étés de nouveau signés)

4- DISTRIBUTION

Toute blockchain est distribuée, c’est-à-dire que l’ensemble des blocs signés est répliqué sur tous les nœuds du réseau.

Comme tout le monde, vous pouvez, si vous le souhaitez, utiliser votre ordinateur pour en faire un nœud. Pour cela, vous devez télécharger l’ensemble des blocs signés jusqu'à présent. Pour le bitcoin, cela représente déjà plus de 180 giga-octets.

Quand un nœud arrive à signer un nouveau bloc en premier, ce dernier est ajouté à la blockchain de tous les autres nœuds du réseau de manière à toujours avoir une blockchain à jour partout sur le réseau. Il y a énormément de nœuds dans le monde et ils ont tous une copie complète de la blockchain.

Quand l’un d’entre eux décide de modifier frauduleusement un bloc, par exemple le bloc #2 du nœud C de la fig. 8, cela se voit immédiatement par les autres noeuds (A et B) car le hash du dernier bloc de leur chaîne est différent du hash du dernier bloc de C. Même si le nœud C re-signe l’ensemble de ses blocs, le hash final sera quand même différent des autres nœuds. Il n’y a aucun moyen de changer la data d’un bloc tout en préservant le même hash que le reste du réseau. La blockchain incorrecte ne correspondant plus à la majorité des autres blockchains minées par les autres nœuds, ce bloc va devenir orphelin, et ne sera pas intégré au registre général.

Un moyen de corrompre une blockchain est par la fameuse “attaque à 51%” dont vous avez peut-être déjà entendu parler. Il s’agit pour un pirate de posséder plus de 50% de la puissance de minage mondiale. Il devient alors la majorité lors de l'opération de contrôle du bloc par rapport au reste du réseau. Le bloc corrompu deviendra officiel et le pirate pourra manipuler la blockchain pour effectuer des transactions frauduleuses.

Heureusement, obtenir 51% de la puissance mondiale de minage pour les blockchains populaires est très difficile (cela coûterait plusieurs milliards pour le Bitcoin). Cependant, pour les blockchains moins populaires (avec moins de noeuds), cela est tout à fait faisable et se produit d’ailleurs assez régulièrement. Certaines blockchains tentent de résoudre ce problème en implémentant des algorithmes de consensus différents qui n’impliquent pas de minage.

Voilà, vous connaissez maintenant comment fonctionne une blockchain!

Fig. 8: La blockchain est identique sur tous les nœuds du réseau sauf quand un pirate essaye de la modifier. On voit ici que le nœud C tente de modifier la data du bloc #2

5- TOKENS

Quand on parle de blockchain, on ne parle pas forcément de crypto-monnaies. Remarquez que jusqu'à présent, la data stockée dans les blocs de nos exemples étaient de simples chaînes de caractères. On peut stocker tout type de données : des identités, des documents électroniques, des contrats d’assurance, etc. Cependant, si on y stocke des transactions financières comme aux fig. 9, 10 et 11, on a alors effectivement une crypto-monnaie et on pourra y échanger de l’argent, sous forme de tokens. Mais l’inverse n’est pas vrai. On peut vraiment stocker tout type de données dans une blockchain. Vous imaginez donc qu’il existe de nombreux domaines d’application pour la blockchain. À chaque fois qu’il est nécessaire d’avoir un système d'échange sécurisé et de traçage de données entre parties sans totale confiance sur un réseau non sécurisé, vous devriez vous poser la question d’une éventuelle utilisation d’une blockchain.

Précisons qu’il existe des blockchains publiques (Bitcoin, Ethereum,...) et des blockchains privées, appelées DLT pour Distributed Ledger Technology, car elles n’engagent pas toujours une structure de donnée Blockchains à proprement parler, mais seulement quelques composants clés, comme la signature électronique.

Chez OCTO, nous utilisons beaucoup les blockchains Ethereum, Corda et Hyperledger Fabric afin de tracer, suivre, partager et sécuriser non seulement les transactions financières, mais aussi les processus de fabrication, les chaînes d'approvisionnements, les contrats d’assurance et bancaires et tout autre processus d’échanges complexes entre plusieurs acteurs.

Dans la suite de cet article nous allons considérer uniquement une blockchain crypto-monnaie de type Bitcoin.

Remarquez aux fig. 9, 10 et 11 que la data contient des transactions du type “$40.27 from Elizabeth to Jane”. On désigne par $ une valeur monétaire qui n’est pas forcément du dollar, mais qui pourrait être n’importe quel token, tel que du Bitcoin, de l’Ethereum, etc.

Cependant, dans notre exemple, comment sait-on que Elizabeth a assez d’argent pour envoyer $40.27 à Jane ?

La blockchain Bitcoin ne contient pas de registre montrant à tout moment le solde de chaque compte. Au lieu de ça, lorsque Elizabeth tente d’effectuer une transaction, le processus va remonter le temps dans la blockchain et calculer la différence entre toutes ses transactions entrantes et toutes ses transactions sortantes afin d’en déduire le maximum d’argent que Elizabeth peut envoyer.

Fig. 9: Un bloc contenant des transactions financières

Fig. 10: Une blockchain contenant des transactions financières

Fig. 11: Une blockchain distribuée contenant des transactions financières, ou crypto-monnaies

6- COINBASE

Vous comprenez maintenant comment la blockchain est capable de calculer le solde de chaque personne et d'autoriser ou non ses transactions. Cependant, d'où vient tout cet argent “stocké” dans la blockchain? Si nous remontions complètement la blockchain jusqu’au premier bloc, il y aurait bien un moment où de l’argent a été introduit pour la première fois. Si les montants étaient uniquement calculés à partir des transactions entre utilisateurs, il n’y aurait aucune création de nouveau token. Il y aurait 0 bitcoin…

En fait, de nouveaux bitcoins sont générés par la blockchain quand un nouveau bloc est signé et ces nouveaux tokens sont donnés au premier mineur qui a signé le bloc. À la fig. 12, vous pouvez voir que $100 sont créés de toute pièce et donnés à Anders pour le remercier d’avoir investi sa puissance de calcul à miner un bloc. On appelle cela la reward ou coinbase. Anders est alors capable de dépenser cet argent comme s'il l’avait reçu d’un autre utilisateur. C’est ce processus qui permet de mettre en circulation des nouveaux tokens, de la même manière qu’une banque centrale est capable d’imprimer de nouveaux billets. L’avantage d’une blockchain par rapport à une banque centrale est que le processus est complètement autonome et inaltérable. Il n’est pas possible d’avoir de surinflation.

Cependant, il y a un encore un gros problème dans notre schéma de blockchain. Êtes-vous à ce stade capable de l’identifier? Sachant qu'Elizabeth a un solde positif de $50, est-ce que Jane pourrait ajouter la transaction “$40.27 from Elizabeth to Jane” elle-même à un nouveau bloc sans qu'Elizabeth donne son accord ? À ce stade, n’importe qui semble être capable de dépenser l’argent de n’importe qui d’autre !

Fig. 12: Un bloc avec sa coinbase/reward a Anders, qui lui permet de faire des transactions.

7- CLÉS

Il est essentiel pour le bon fonctionnement de la blockchain que seule Elizabeth soit capable d’envoyer la transaction “$40.27 from Elizabeth to Jane”. Pour cela, nous allons avoir besoin d’un mécanisme cryptographique de clé privée et clé publique.

La fig. 13 montre une paire de clés. La clé privée est un nombre hexadécimal très long généré aléatoirement (vous pouvez le faire vous-même). La clé publique est un nombre hexadécimal qui est calculé à partir de la clé privée. Il est possible de calculer la clé publique à partir de la clé privée, mais l’inverse n’est pas vrai. Il est pratiquement impossible de retrouver la clé privée à partir de la clé publique.

Comme son nom l'indique, la clé privée doit rester privée. Vous ne devez jamais la communiquer à qui que ce soit. Par contre, la clé publique doit être publique et accessible à tous. Pourquoi ?

Fig. 13: Une clé privée que l’on a choisie aléatoirement et la clé publique associée générée par l’algorithme cryptographique

8- SIGNATURES

La clé publique va permettre de vérifier nos signatures. En effet, notre clé privée va servir à générer des signatures pour nos données. La fig. 14 montre une signature générée par notre clé privée pour le message “Bonjour les OCTOs”. Remarquez que si nous changeons le message, la signature change.

Fig. 14: On signe notre donnée avec notre clé privée

Maintenant, si l’on donne à quelqu’un notre message et notre signature, cette personne est capable de vérifier l’authenticité du message. Comment ? Simplement en allant chercher notre clé publique et appliquer l’algorithme de vérification cryptographique sur le message et sa signature. Rappelons que la personne n’a pas accès à notre clé privée, mais en utilisant uniquement la clé publique, l’algorithme cryptographique va lui dire “Oui, ce message a bien été écrit par la personne possédant la clé privée” (voir fig. 15) et garantit qu’il n’a pas été modifié par un tiers auquel cas la signature ne serait plus valide (voir fig. 16).

Fig. 15: Grâce à la clé publique et la signature, n’importe qui peut vérifier que cette donnée a bien été émise par le détenteur de la clé privée...

Fig. 16: ...ou inversement, que la donnée a été altérée ou ne provient pas du détenteur de la clé privée.

9- TRANSACTIONS

Maintenant, au lieu d’utiliser une simple chaîne de caractères dans la data, nous allons-y insérer une transaction ! La transaction aura notre clé publique en tant qu'émetteur, et la clé publique du destinataire, et nous signons cela avec notre clé privée. Voir fig. 17 en exemple.

La blockchain est maintenant capable d'utiliser notre clé publique pour vérifier que nous sommes bien à l’origine de cette transaction (fig. 18), que nous sommes bien l'expéditeur et que la transaction n’a pas été altérée par un tiers.

Fig. 17: On signe notre transaction avec notre clé privée

Fig. 18: La blockchain vérifie que cette transaction a bien été envoyée par le propriétaire de la clé privée

10- BLOCKCHAIN COMPLÈTE

Revenons à notre schéma non sécurisé de blockchain fig. 10 sauf que maintenant toutes les transactions sont signées par leur expéditeur respectif (fig. 19, 20 et 21). Chaque transaction possède la signature de l'expéditeur. Remarquez que l’on ne marque plus des noms de personnes ($11.00 from Anders to Elizabeth) mais des clés publiques ($11.00 from bc8c66ac158de287272 to d3029db8bbb2db17de20)

Si un pirate essaye de changer par exemple la valeur du montant d’une transaction, deux choses se produisent:

- le bloc n’est plus signé car le hash a changé, comme nous l’avons vu au chapitre 5

- la signature change et ne vérifie plus cette transaction !

Si on mine encore le bloc, il sera de nouveau signé mais la signature de cette transaction reste invalide. Il est impossible de valider à nouveau la transaction sans avoir la clé privée de l'expéditeur de la transaction.

C’est ainsi que les transactions dans la blockchain sont protégées en permettant uniquement à l'expéditeur de signer ses transactions, et cela marche parfaitement.

Finalement, pour recevoir et envoyer de l’argent, il vous suffit de générer une paire de clés, et c’est tout ! Il n’y a pas besoin d’ouvrir un compte chez une banque ou de prouver son identité auprès d’une entité centralisée, ou toute autre démarche qui pourrait être censurée. La blockchain est résistante à la censure. N’importe qui peut envoyer et recevoir de l’argent !

Fig. 19: Un bloc complet

Fig. 20: Une blockchain complète

Fig. 21: Une blockchain complète et distribuée

CONCLUSION

Félicitations, vous faites désormais partie du 0.01% de la population capable d'expliquer comment fonctionne une blockchain. Merci OCTO :)