Introduction à la Blockchain
Le mot Blockchain est devenu familier. Informaticiens, juristes, économistes, sociologiques, politiques, journalistes... tous l'emploient. Pourtant, la notion de Blockchain est mal comprise. Qu'est-ce donc que la Blockchain ? Comment fonctionne-t-elle ? Quel est son intérêt ? Décryptage.
La blockchain est la technologie informatique sur laquelle repose la monnaie électronique Bitcoin. Elle a été conçue pour permettre au Bitcoin d’exister et son fonctionnement peut être compris en analysant le fonctionnement des Bitcoins.
Par souci de clarté et de simplicité, nous expliquerons le fonctionnement de la blockchain dans le contexte de la création et de l’échange de Bitcoins. Toutefois, la blockchain dépasse aujourd’hui le Bitcoin et trouve de nombreuses applications en dehors du domaine des monnaies électroniques.
L’intermédiaire dans les transactions monétaires
Pour comprendre le concept de blockchain, il faut connaître sa raison d’être : se substituer aux banques en tant qu’intermédiaire dans les transactions monétaires.
Imaginons qu’Alice souhaite obtenir un objet appartenant à Bob. Alice peut proposer à Bob un autre objet en échange : c’est du troc. Alice peut aussi offrir à Bob une somme d’argent en échange de l’objet ; dans ce cas, c’est une vente. L’argent qu’Alice donne à Bob est en réalité une créance contre une banque.
Imaginons qu’Alice ait un compte à la banque A et Bob à la banque B. Lorsqu’Alice paie Bob par Carte Bleue, ou qu’elle lui fait un chèque ou un virement, elle donne en réalité l’ordre à la banque A de prendre une certaine somme d’argent sur son compte pour la transférer vers le compte de Bob à la banque B. Une fois l’argent reçu, Bob pourra le retirer auprès de la banque B.
La banque A agit comme une autorité centrale, parce que c’est elle qui tient le compte d’Alice. Autrement dit, la banque A est la seule à connaître l’historique des transactions réalisées par Alice et le solde de son compte.
Dans ce schéma classique, les banques agissent comme des intermédiaires entre Alice et Bob, ce qui pose un problème majeur : l’intégrité des transactions repose sur les banques et la confiance qui doit nécessairement leur être accordée. En effet, pour que la transaction entre Alice et Bob ait lieu, la banque B doit interroger la banque A et vérifier si Alice dispose de suffisamment d’argent sur son compte. Si la banque A a été compromise et que l’historique des transactions du compte d’Alice a été modifié, la banque B n’a plus aucun moyen de savoir si le solde du compte d’Alice est suffisant pour payer Bob.
La blockchain a vocation à résoudre ce problème en substituant aux banques, autorités centrales, un système de vérification de l’intégrité des transactions distribué selon un modèle de pair à pair (peer to peer).
La blockchain ne nécessite pas d’autorité centrale
La blockchain supprime les autorités centrales et les remplace par une base de données répliquée sur de nombreux serveurs informatiques dans le monde. On appelle ces serveurs des nœuds. Chaque nœud dispose ainsi de l’historique complet des transactions effectuées depuis l’origine. C’est cette liste que l’on appelle blockchain.
La situation précédemment décrite, dans laquelle la banque B est obligée d’interroger la banque A parce qu’elle ne possède pas l’historique des transactions du compte d’Alice, est donc évitée. Lorsqu’Alice effectue une opération (en rouge sur le schéma), cette opération est ajoutée à la blockchain (c’est-à-dire, à la liste des opérations) de l’un des nœuds du réseau, qui se charge ensuite de la transmettre à tous les autres nœuds. Bob pourra connaître la situation réelle du compte d’Alice en interrogeant n’importe quel nœud du réseau, puisque chaque nœud dispose de la même information.
L’identification de l’auteur des transactions
L’un des rôles des banque consiste à garantir l’identité de l’auteur des transactions. Ainsi, Bob ne peut donner d’ordre de virement qu’à sa banque et sur son compte. Si Alice refuse de le payer, Bob ne peut pas contacter la banque d’Alice pour lui demander d’effectuer un virement en sa faveur.
Pour l’identifier l’auteur des transactions, la blockchain utilise le chiffrement asymétrique. Ce mécanisme repose sur la combinaison de deux clés de chiffrement :
- une clé privée (rouge sur le schéma) connue seulement d’Alice, qui peut chiffrer des transactions mais pas les déchiffrer,
- une clé publique (verte sur le schéma) qu’Alice communique à tous les nœuds de la chaîne, qui ne peut pas chiffrer les transactions et qui ne peut déchiffrer que les transactions qui ont été chiffrées avec la clé privée.
Alice étant la seule personne à pouvoir utiliser la clé privée pour chiffrer ses transactions, toute transaction pouvant être déchiffrée avec la clé publique d’Alice a forcément été chiffrée avec sa clé privée et provient donc d’Alice. Bob ne peut pas usurper l’identité d’Alice puisqu’il ne connaît pas sa clé privée ; ainsi, il peut être certain que toute transaction qu’il déchiffre avec la clé publique d’Alice provient bien d’elle.
Les informations contenues dans la blockchain étant par nature publiques et l’auteur de chaque transaction étant identifié, il est possible d’utiliser un mécanisme de blockchain pour garantir la pérennité d’une information. En cela, la blockchain pourrait jouer un rôle de notaire, de registre des brevets ou de conservation des hypothèques numérique.
L’unicité et l’intangibilité des transactions
La distribution de l’historique complet des transactions aux nœuds du réseau ne permet pas, à elle seule, de garantir l’intégrité de la liste des transactions. En effet, chaque nœud recevant une nouvelle transaction la communique automatiquement aux autres nœuds du réseau. Dès lors, il suffit de tromper un nœud en inscrivant une fausse transaction pour que l’historique soit altéré sur tous les autres nœuds. La réplication de l’historique complet sur tous les nœuds du réseau garantit la cohérence de cet historique, mais pas son intégrité.
L’intégrité de l’historique suppose que chaque opération soit à la fois unique et intangible.
Dans le système monétaire traditionnel, les banques s’assurent que ces conditions sont satisfaites. Imaginons qu’Alice doive 100 à Bob et qu’elle fasse une faute de frappe au moment de saisir le montant dans l’ordre de virement, lui envoyant 200. L’on pourrait imaginer qu’Alice annule la première transaction, puis recommence en saisissant le bon montant. Son compte ne ferait alors apparaître qu’une seule transaction : -100. Ce fonctionnement est interdit, parce qu’une opération ne peut pas être effacée : pour annuler une opération (-200), il faut réaliser l’opération inverse (+200). En réalité, trois opérations seront inscrites sur le compte d’Alice : -200, +200, -100.
Le chiffrement asymétrique précédemment décrit est utilisé pour assurer l’unicité et l’intangibilité des transactions. Puisqu’une transaction ne peut être chiffrée qu’avec la clé privée et que les différents nœuds du réseau ne connaissent pas cette clé, il leur est impossible de modifier la transaction. Ils peuvent, tout au plus, déchiffrer la transaction avec la clé publique dont ils disposent, afin d’en connaître les modalités. Dans la blockchain, annuler une transaction revient donc à la maintenir tout en ajoutant la transaction inverse.
La généalogie des transactions
Dans la blockchain, chaque transaction contient, en elle-même, sa propre généalogie.
Imaginons qu’Alice reçoive 100 de Zébulon et qu’elle décide d’utiliser cette somme pour acheter quelque chose à Bob.
Dans le système bancaire classique, deux transactions ont lieu, indépendantes l’une de l’autre, qui peuvent être ainsi formulées :
- Alice reçoit 100 de Zébulon,
- Bob reçoit 100 d’Alice.
L’indépendance des deux opérations signifie que la banque de Bob sait que les 100 viennent d’Alice, mais qu’elle ignore qu’Alice les tient de Zébulon. De la même manière, la banque de Zébulon sait que celui-ci a donné 100 à Alice, mais elle ignore que ces 100 ont ensuite été transférés à Bob. Seule la banque d’Alice, connaît à la fois l’origine et la destination des 100.
Dans la blockchain, ces deux transactions ne sont pas indépendantes. Elles seront formulées de cette manière :
- Alice reçoit 100 de Zébulon (…),
- Bob reçoit 100 d’Alice, qui avait reçu ces 100 de Zébulon.
La généalogie des transaction permet de garantir leur unicité et, partant, leur sécurité. Alice ne peut pas donner plusieurs fois les 100 qu’elle a reçus de Zébulon, que ce soit à Bob ou à quelqu’un d’autre. À cet égard, les transactions de la blockchain se rapprochent des transactions en argent liquide, puisqu’il est impossible de donner plusieurs fois la même pièce ou le même billet.
Alice pourrait toutefois donner 50 à Bob sur les 100 reçus de Zébulon. Dans ce cas, la blockchain donnera 100 à Bob et remboursera 50 à Alice. La formulation de la transaction sera un peu plus complexe : Bob reçoit 100 d’Alice, qui avait reçu 100 de Zébulon, et rend 50 à Alice des 100 qu’elle avait reçus de Zébulon.
La généalogie des transaction permet d’assurer une traçabilité des échanges depuis l’origine. À moins de corrompre la blockchain, celle-ci ne peut donc pas être détournée pour réaliser des opérations illicites de blanchiment.
La résolution des conflits de transactions
La décentralisation de la blockchain, qui est répliquée dans tous les nœuds du réseau, engendre une difficulté de synchronisation.
Imaginons qu’Alice effectue deux transactions, à quelques secondes d’intervalle, auprès de deux nœuds différents (X et Y). Alice dit au nœud X qu’elle donne à Bob les 100 reçus de Zébulon, et au nœud Y qu’elle donne ces mêmes 100 à Cain. Chacun des nœuds enregistre la transaction qui lui est indiquée et la propage dans le réseau. Un troisième nœud (Z) reçoit alors des informations contradictoires de X et Y : comment peut-il savoir s’il doit donner les 100 reçus de Zébulon à Bob ou à Cain ?
Les conflits de transactions naissent du décalage des transactions dans le temps. Pour résoudre ce problème temporel, la blockchain adopte une solution temporelle.
Les nœuds ne diffusent pas immédiatement aux autres nœuds les nouvelles transactions qu’ils reçoivent des usagers. Lorqu’un nœud reçoit une transaction, il la place dans une liste d’attente. Périodiquement, un nœud est choisi dans le réseau et l’ordre est donné à tous les autres nœuds de considérer que sa liste d’attente est valide. Lorsqu’une liste d’attente est validée par le réseau, elle devient un bloc (block). Ce bloc est rajoutée à la fin de la blockchain… qui se définit donc, littéralement, comme une “chaîne de blocs”.
Dès lors, comment choisir le nœud dont la liste d’attente sera convertie en bloc et ajoutée à la blockchain, parmi tous les nœuds composant le réseau ? Choisir toujours le même nœud aurait pour effet d’établir une autorité centrale que le mécanisme de la blockchain a précisément pour but de supprimer. Choisir un nœud aléatoire est impossible car il faudrait une autorité centrale pour effectuer ce choix et départager les nœuds entre eux…
La solution réside dans l’absence de choix : les nœuds sont placés en compétition les uns avec les autres, avec pour épreuve de trouver un identifiant unique à leur liste d’attente, ce qui constitue, en pratique, un problème mathématique complexe que les ordinateurs peinent à résoudre. Dès qu’un identifiant unique est trouvé, la liste d’attente est convertie en bloc et ajoutée à la chaîne.
L’intégrité de la chaîne
L’identifiant unique de chaque bloc garantit l’intégrité de la chaîne : il ne peut lui manquer aucun maillon.
L’identifiant unique est, en termes informatiques, une somme de contrôle (checksum). Cette somme de contrôle est produite par une fonction dite de hachage qui reçoit un certain contenu en entrée. En sortie, la fonction produit une série d’octets d’une longueur fixe, de telle manière que la moindre modification de l’entrée change la sortie. En d’autres termes, il s’agit d’une équation qui ne peut avoir qu’une seule solution.
La fonction de hachage reçoit en entrée la liste d’attente à transformer en bloc et la somme de contrôle du bloc précédent. Par conséquent, deux listes d’attente parfaitement identiques ne produiront la même somme de contrôle que si elles suivent le même bloc. Chaque bloc a donc, dans la chaîne, une place unique.
Il existe plusieurs algorithmes de hachage. Pour les besoins de la démonstration, nous avons choisi d’utiliser la fonction SHA-1.
Imaginons, par souci de simplicité, que le bloc précédent contient une seule transaction : Alice a donné 100 à Zébulon. La somme de contrôle de ce bloc est rapide à calculer. Il existe des utilitaires en ligne qui vous permettront de reproduire l’exemple, si vous le souhaitez.
Entrée de la fonction:
==========
Zébulon donne 100 à Alice, Alice donne à Bob 100 reçus de Zébulon
==========
Sortie de la fonction:
==========
822cc7a67435caffbd89582dfedc0dd2c7d9b2cd
==========
Imaginons maintenant une seconde transaction, placée en liste d’attente, destinée à rejoindre un nouveau bloc. Cette fois, c’est Bob qui donne à Cain les 100 qu’il a reçus d’Alice.
Entrée de la fonction:
==========
Zébulon donne 100 à Alice, Alice donne à Bob 100 reçus de Zébulon, Bob donne à Cain 100 reçus d'Alice
==========
Sortie de la fonction:
==========
79c27bfa946441d9106ecd65483ad1e1dbcd6448
==========
On constate immédiatement que la somme de contrôle est différente dans les deux cas. Pourtant, les deux blocs ne sont pas rattachés l’un à l’autre. Rien n’indique que le second succède au premier. Pour lier les deux blocs, la somme de contrôle du premier bloc est ajoutée en entrée de la fonction de hachage, ce qui produit une somme de contrôle différente des deux sommes de contrôle données en exemple ci-dessus.
Entrée de la fonction:
==========
<Bloc précédent: 822cc7a67435caffbd89582dfedc0dd2c7d9b2cd>
Zébulon donne 100 à Alice, Alice donne à Bob 100 reçus de Zébulon, Bob donne à Cain 100 reçus d'Alice
==========
Sortie de la fonction:
==========
209dc2e1e81a47342027c254a7ab8c4c38e0bc56
==========
Cette fois, les deux blocs sont liés et organisés de manière successive. Leur contenu et leur ordre sont inaltérables. En effet, si la première transaction est modifiée après avoir été intégrée au premier bloc, la somme de contrôle de ce bloc sera nécessairement modifiée, ce qui le rendra incompatible avec tous les blocs qui le suivent.
Pourquoi les Bitcoins doivent-ils être “minés” ?
On parle de “minage” de Bitcoins pour désigner l’opération qui consiste à déterminer la somme de contrôle à partir de la liste d’attente à valider.
Le hachage est, en principe, une opération assez rapide. Pour la ralentir, l’on a imaginé d’imposer certaines contraintes sur la somme de contrôle que la fonction de hachage doit produire, et de rajouter en entrée de cette fonction un nombre ou une chaîne de caractères que l’on appelle un nonce. L’ordinateur chargé de calculer la somme de contrôle doit ainsi tester successivement des milliers de nonces, jusqu’à ce qu’il en trouve un qui permette de générer une somme de contrôle répondant aux exigences qui ont été fixées par la blockchain.
C’est cette opération que l’on appelle le “minage” dans le vocabulaire du Bitcoin, par analogie aux mineurs de la ruée vers l’or de l’ouest américain. Le réseau Bitcoin définit les contraintes pesant sur la somme de contrôle de telle manière qu’un nonce valide est trouvé, environ, toutes les 10 minutes.
Chaque fois qu’un nœud du réseau Bitcoin trouve une somme de contrôle valable et ajoute un bloc à la chaîne, il est récompensé en Bitcoins. C’est la seule façon de créer de nouveau Bitcoins. Et c’est aussi la raison pour laquelle certaines personnes ont mis de nombreux serveurs en réseau pour augmenter leur puissance de calcul et, de cette manière, générer des Bitcoins. Ces nombreux serveurs ont toutefois un coût en électricité qui, aujourd’hui et compte tenu de la concurrence au niveau international, dépasse le gain provoqué par la création de nouveaux Bitcoins. Le réseau est ainsi fait que plus le nombre de nœuds est élevé, plus il est difficile de réunir la puissance de calcul nécessaire à la création de nouveaux blocs et, partant, à la falsification de la blockchain.
Concurrence du dernier bloc et fork de la blockchain
Le calcul de la somme de contrôle du bloc précédent débouche sur la création d’un nouveau bloc, qui est ajouté à la chaîne. Il peut arriver que plusieurs sommes de contrôle soient trouvées en même temps ou, du moins, avant que l’ensemble des nœuds se soient mis d’accord sur l’identité du dernier bloc. Tout bloc est donc vulnérable aux attaques au moment de sa création, et le reste jusqu’à ce que sa somme de contrôle soit ajouté au bloc suivant.
Lorsque les nœuds ne s’entendent pas et que plusieurs blocs sont considérés, à un instant T, comme étant le dernier bloc de la chaîne, deux chaînes concurrentes sont créées et évoluent en parallèle (fork).
En cas de fork, tous les nœuds sont tenus de conserver les deux chaînes complètes. Au bout de quelques temps, l’une des deux chaîne prend le dessus sur l’autre, qui s’interrompt. La blockchain continue alors d’évoluer avec la seule des deux chaînes qui a survécu.
Le simple fait qu’une transaction soit inscrite dans le dernier bloc n’est donc pas suffisant pour garantir son efficacité. Il est préférable d’attendre que plusieurs nouveaux blocs aient été rajoutés à sa suite, afin d’être sûr que la transaction se situe sur la bonne chaîne.