La blockchain expliquée aux développeurs web, partie 1: la théorie
La blockchain est à la mode - on n'entend parler que de ça. Et si le nom de blockchain ne vous dit rien, vous avez sûrement déjà entendu parler de Bitcoin. Dans ce cas, c'est simple : la blockchain est la technologie sous-jacente à Bitcoin. Les experts prétendent que la blockchain va probablement révolutionner notre société autant que l'Internet en son temps. Mais qu'est-ce que c'est vraiment, et comment peut-on l'utiliser concrètement pour développer, aujourd'hui, des applications ? Ce billet est le premier d'une série de trois, tentant d'expliquer le phénomène blockchain aux développeurs web. Il est la traduction d'un billet en langue anglaise publié il y a quelques jours sur ce même blog. Ce billet s'intéresse à la théorie, les suivants feront un retour d'expérience sur un vrai projet, avec des extraits de code.
Vous préférez la version en vidéo ? Cette série d'articles a donné lieu à une conférence de 40 minutes, que vous pouvez visionner en ligne. Rendez-vous sur l'article associé: La blockchain, quand l'individu sert au collectif... malgré lui
Et pour commencer, essayons de comprendre de quoi il s'agit vraiment.
Qu'est-ce que la blockchain, premier essai.
Même si l'histoire de la blockchain est indissociablement liée à celle de Bitcoin, on peut la définir sans faire référence à Bitcoin. Dans la littérature, on trouve souvent une définition ressemblant à :
Une blockchain est un registre de faits, répliqué sur plusieurs ordinateurs reliés entre eux par un réseau pair à pair. On appelle les ordinateurs du réseau des noeuds. Le communication entre les noeuds est cryptée et garantit l'identité de l'expéditeur et du destinataire. Quand un noeud veut ajouter un nouveau fait au registre, il le propose au réseau qui forme un consensus pour déterminer où (et surtout quand) ce fait doit être inscrit dans le registre. Ce consensus est appelé un bloc.
Je ne sais pas pour vous, mais quand je lis ce genre de définition, je ne suis pas beaucoup plus avancé. Essayons de voir concrètement comment ça marche.
L'ordre des faits
Les réseaux pair à pair (peer-to-peer (P2P) en anglais) sont loin d'être une nouveauté. Napster et BitTorrent sont des réseaus P2P. Au lieu d'échanger des films, les membres d'une blockchain échangent des faits. Mais il y a plus.
Sur un réseau P2P, comme les autres systèmes distribués, il faut résoudre un des problèmes les plus difficile de l'informatique: la résolution de conflits, aussi appelée réconciliation. Les bases de données relationnelles, elles, garantissent l'intégrité référentielle, mais ça n'existe pas dans les systèmes distribués. Si deux faits incompatibles arrivent au même moment dans un même noeud, le système doit prévoir des règles pour déterminer lequel est valide.
Prenez par exemple le problème de la double dépense : Alice a 10€, mais elle choisit d'envoyer 2 fois ces 10€, l'une à Bob, et l'autre à Charlie. Ses deux ordres voyagent dans le réseau P2P au gré des connexions. Qui aura les 10€ d'Alice in fine?
Pour résoudre ce problème, le meilleur moyen consiste à ordonner les faits. Si deux faits incompatibles sont diffusés dans le réseau, le premier arrivé gagne. Mais il faut que tout le réseau soit d'accord pour désigner le premier fait, alors que la propagation irrégulière sur un réseau P2P ne garantit pas le même ordre d'arrivé en chaque point du réseau. Il faut donc trouver un moyen pour que tout le réseau s'accorde, et crée un consensus sur l'ordre des faits.
Les algorithmes de consensus sont un sujet de recherche très actif. Vous avez peut-être déjà entendu parler de Paxos ou de Raft, qui sont de tels algorithmes. La blockchain implémente une autre approche dénommée preuve de travail, utilisant des blocs.
Les blocs
Les blocs sont une idée maligne pour ordonner des faits dans un réseau de pairs pas forcément dignes de confiance. L'idée est simple: les faits sont groupés dans des blocs, les blocs sont ordonnés dans une seule et unique chaîne, qui est répliquée à travers tout le réseau. Chaque bloc pointe sur le bloc précédent. Donc par exemple, si le fait F est dans le bloc 21 et que le fait E est dans le block 22, alors l'ensemble du réseau considère que le fait E est postérieur au fait F. Avant d'être groupés dans un bloc, les faits sont en attente.
L'exploitation minière
Certains noeuds dans la chaîne créent un nouveau bloc local avec des faits en attente. Les noeuds sont en compétition entre eux pour voir si leur bloc local va devenir le prochain bloc dans la chaîne pour l'ensemble du réseau, et ce, en jetant des dés. Si un noeud fait un double six, il gagne alors le droit de publier son bloc local, et donc tous les faits qui le composent s'en trouvent confirmés. Ce bloc est envoyé à tous les autre noeuds du réseau. Tous les noeuds vérifient que le bloc est correct, l'ajoutent dans leur copie de la chaîne, et essaient de construire un nouveau bloc avec de nouveaux faits en attente.
Mais les noeuds ne jettent pas juste une paire de dés. Dans une blockchain, le défi consiste à lancer un très grand nombre de dés. Trouver la clé aléatoire pour valider un bloc est très improbable, intentionnellement. Cela protège contre la fraude, et c'est ce qui rend le réseau sûr (sauf si un utilisateur mal intentionné possède plus de la moitié des noeuds dans le réseau). Tout ceci a pour conséquence que les blocs sont publiés dans la chaîne à intervalle de temps fixe. Pour Bitcoin, les blocs sont publiés en moyenne toutes les 10 minutes.
Dans Bitcoin, le défi implique un double hash d'une séquence de faits en attente, l'identifiant du bloc précédent, et d'une séquence aléatoire, le tout avec l'algorithme SHA-256. Un noeud gagne si son hash contient au moins n zéros en entête.*
// un hash perdant pour Bitcoin 787308540121f4afd2ff5179898934291105772495275df35f00cc5e44db42dd // un hash gagnant pour Bitcoin si n=10 00000000009f766c17c736169f79cb0c65dd6e07244e9468bc60cde9538b551e
Le nombre n est ajusté de temps en temps afin de maintenir une durée de bloc fixe malgré les variations dans le nombre de noeuds. Ce nombre est appelé la difficulté. D'autres implémentations de blockchain utilisent des techniques spéciales de hashing qui découragent l'utilisation de grosses cartes graphiques (par exemple, en nécessitant de gros transferts de mémoire).
Le processus visant à rechercher de nouveaux blocs est appelé l'exploitation minière (mining en anglais). Cela vient du fait que, tout comme dans les mines d'or, l'action de chercher à former des blocs apporte une récompense économique - une sorte de monnaie. C'est la raison pour laquelle les personnes qui font tourner des noeuds dans une blockchain sont aussi appelés des mineurs.
Note: Par défaut, un noeud ne mine pas - il reçoit juste les blocs qui ont été minés par d'autres noeuds. C'est un processus volontaire que de transformer un noeud en un mineur.
Argent et crypto-monnaies
Chaque seconde, chaque noeud mineur au sein d'une blockchain teste des milliers de séquences aléatoires afin d'essayer de former un nouveau bloc. Donc faire fonctionner un noeud mineur dans la blockchain consomme une grande quantité de ressources (de stockage, de mémoire et de CPU). Voilà pourquoi vous devez payer pour insérer des faits dans une blockchain. Lire des faits, d'autre part, est gratuit : vous avez juste besoin de votre propre noeud, et vous pourrez récupérer l'historique entier des faits publiés par les autres noeuds. Donc pour résumer :
- Lire de la donnée, c'est gratuit
- Ajouter des faits coûte une faible commission
- Le fait de miner un bloc rapporte les sommes correspondant au total des commissions des faits inclus dans ce bloc
Il n'est pas question de vrai argent ici. En fait, chaque blockchain a sa propre (crypto-)monnaie. Elle s'appelle Bitcoin (BTC) dans le réseau Bitcoin, Ether (ETH) dans le réseau Ethereum, etc. Pour faire un paiement sur le réseau Bitcoin, vous devez payer une petite commission en Bitcoins - comme si vous payiez des frais de mouvement à une banque. Mais alors, d'où viennent les premières pièces de cette monnaie ?
Les mineurs reçoivent une gratification en récompense de leur contribution à garder le réseau fonctionnel et sûr. A chaque fois qu'ils minent un bloc, ils reçoivent un montant fixe de la cryptomonnaie. Pour Bitcoin, cette gratification est de 25 BTC par bloc; pour Ethereum, c'est 5 ETH par bloc. De cette façon, la blockchain génère sa propre monnaie.
Enfin, les cryptomonnaies sont rapidement devenues convertibles en vrai argent. Leur valeur faciale est déterminée par l'offre et la demande, et est donc l'objet de spéculation. A l'heure où ces lignes sont écrites, miner du Bitcoin coûte encore légèrement moins en énergie et en équipements que ce que vous pouvez gagner en vendant les BTC que vous avez pu recevoir dans le processus. C'est pourquoi il y a de nouveaux mineurs tous les jours, espérant transformer l'électricité en monnaie sonnante et trébuchante. Cependant, les fluctuations dans la valeur du BTC font que c'est une opération de moins en moins profitable.
Les contrats intelligents
Jusqu'ici nous n'avons évoqué que le stockage de faits, mais une blockchain peut également exécuter des programmes. Certaines blockchains permettent à chaque fait de contenir un mini programme. Ces programmes sont répliqués avec les faits, et tous les noeuds les exécutent lorsqu'ils reçoivent les faits. Sur Bitcoin, ces mini programmes peuvent être utilisés pour faire des transactions conditionnelles : Bob recevra 100 BTC de la part d'Alice si et seulement si nous sommes aujourd'hui le 29 février.
D'autres blockchains permettent d'écrire des programmes encore plus sophistiqués. Sur Ethereum par exemple, chaque programme est associé à une mini base de données, et expose des méthodes pour modifier ces données. Vu que les programmes sont répliqués sur tous les noeuds, leur base de données l'est aussi. A chaque fois qu'un utilisateur appelle une méthode sur le programme, et de ce fait met à jour les données associées, cette commande est répliquée et rejouée par le réseau tout entier. Ce dispositif permet d'assurer un consensus distribué lors de l'exécution d'une promesse.
L'idée de pré-conditions pré-programmées, interfacées avec le monde réel, et diffusées à tout le monde, est appelé un contrat intelligent (smart contract en anglais). Un contrat est une promesse que les parties signataires acceptent de rendre juridiquement exécutoire. Un contrat intelligent peut être défini de la même manière, à la différence près que le terme "techniquement" remplace le terme "juridiquement". Plus besoin d'un juge, ou d'une quelconque autorité reconnue par les deux parties.
Imaginez que vous louez votre maison une semaine pour un montant de 1 000€, avec un versement de 50% de la somme à la commande. Le locataire et vous-même signez un contrat, probablement rédigé par un juriste. Vous aurez également besoin d'une banque pour recevoir le paiement. Au début de la semaine de location, vous demandez également le dépôt d'une caution de 5 000€; le locataire vous signe un chèque pour ça. A la fin de la semaine de location, le locataire refuse de payer les 50% restants. Vous réalisez également qu'ils ont cassé une vitre, et que le chèque de caution ne peut être encaissé car le compte est vide. Vous aurez besoin d'un avocat pour vous aider à porter le contrat de location devant un tribunal.
Les contrats intelligents dans une blockchain vous permettent de vous passer de la banque, du juriste, de l'avocat et du tribunal. Il suffit d'écrire un programme qui définit quel montant doit être transféré en réponse à certaines conditions:
- deux semaines avant le début de la location : transférer 500€ depuis le locataire vers le propriétaire
- en cas d'annulation par le propriétaire : transférer 500€ depuis le propriétaire vers le locataire
- fin de la période de location: transférer 500€ depuis le locataire vers le propriétaire
- à la preuve d'une dégradation physique après la période de location : transférer 5 000€ depuis le locataire vers le propriétaire
Transférez ce contrat intelligent dans la blockchain, et c'est tout ! Le transfert d'argent aura lieu au moment défini dans le contrat. Et si le propriétaire peut apporter une preuve pré-définie d'une dégradation physique, il recevra automatiquement les 5 000€ (sans avoir besoin d'un dépôt de garantie).
Vous pourriez vous demander comment construire une preuve de dégradation physique. C'est là que l'internet des objets (Internet of Things (IoT) en anglais) entre en jeu. Afin d'interagir avec le monde réel, les blockchains ont besoin de capteurs et d'actionneurs. La révolution blockchain n'aura pas lieu sans que la révolution IoT n'ait lieu au préalable.
Ces applications qui reposent sur des contrats intelligents sont appelées des Applications Décentralisées, ou DApps.
Les contrats intelligents s'étendent naturellement à la propriété intelligente (smart property en anglais), mais pas que. Ce qu'il faut retenir, c'est que "intelligent" ici veut dire "sans intermediaires". Les blockchains sont une nouvelle manière de désintermedier les affaires - tout comme l'internet avait désintermedié le secteur de la distribution de la musique.
Qu'est-ce que la blockchain, deuxième essai
A mon avis, la meilleure manière de comprendre ce qu'est la blockchain est de l'observer sous différents angles.
Ce qu'elle fait Une blockchain permet de partager et/ou de traiter de la donnée de manière sécurisée, et ce au travers d'un réseau de pairs non fiables. Quand on parle de données, cela peut être n'importe quoi, mais les usages les plus intéressants concernent les informations qui nécessitent habituellement un tiers de confiance pour être échangées. Par exemple, la monnaie (nécessite une banque), un acte de propriété (nécessite un notaire), un certificat de prêt, etc. Par essence, la blockchain rend inutile la présence de tiers de confiance.
Comment cela marche D'un point de vue technique, la blockchain est une innovation qui s'appuie sur trois concepts : des réseaux peer-to-peer, la cryptographie asymétrique, et un consensus distribué basé sur la résolution d'un défi mathématique. Aucun de ces concept n'est nouveau. C'est la combinaison des trois qui génère une véritable percée technologique. Si vous ne comprenez pas tout, ne vous en faites pas : seul un très faible nombre de personnes ont les connaissances nécessaires pour développer une blockchain par eux-mêmes (ce qui est un problème par ailleurs). De plus, ne pas comprendre ce qu'est une blockchain ne vous empêche pas de l'utiliser, tout comme vous pouvez développer des applications web sans pour autant connaître TCP Slow Start ni le concept d'autorité de certification.
A quoi peut-on la comparer On peut comparer la blockchain à une base de données répliquée autant de fois qu'il y a de noeuds, et synchronisée lentement. Ou alors à un super-ordinateur formé par la somme des processeurs et des cartes graphiques de tous ses noeuds. On peut se servir de ce super-ordinateur pour stocker et traiter de la donnée, tout comme on le ferait avec une API distante. A ceci près que l'on n'a pas besoin de posséder l'infrastructure, et qu'on est assuré que la donnée est en sécurité et traitée correctement par le réseau.
Implications pratiques
Les faits qui sont stockés dans la blockchain ne peuvent être perdus. Ils sont là pour toujours, répliqués autant de fois qu'il existe de noeuds. De plus, la blockchain ne se contente pas de stocker l'état final, elle conserve l'historique de tous les états passés, afin que chacun puisse aller vérifier la justesse de l'état final en rejouant les faits depuis le début.
On peut faire confiance aux faits contenus dans la blockchain, puisqu'ils sont vérifiés par un consensus obtenu de manière automatique. Et même si le réseau contient des moutons noirs, on peut faire confiance au jugement rendu par l'ensemble.
Compte tenu du fait qu'il faut au préalable avoir obtenu le consensus, stocker des données dans la blockchain n'est pas rapide.
Conseil: Si vous avez 20 minutes disponibles pour approfindir le sujet, regardez cette excellente vidéo d'introduction sur Bitcoin, où l'on explique également ce qu'est la blockchain :
YouTube might track you and we would rather have your consent before loading this video.
Pourquoi c'est vraiment important
« La blockchain est la technologie la plus révolutionnaire que j'ai jamais vue. » Salim Ismail
«La construction intellectuelle la plus intéressante sur Internet de ces cinq dernières années. » Julian Assange
« Le fait que, dans l'univers Bitcoin, une algorithme remplace le rôle [du gouvernement], je trouve ça plutôt cool..» Al Gore
Ces personnes brillantes on perçu un énorme potentiel dans la blockchain. C'est à cause de la désintermédiation. La blockchain peut potentiellement remplacer tous les intermédiaires aujourd'hui utilisés comme tiers de confiance. Voyons quelques exemples d'applications, qui pour la plupart sont encore en phase d'expérimentation :
- Monegraph permet aux auteurs de revendiquer leur travail, et de fixer leurs règles (et tarifs) pour sa réutilisation
- La Zooz est un Uber décentralisé. Partagez votre voiture, trouvez une place dans une voiture, sans payer de frais à Uber ou Blablacar.
- Augur est un site de paris en ligne. Pariez sur les résultats, et recevez des gains, sans bookmaker qui prend sa commission.
- Storj.io est un système de stockage peer-to-peer. Louez votre espace disque inutilisé, ou trouvez de l'espace de stockage en ligne pour pas cher.
- Muse est une base de données libre, distribuée et transparente dédiée à l'industrie de la musique
- Ripple permet des paiements interbancaires low cost de pays à pays pour les banques
De nombreux business à succès de l'internet aujourd'hui sont des intermédiaires. Pensez à Google une minute : ils ont réussi à être l'intermédiaire entre nous et l'internet tout entier. Pensez à Amazon : ils sont devenus les intermédiaires entre les vendeurs et les acheteurs pour tout type de biens. Voilà pourquoi une technologie qui permet de supprimer les intermédiaires peut potentiellement révolutionner l'internet tout entier.
Cela va-t-il profiter aux utilisateurs finaux, qui n'auront plus besoin de tiers pour échanger des biens et des services ? C'est loin d'être certain. Internet faisait la même promesse d'une profonde désintermédiation. Et pourtant, Google a construit la plus grosse capitalisation boursière mondiale en se positionnant comme intermédiaire. Voilà pourquoi il est crucial d'investir rapidement dans la blockchain, parce que les gagnants et les perdants de ces dix prochaines années sont en train de naître en ce moment.
Vous ne construirez pas votre propre blockchain
La technologie qui est derrière la blockchain utilise de la cryptographie avancée, des protocoles réseaux ad hoc, ainsi que des optimisations de performance complexes. Tout ceci est bien trop sophistiqué pour être développé de nouveau à chaque fois qu'un projet a besoin de blockchain. Heureusement, outre Bitcoin, il y a de nombreuses implémentations de blockchains open-source. Voici les plus avancées :
- Ethereum: une plateforme blockchain open-source montée par la Fondation Ethereum
- Hyperledger: une autre implémentation open-source, mais cette fois-ci par la Fondation Linux. La première version a été publiée très récemment.
- Eris Industries: Des outils pour aider à manipuler Ethereum, Bitcoin ou encore des blockchains totalement indépendantes, essentiellement pour construire des réseaux privés. Leurs tutoriaux et leurs explications sont un bon point de départ pour acquérir une vision d'ensemble de la technologie blockchain.
La maturité de ces implémentations est très variable. Si vous devez monter une application maintenant, nous vous conseillons :
- Eris pour une Blockchain fermée, ou pour découvrir et jouer un peu avec la technologie
- Ethereum pour une Blockchain ouverte
De plus, Bitcoin ne convient pas pour le développement d'une application décentralisée. Il a été spécialement conçu pour de la monnaie, et rien d'autre, même si vous pouvez programmer des pseudo-smart contracts (mais vous devez aimer l'assembleur). Ce réseau souffre actuellement d'une sérieuse crise de croissance. Les transactions devant attendre plus d'une heure pour pouvoir être insérées dans un bloc, les mineurs sélectionnent les transactions qui rapportent le plus, et du coup les transferts de monnaie deviennent plus chers que ce qu'ils coûtent avec une banque. La communauté des développeurs est en effervescence, et les spéculations sur la cryptomonnaie font beaucoup trop varier sa valeur faciale.
Quelques chiffres
Quelle taille ont les blockchains aujourd'hui ? Voici quelques chiffres :
Bitcoin:
- Temps de bloc : 10 minutes
- Nombre de BTC gagnés pour chaque bloc miné : 25
- Nombre de blocs minés: plus de 400 000
- Nombre de transactions par bloc: plus de 1 200
- Nombre de noeuds dans le réseau: à peu près 7 000
- Valeur du BTC: 420$
- La plupart de la capacité de calcul semble être concentrée en Chine
Ethereum:
- Temps de bloc : 10 secondes
- Nombre de BTC gagnés pour chaque bloc miné : 5
- Nombre de blocs minés: plus de 1 400 000
- Nombre de transactions par jour: plus de 30 000
- Nombre de noeuds dans le réseau: plus de 6 000
- Valeur du ETH: autour de 10$, mais varie énormément.
- La plupart de la capacité de calcul semble être concentrée par un mineur nommé "Dwarfpool"
Conclusion
La technologie blockchain est à la fois mystérieuse et excitante. Est-ce qu'elle pourrait aboutir à cette révolution prédite par les gourous ? Ou est-ce juste une bulle spéculative construite sur une idée bancale ?
Après avoir beaucoup lu sur ce sujet, nous n'avons pas réussi à trancher. Et lorsque nous sommes face à l'incertitude, notre façon favorite de la lever est d'essayer. C'est ce que nous avons décidé de faire. Dans le prochain billet de cette série, nous décrirons ce que nous avons appris en construisant une véritable application décentralisée tournant sur la blockchain.
Merci à Yann Gensollen pour la traduction.