Mot-clé : vocabulaire

jeudi 6 janvier 2022

Vocabulaire : portefeuille

Dans le milieu des cryptomonnaies, ce qui est appelé un portefeuille (wallet en anglais) est un dispositif qui sert à stocker et gérer une paire (ou dans certains cas, des paires) de clefs cryptographiques : grossièrement, une clef publique qui permet de recevoir de la cryptomonnaie, et une clef privée qui permet de la dépenser.

Le terme de “portefeuille” est particulièrement mal choisi. En effet, vu ce qu’est un portefeuille dans la vraie vie, cela encourage à l’abus de langage qui consiste à parler de cryptomonnaie stockée “dans” un portefeuille. Par métonymie on voit aussi parfois appelée “portefeuille” une clef publique (qui est l’identifiant à qui on peut transférer de la cryptomonnaie et de qui on peut en recevoir). On peut d’ailleurs voir un exemple typique de ça dans sur la page Wikipédia dédiée, qui parle de Bitcoin stockés dans des portefeuilles alors que littéralement deux phrases plus tôt il était précisé que les cryptomonnaies ne sont pas stockées dans les portefeuilles… :

Capture de la page wikipédia “Portefeuille de crypto-monnaie” le 5 janvier 2022.
Capture de la page Wikipédia “Portefeuille de crypto-monnaie” le 5 janvier 2022.

Ce soucis était présent sur Wikipédia depuis le 3 août 2021, donc déjà 5 mois au moment où j’ai consulté la page (et où j’en ai donc profité pour la corriger, en annulant simplement la modification qui rajoutait cette dernière phrase du paragraphe d’introduction, fausse et inutile).

Littéralement, un “porte-feuille” contient, physiquement, de l’argent liquide (des billets, en papiers, des feuilles quoi). Une transaction entre portefeuilles consiste donc en le déplacement physique d’un objet d’un portefeuille à l’autre. La transaction ne nécessite que la présence des deux portefeuilles. Le système de transaction est non seulement décentralisé mais aussi acentré : il ne possède pas du tout de centre, une transaction s’effectue directement de pair à pair et de façon totalement discrète/anonyme vis-à-vis du système global.

Bien que cette description ressemble beaucoup aux discours qu’on peut entendre au sujet des cryptomonnaies (“décentralisé”, “anonyme”), ce n’est en fait pas du tout comme ça qu’elles fonctionnent !

Plutôt que de “portefeuille” on devrait parler de “compte”, au sens de compte bancaire, pour éviter cette confusion.

Un “compte” (en banque) c’est un identifiant auquel on associe un solde. Une transaction entre deux comptes consiste à soustraire au solde du compte émetteur le montant de la transaction et à l’ajouter au solde du compte destinataire. Cette fois-ci le système de transaction ne peut pas être acentré, du moins si on ne veut pas que n’importe qui puisse créer de la monnaie sortie de nulle part (et clairement, on veut pas) :

  • [validité] lors d’une transaction de montant X du compte A vers le compte B, il faut que le solde de A soit supérieur ou égal à X ;
  • [double dépense] en plus de ça, il ne faut pas non plus que, simultanément, A puisse faire une transaction de montant Y vers le compte C si le solde de A n’est pas supérieur ou égal à X + Y (alors que prises séparément les deux transactions pourraient valider la première condition) ;
  • [cohérence] et bien sûr après chaque transaction il faut s’assurer que le montant qui a été ajouté au solde du compte destinataire a bien été soustrait de celui du compte émetteur.

Il faut donc, d’une manière ou d’une autre, un centre qui fasse (ou qui permettent de faire) ces vérifications.

Dans le cas des comptes bancaires, le système de transaction est un mix entre une version centralisée et une version fédérée : il n’y a pas qu’une seule banque donc ce n’est pas littéralement un système centralisé, mais pas n’importe qui peut créer une banque qui vient se greffer au réseau en étant immédiatement interopérable avec les banques existantes comme on s’attendrait à ce que ce soit le cas dans un système réellement fédéré. Dans le système bancaire, le centre (les banques) est en charge de faire les vérifications, et les données sont opaques pour les utilisateurices des comptes.

Dans le cas des cryptomonnaies, il y a aussi un centre, mais il est distribué grâce à une blockchain qui n’est rien d’autre qu’un registre public de toutes les transactions depuis le début du système. La charge des trois vérifications citées plus haut (dont j’ai inventé les noms pour les besoins de ce billet) est répartie comme suit :

  • [validité] chaque participant au réseau connaît l’état du registre et donc peut recalculer le solde de chaque compte (en partant de zéro et en ajoutant les montants des transactions vers ce compte et en retirant les montants des transactions depuis ce compte), donc chaque fois qu’un nouveau bloc est reçu, chaque participant peut vérifier si il ne contient que des transactions valides, et ignorer le bloc dans le cas contraire ;
  • [double dépense] si deux transactions dans un même bloc ne respectent pas cette règle c’est un problème de validité et on en revient au point précédent, si elles ne sont pas dans le même bloc alors soit elles ne sont pas simultanées (et on en revient à la validité si le registre est immuable, cf ci-dessous), soit les deux blocs arrivent en même temps et seul l’un des deux pourra être choisi par le réseau pour continuer la chaîne (chaque nouveau bloc dépend directement du précédent, il ne peut y avoir deux précédents, cf ci-dessous également) ;
  • [cohérence] enfin, concernant la cohérence, elle est “gratuite” car comme expliqué ci-dessus, le solde d’un compte n’est écrit nul part il est calculé depuis la liste des transactions qui concernent le compte.

Immuabilité. Tout cela suppose que l’ensemble des participants voient le registre dans le même état et qu’une fois écrit celui-ci est immuable, c’est à dire qu’on ne puisse pas effacer ou modifier des transactions discrètement dans le registre. C’est pour cette raison que le registre est basée sur une structure de chaîne de blocs : l’identifiant de chaque bloc dépend cryptographiquement de l’intégralité de son contenu ainsi que de l’identifiant du bloc le précédant dans la chaîne, de sorte que modifier le contenu d’un bloc implique la modification de son identifiant et du coup de tous les blocs qui le suivent dans la chaîne.

On remarquera ici que malgré toutes les explications techniques que l’on vient de faire, on a pas expliqué, et encore moins justifié, la nécessité de la preuve de travail (ou d’enjeu) dans le cas des cryptomonnaies, mais ce sera l’occasion d’un autre billet !
EDIT (07/01/2022), le voici : La nécessité de la preuve de travail (ou d’enjeu).

Pour cette fois-ci, on s’arrêtera sur l’idée que dans le cadre des cryptomonnaies, ce qu’on voit appelé un “portefeuille” devrait soit être un “compte” soit un “gestionnaire de compte” ou encore un “client” (au sens réseau, comme on peut parler d’un “client BitTorrent” par exemple).

Pour un véritable portefeuille numérique et décentralisé, il semble qu’à l’heure actuelle la seule option soit Taler, et cette technologie n’est pas basée sur une blockchain[1].

Note

  1. ^ Je réfléchissais déjà au sujet d’un système de transactions acentré dans un article publié dans Alternative libertaire n°319 (septembre 2021) : Contrôle, surveillance, et monnaie numérique.

mercredi 5 janvier 2022

Vocabulaire : consensus

Dans les discussions concernant la technologie de la blockchain, on entend souvent parler de consensus. Par exemple on peut lire des choses comme « une blockchain est un registre distribué qui enregistre les transactions qui font consensus sur le réseau ». Mais qu’entend-on par “consensus” ici ?

Poignée de main digital (5 dans chaque)
Illustration classique mais trompeuse de la notion de consensus des blockchains.

Dans le langage courant, le mot consensus a une signification sociale et politique. Il s’agit de l’accord (au sens du choix, du consentement) du plus grand nombre (dans un sens très large, proche de l’unanimité) avec l’idée ou la décision qui fait consensus. On parle par exemple d’adopter une décision “au consensus” quand il n’y a pas de désaccord exprimé contre l’adoption.

Pour être bien clair, la notion d’accord ici correspond à “je suis d’accord, c’est ce que je veux, ça correspond à mes convictions” (consensus fort) ou à “je ne suis pas contre, ça me convient” (consensus mou).

En informatique, on appelle consensus le problème consistant pour un ensemble de machines de se mettre d’accord sur une valeur. Il n’est plus question ici de choix politique ni de consentement d’ordre “moral” dans une décision à prendre (la valeur à choisir) mais bien simplement que toutes les machines finissent par tomber d’accord sur une valeur, quelque soit cette valeur[1]. On veut simplement qu’en un temps fini, l’ensemble des machines concernées aient décidées d’une même valeur. Techniquement l’une des machines pourrait servir de “dictateur” et le processus consisterait alors simplement à ce que la valeur décidée par cette machine soit transmise à toutes les autres[2].

Pour être bien clair, la notion d’accord ici correspond à “ok d’accord, j’ai compris, on fait comme ça”. On voit bien ici que la notion informatique est tout à fait distincte de celle du langage courant (on ne parlerait même pas de consensus mou ici).

Dans les blockchains, il y a essentiellement deux familles de méthodes utilisées pour atteindre le consensus.

Les blockchains à “preuve de travail” posent des contraintes a priori sur les valeurs de consensus possibles de sorte à ce que cela demandent beaucoup de calculs aléatoires pour trouver une solution, i.e., un bloc valide. Dans ce cas, celui-ci est transféré aux autres participants qui vérifient si il respecte effectivement les contraintes, et si c’est le cas il est adopté et les contraintes sont mises à jour pour prendre en compte ce nouveau bloc (pour que tous les calculs soient forcés à recommencer de zéro en quelque sorte)[3].

Dans les blockchains à “preuve d’enjeu” le principe est que la prochaine valeur sera choisi par un participant choisi aléatoirement avec un tirage au sort qui donne un avantage proportionnellement lié à l’intérêt supposé du participant à ce que tout se passe bien et en confiance (sans triche) sur la blockchain, parce qu’il y a le plus gros enjeu (réel, i.e., financier) et depuis le plus longtemps.

On remarque que dans les deux cas, le fonctionnement de l’algorithme de consensus dépend directement du fait que la blockchain soit porteuse de valeur (au sens monétaire). Dans la preuve de travail parce qu’il faut une façon d’inciter aux dépenses énergétiques liées aux calculs aléatoires inutiles par ailleurs (ce qui est fait en accordant une récompense au participant qui a trouvé le bloc valide). Dans la preuve d’enjeu parce que pour qu’elle ait un sens il faut que l’enjeu dont il est question en soit effectivement un (perte financière si la blockchain n’est plus fiable) et que les participants aient intérêt à vouloir être sélectionné et donc à conserver un enjeu réel sur la blockchain (même système de récompense).

Donc non seulement dans les deux cas il s’agit de sélectionner aléatoirement un “dictateur” pour ce tour-ci, mais en plus on sait que la décision qui sera prise par celui-ci et imposée à tous les participants sur le réseau n’aurait été choisie par absolument aucun autre, puisqu’elle inclut l’auto-attribution de la récompense. Dans le cas des blockchains, non seulement c’est de la notion informatique de consensus qu’il est question, mais en plus on ne pourrait pas être plus éloigné de la notion politique du langage courant.

Ce qu’on peut lire, voir, ou entendre concernant les blockchains laisse le plus souvent ambiguë la notion de consensus, et va parfois jusqu’à l’utiliser comme argument (dans de plus ou moins grandes envolées lyriques sur la démocratie, la décentralisation, et le consensus) comme si il s’agissait de la notion du langage courant. Bon, il faut reconnaître que ça ne semble pas toujours être fait de mauvaise foi mais bien souvent par pur incompréhension du sujet… ce qui n’est pas vraiment mieux. Mais bref, il me semblait important de clarifier ce que veut dire consensus quand on parle de blockchain.

Notes

  1. ^ Il y a quand même quelques contraintes : par exemple, la valeur doit avoir été proposée par au moins l’une des machines participantes, mais pas forcément par la majorité !
  2. ^ En fait on souhaite généralement que ces algorithmes soient distribués et tolérants aux pannes, donc on ne peut pas se contenter désigner une machine qui serait le “dictateur” pour toujours : ça ne fonctionne plus si celle-ci tombe en panne. Si en revanche on se place dans un système centralisé et pas distribué, ou il existe une machine qui est supposée fonctionner tout le temps, il n’y a plus de “problème du consensus” et c’est bien comme ça que ça fonctionne.
  3. ^ Il se peut que deux solutions valides soient trouvées en même temps, dans ce cas les participants qui reçoivent les deux doivent choisir à partir de laquelle ils redémarrent leurs calculs : soit parce qu’ils ont un intérêt à l’une deux deux soit au hasard. Quoi qu’il en soit celle qui gagnera sera en pratique celle par dessus laquelle la prochaine solution sera trouvée, même si elle était minoritaire parmi les participants.