Comment fonctionne le Bitcoin ?

Nous allons étudier les rouages du Bitcoin : comment fonctionne cette crypto-monnaie, quels sont ses mécanismes internes ?

Fonctionnement d'un paiement avec Bitcoin

Le terme « Bitcoin » désigne à la fois une monnaie numérique décentralisée et le protocole informatique (i.e les règles internes de fonctionnement) qui permet de gérer cette monnaie.

Dans une architecture centralisée, il existe toujours une autorité de confiance chargée de l'exécution et la vérification de la validité d'une transaction. Prenons l'exemple d'Alice et Bob. Si Alice veut effectuer un virement sur le compte de Bob, elle doit se connecter sur le compte de sa banque et ordonner le virement. C'est la banque qui vérifie qu'Alice dispose bien des fonds qu'elle veut transférer, et elle est garante de la bonne exécution du transfert monétaire. Le transfert peut ainsi prendre plusieurs jours, et l'intermédiaire peut se sucrer au passage en prélevant des frais de transaction.

Pour changer des sempiternelles icônes impersonnelles, le rôle d'Alice sera joué par un ourson tandis que Bob sera M. Patate. Je vous laisse deviner qui joue le rôle du banquier (les icônes proviennent du projet Tango.

Schéma d'une transaction financière dans un système centralisé
Dans un système financier centralisé, il existe toujours un intermédiaire de confiance.

Avec Bitcoin, les transferts se font directement de personne à personne ; si Alice veut envoyer des Bitcoins à Bob, elle déclenche une transaction, et Bob recevra les Bitcoin en quelques minutes. Il n'existe pas d'autorité centrale, pas de serveur centralisé, et aucun nœud du réseau Bitcoin n'est plus important que les autres.

Un réseau Bitcoin décentralisé
Dans un réseau décentralisé, aucune entité n'est plus importante qu'une autre.

Ce fonctionnement n'est pas sans présenter quelques problèmes techniques :

  • comment s'assurer que la transaction est valide, i.e qu'Alice dispose bien des Bitcoins qu'elle veut envoyer à Bob ?
  • comment s'assurer qu'Alice ne pourra dépenser qu'une fois et une seule ses Bitcoins ?
  • s'il n'y a pas de serveur centralisé, où sont stockés les soldes des comptes d'Alice et Bob ?

Nous allons répondre à ces questions en étudiant de plus près le fonctionnement du protocole Bitcoin.

Les adresses Bitcoin

Pour envoyer et recevoir des Bitcoins, il faut disposer d'une ou plusieurs adresse Bitcoin. De la même manière qu'on peut envoyer des e-mails à une adresse e-mail, on peut envoyer des Bitcoins à une adresse Bitcoin.

Ce genre d'adresse peut être créé très simplement avec un logiciel de portefeuille Bitcoin.

Voici un exemple d'adresse Bitcoin que je viens de générer d'un clic : 1J3BnzUeHubrjdMuBjSPtpUy2wv7RchNyy. Tout le monde peut librement envoyer des Bitcoins à cette adresse.

Comment puis-je dépenser les Bitcoins que l'on m'envoie ? Il faut tout simplement connaître la clé privée correspondante. Bitcoin utilise la cryptographie asymétrique, ou cryptographie à clé publique. Une adresse est en fait un simple couple clé publique / clé privée.

Voici la clé (plus du tout) privée correspondante : 5Jd4kDBTJnDmQwLv94gjWheWwsrvmRMGfLj438BBLdRtw4axSAy. Toute personne connaissant cette clé peut librement dépenser les Bitcoins disponibles sur cette adresse (ne vous fatiguez pas, il n'y a rien dessus).

Il est possible de retrouver une adresse publique à partir de la clé privée. L'inverse est impossible, c'est le principe même de la cryptographie asymétrique.

On se rend bien compte que conserver sa clé privée en lieu sûr est primordial. Une adresse Bitcoin n'est pas nominative. Si quelqu'un connaît l'adresse, il peut dépenser les Bitcoins. Si vous notez l'adresse et qu'elle se fait prendre en photo, ou si elle passe à la télé lors d'une interview, boum ! Adieu vos Bitcoins !

Et si je perds ma clé privée? Mes Bitcoins sont perdus ! Définitivement ? Et oui ! Ils sont d'ailleurs perdus pour tout le monde puisqu'ils ne pourront jamais être récupérés par personne. Rassurez-vous, vous ne serez jamais aussi malheureux que le type qui a balancé un vieux disque dur contenant pour 7 millions de dollars de Bitcoin à la décharge.

En pratique, pour envoyer des Bitcoins, j'ouvre mon portefeuille Bitcoin, je clique sur « Envoyer », je rentre l'adresse, et boum ! Mais au niveau du protocole, que se passe-t-il vraiment ? We need to go deeper.

Les transactions

Il est important de comprendre qu'un Bitcoin en tant que tel n'existe pas. Une adresse Bitcoin ne « contient » pas vraiment de Bitcoins, et il n'existe pas de fichiers quelque part qu'on pourrait pointer du doigt en disant « mes Bitcoins sont là dedans ».

Les Bitcoins ne sont en fait que le résultat de suites de transactions. Pour connaître le solde en Bitcoins d'une adresse, il faut faire le total de toutes les transactions Bitcoin impliquant cette adresse jamais effectuées.

Ce qui répond à la question « où sont stockés les soldes des comptes d'Alice et Bob ? ». À chaque fois qu'Alice effectue une transaction, cette transaction est diffusée à travers le réseau pour être ajoutée à la liste de toutes les transactions Bitcoin jamais effectuées depuis l'apparition des dinosaures. Chaque nœud Bitcoin, qui conserve une copie de cette liste, connaît donc le solde de chaque adresse Bitcoin ayant déjà été utilisée.

Mais alors, tout est public ? Et la vie privée d'Alice ? Nous verrons ça plus loin, dans le paragraphe judicieusement intitulé « Confidentialité et vie privée ».

Arrêtons nous sur le fonctionnement d'une transaction. Lorsque Alice envoie des Bitcoins à Bob, son client Bitcoin va forger une structure de donnée appelée « transaction » (c'est pratique). Cette structure de donnée contient :

  • des entrées ;
  • des sorties.

Une transaction ne traite pas directement des adresses (« envoie X Bitcoins de l'adresse A vers l'adresse B ») mais plutôt des transactions antérieures (« envoie vers l'adresse B X Bitcoins qui proviennent de ces autres transactions »).

Par conséquent, les entrées sont des références à des transactions existantes, qui indiquent d'où proviennent la somme totale qui va maintenant être dépensée. Alice ne peut évidemment référencer que des transactions qui créditent des adresses dont elle possède la clé privée.

Chaque sortie est une somme envoyée vers une adresse. Le solde d'une adresse est égal à la somme des sorties vers cette adresse qui ne sont pas référencées par des transactions ultérieures (c'est clair ?).

Une transaction Bitcoin
Illustration d'une transaction Bitcoin

Le total des entrées doit être égal au total des sorties. Si la somme des entrées est plus importante que la somme qu'Alice souhaite envoyer, alors l'une des sorties doit re-créditer l'adresse d'Alice avec le reste de la transaction.

Une fois la transaction forgée, elle va être chiffrée (et pas cryptée) grâce à la clé privée d'Alice, et envoyée sur le réseau Bitcoin. Chaque nœud va vérifier, grâce aux différentes signatures et à la clé publique d'Alice, que la transaction est valide. Si c'est le cas, elle sera ajoutée à la « Grande Liste Sacrée des Transactions » et propagée de nœud en nœud.

Ça paraît un peu complexe, et ça l'est assurément. Et encore, j'ai un peu simplifié la chose pour vous éviter des migraines.

Le problème de la double dépense

Tout ceci est bel et bon. Néanmoins, que se passerait-il si Alice n'était pas honnête et forgeait deux transactions en même temps en débitant la même adresse deux fois ?

Prenons un exemple concret. Alice dispose d'une adresse A créditée d'un solde de 5 BTC (Bitcoins). Hacker consommée, elle modifie le code source du client Bitcoin pour limiter les contrôles embarqués, et forge deux transactions en même temps.

Dans une première transaction T1, elle envoie 5 BTC de son adresse A à Bob. Dans une seconde transaction T2, elle envoie 5 BTC de son adresse A à Carole.

Ces deux transactions sont bien évidemment incompatibles, mais restent parfaitement valides prises individuellement.

Imaginons maintenant qu'Alice envoie T1 à un nœud Bitcoin N1, et T2 à un nœud Bitcoin N2. Chaque nœud va reconnaître la transaction reçue comme valide, et la propager aux nœuds proches. Au bout du compte, la moitié du réseau Bitcoin pense qu'Alice a envoyé 5 BTC à Bob, l'autre moitié que c'est Carole qui a été créditée. Il faut prendre une décision, car une seule de ces deux transactions peut être valide. Que faire ?

Illustration du problème de la double-dépense
Le réseau est divisé : c'est le problème de la double-dépense.

C'est là que réside la génialité (j'invente des mots si je veux) de Bitcoin, qui permet d'atteindre un consensus distribué et éviter ainsi le principe de la double dépense. Pour ce faire, on utilise une structure de données supplémentaire appelée la chaîne de blocs (blockchain).

Les blocs et la chaîne de blocs

J'ai volontairement simplifié l'intégration des transactions dans la base de données distribuée Bitcoin pour éviter à vos neurones de griller trop rapidement. La vérité est qu'il ne suffit pas qu'une transaction soit valide pour qu'elle puisse être prise en compte par le réseau.

Pour être entérinée, chaque transaction doit d'abord être incluse dans un bloc de transactions. Un bloc n'est rien d'autre qu'une structure de données qui contient une liste de transactions récentes ainsi qu'un hash du bloc précédent. Chaque nouveau bloc est donc ajouté tout au bout d'une longue chaîne de blocs (blockchain) qui remonte jusqu'aux origines de Bitcoin, quand le premier bloc a été créé par les inventeurs du protocole.

Illustration d'une chaîne de blocs de transactions
Chaque transaction fait partie d'une bloc de transactions.

On voit que, d'une manière qui rappelle très fortement Git, le contrôle d'intégrité des blocs est inclus dans la structure de données même. Un nœud ne pourrait pas modifier en douce une transaction sans faire changer le hash du bloc, ce qui invaliderait du coup tous les blocs suivants.

Lorsqu'Alice créé une transaction, celle-ci se diffuse de nœud en nœud dans le réseau. Chaque nœud s'attache à créer un bloc avec toutes les transactions valides reçues récemment. Quand un bloc est créé, il est immédiatement transmis de nœuds en nœuds.

Quand un nœud reçoit un bloc en provenance d'un autre nœud, il commence par stopper son propre travail de création de bloc. Si le nouveau bloc est valide, il est intégré à la chaîne de blocs, et le travail reprend sur cette nouvelle base. En quelques minutes, l'information s'est propagée et tous les nœuds ont intégré ce nouveau bloc tout en haut de leur copie locale de la chaîne de blocs.

Évidemment, une transaction ne peut être incluse que dans un seul bloc.

« Qu'est-ce qui empêche chaque nœud de créer ses propres blocs ? » me demanderez vous ? En fait, créer un bloc est rendu volontairement très difficile pour qu'un nouveau bloc ne puisse être créé qu'une fois toutes les 10 minutes en moyenne sur l'ensemble de tout le réseau Bitcoin.

Le minage de blocs

Le procédé qui consiste à créer un bloc à partir d'une liste de transactions s'appelle le minage. Le minage consiste à trouver une valeur arbitraire (nonce) qui, intégrée au contenu du bloc, produise un hash ayant une certaine caractéristique.

Une petite illustration sera beaucoup plus parlante.

Illustration du minage de bloc

Le but ici est de trouver une valeur de nonce telle que le hash du bloc commence par un certain nombre de zéros. Par exemple, voici le hash du tout dernier bloc créé au moment ou j'écris ces lignes : 000000000000000064b4397de78e9eaef9040e79b0d1d58ad16390e8fb4ab907.

Comme il est impossible de calculer quelle est la bonne valeur de nonce, notre brave nœud en est réduit à tester des valeurs aléatoires, encore et encore, jusqu'à trouver une valeur correcte sur des milliards, en concurrence avec tous les autres nœuds du réseau qui tentent eux aussi de créer leur bloc.

Plus le nombre de zéros à trouver est grand, plus improbable il devient de découvrir une valeur de nonce qui permettrait de créer un bloc. Le réseau Bitcoin ajuste automatiquement la difficulté du problème (le nombre de zéros) pour qu'en moyenne, un bloc soit créé toutes les dix minutes.

À l'heure ou j'écris ces lignes, la totalité du réseau Bitcoin à une capacité de calcul qui approche les 60 PH/s (Péta hash par seconde), soit 60 000 000 000 000 000 hash calculés par secondes, soit 360 000 000 000 000 000 000 hash calculés toutes les dix minutes.

Inutile de dire qu'il est devenu inutile d'essayer de miner avec un simple ordinateur de bureau.

La chaîne de blocs prévient la double dépense

En quoi la chaîne de blocs empêche-t-elle Alice de dépenser deux fois ses Bitcoins ? Reprenons notre exemple précédent.

Alice diffuse deux transactions contradictoires T1 et T2 auprès de deux nœuds N1 et N2. Chaque nœud travaille à produire un bloc qui contient la transaction reçue d'Alice.

Imaginons que N1 parvienne le premier à créer un bloc. Ce bloc, qui contient T1, est immédiatement diffusé à l'ensemble du réseau. N2 reçoit le nouveau bloc, le reconnaît comme valide et accepte donc que toutes les transactions du bloc sont également valides. N2 est maintenant capable de détecter que T2 est une transaction invalide, puisqu'il sait maintenant que T1 existe. T2 est donc rejetée et disparaît dans les limbes.

Le fait que T1 ait été validée avant T2 est totalement arbitraire, et l'autre nœud aurait très bien pu gagner la course. L'important ici est que les deux nœuds aient pu parvenir à un consensus pour accepter une transaction et rejeter l'autre.

Fork de chaînes

Imaginons une situation extrême : que se passe-t-il si N1 et N2, par le plus grand hasard, parviennent à créer un bloc en même temps ? C'est tout à fait possible et c'est déjà arrivé.

T1 et T2 ont toutes deux été validées et incluses dans un bloc intégré à la chaîne de blocs, qui n'est plus une chaîne simple mais contient un fork. Pas de problèmes ! Chaque nœud est libre de faire son choix (arbitraire) et de considérer l'un ou l'autre bloc comme le véritable dernier bloc.

Au final, l'un des nœuds finira par créer un nouveau bloc, ce qui fait qu'une chaîne sera plus longue que l'autre. Or, le protocole Bitcoin stipule que la chaîne la plus longue est toujours celle considérée comme valide. Par conséquent, cette nouvelle chaîne devient la chaîne « officielle » et continuera à grossir tandis que l'autre sera abandonnée.

En théorie, rien n'empêcherait Alice de créer un fork de la chaîne de blocs et forger des blocs dans son coin jusqu'à ce que sa branche dépasse en longueur la chaîne « officielle ». Cela lui permettrait d'annuler ou de modifier ses transactions antérieures.

En pratique, c'est une opération très difficile, puisqu'il faudrait qu'Alice forge des blocs plus rapidement que l'ensemble du réseau « honnête », et dispose donc de plus de 50% de la puissance de calcul de tout le réseau.

On considère que quand six blocs ont été créés suite à une transaction (environ une heure), celle-ci peut-être considérée comme irréversible.

« Il faut donc attendre une heure avant d'être certain à 100% qu'un paiement a été effectué ? Mais c'est long ! » Mmm… Pas si on considère qu'un virement bancaire prend en général plusieurs jours ouvrables, et qu'un paiement par carte de crédit peut être annulé par la banque quand ça lui chante.

Comment sont créés les Bitcoins ?

Mais au fait ?! Qu'est-ce qui motive les nœuds à effectuer les coûteux calculs de minage ? Par philanthropie ? Et d'ailleurs, pourquoi appelle-t-on cette opération « minage » ?

Une seule réponse pour deux questions : le minage est tout simplement la manière dont les nouveaux Bitcoins sont injectés dans le réseau.

Quand un petit veinard tire le gros lot et parvient à créer le nouveau bloc, il reçoit immédiatement une prime d'un certain nombre de Bitcoins.

Les 4 premières années, chaque bloc rapportait 50 BTC. Les 4 suivantes, 25 BTC, et ainsi de suite. Il est prévu qu'en 2140, le dernier Bitcoin aura été miné et la masse monétaire ne pourra plus croître au delà de 21 millions de Bitcoins.

Ce n'est pas vraiment un problème, puisque le Bitcoin peut être divisé jusqu'à la huitième décimale. 0,00000001 BTC = 1 Satoshi, du nom du créateur du Bitcoin.

Oui, mais quand la création de blocs ne rapportera plus de Bitcoins, qu'est-ce qui motivera les nœuds à créer de nouveau blocs ?

Quand un bloc est créé, le nœud correspondant remporte également les frais de transactions des transactions embarquées. Chaque utilisateur est libre de rajouter des frais à chacune de ses transactions. Dans la mesure ou rien n'oblige un nœud à inclure une transaction particulière dans un bloc, prévoir des frais de transaction assure l'émetteur que sa transaction sera traitée rapidement.

Confidentialité et vie privée

Le dernier sujet à aborder concerne la confidentialité des échanges. Avec Bitcoin, chaque transaction est publique et globalement accessible à tous, n'est-ce pas un problème pour la vie privée ?

Clairement, oui. En pratique, les échanges Bitcoin se font d'adresse à adresse, et chaque adresse est créée de manière privée et anonyme. Mais à partir du moment ou quelqu'un parvient à faire le lien entre vous et une certaine adresse Bitcoin (par exemple parce que vous avez laissé une adresse traîner sur votre site pour demander des dons), il devient possible de tracer l'historique de toutes les transactions concernant cette adresse pour en extraire certaines informations.

Protéger sa vie privée avec Bitcoin est vraiment une question d'éducation et de bonnes pratiques.

Aller plus loin

On l'a vu, Bitcoin est plus qu'une simple monnaie, c'est un véritable protocole permettant de mettre en place des systèmes de transactions fonctionnant à base de consensus distribué.

Ça signifie que virtuellement n'importe quel service qui nécessitait avant l'intervention de tiers de confiance peut maintenant `être repensé pour fonctionner en pair-à-pair : achats de noms de domaines, systèmes de votes, contrats, etc.

Il est probable que Bitcoin ne soit que le début d'une série d'innovations toutes plus excitantes les unes que les autres.

Le mot de la fin

Voilà pour cette introduction technique à Bitcoin. J'espère que je ne vous ai pas embrouillé.