Histoire
Le web d'aujourd'hui est basé sur le protocole HTTP, qui fonctionne en mode client/serveur de façon centralisé. Il y a d'un côté un point d'entrée unique qui va ensuite aiguiller les requêtes vers des ordinateurs qui hébergent le site web ; et de l'autre des clients, les fameux navigateurs, qui permettent de le consulter.
Ce mode de fonctionnement est très simple et rapide à mettre en place. Il nécessite cependant d'investir dans des équipements qui peuvent être coûteux si le nombre de visiteurs et/ou la quantité de données échangée entre les navigateurs et le site, sont très importants. De plus, l'hébergeur peut constituer un point unique de panne (single point of failure) si le site et ses sauvegardes sont hébergés que dans un data center donné. Certains auront peut-être à l'esprit l'incendie chez OVH en mars 2021.
Le web a commencé à se décentraliser grâce aux frameworks JavaScript tel que ReactJS, Angular ou VueJS qui permettent de déporter le travail de génération de l'interface utilisateur du côté du navigateur. Cependant, le serveur reste en charge des traitements métiers et des données.
Récemment, des technologies exploitant à la fois la cryptographie et les réseaux peer2peer (P2P) sont apparues pour offrir des solutions permettant également de décentraliser le stockage des fichiers et des données, ainsi que les traitements métier. Nous allons voir quelques unes de ces technologies dans cet article.
La blockchain
La blockchain a été théorisée dès 1991 par les chercheurs Stuart Haber et W. Scott Stornett, puis en 1992 avec l'introduction de la structure de données "Arbre de Merkle".
En 2004, les premières briques concrètes ont été lancées par l'informaticien Hal Finney en proposant un premier prototype d'algorithme de consensus, nommé la RPOW (Reusable Proof of Work).
Mais il faut attendre 2008 pour que la blockchain commence à véritablement sortir de l'ombre, avec la publication du livre blanc du BitCoin, première crypto-monnaie de l'histoire. C'est en janvier 2009 que le premier bloc de la blockchain BitCoin sera généré.
Toutefois, limiter cette technologie aux crypto-monnaies serait ne pas lui faire honneur. La blockchain est avant tout une base de données décentralisée, historisée (horodatée) et infalsifiable. Elle exploite la structure de l'arbre de Merkle et une génération régulière des blocs de données pour permettre de garantir à la fois l'intégrité des données et leur historisation.
On peut donc stocker dans une blockchain n'importe quelles données, que cela soit des données de transactions financières d'une crypto-monnaie, ou les caractéristiques de votre chat (cf CryptoKitties).
Qu'est-ce qu'un arbre de Merkle ?
Une structure d'arbre de Merkle consiste à relier tous les éléments entre eux de sorte que si on modifie n'importe lequel de ces éléments, tous les autres sont aussi impactés et les liaisons doivent être recalculées.
Les données ont chacune leur hash basé sur leur contenu, puis on remonte jusqu'à la racine qui aura un hash dépendant de l'ensemble des données enfants. De ce fait, dès lors qu'une seule donnée est modifié, il faut recalculer les hash parents et le hash racine. Cela permet de garantir l'intégrité des données.
Synchronisation P2P
En plus de sa sécurité apportée par la structure en arbre de Merkle, la blockchain fonctionne sur un réseau P2P où les données sont répliquées dans un grand nombre d'ordinateurs à travers le monde, qui se maintiennent synchronisés. Chaque ordinateur, aussi bien que n'importe quel autre dans le réseau, peut répondre à des demandes de clients frontaux.
Smart contracts
De plus, des implémentations plus récentes introduisent en plus la possibilité d'intégrer du code dans la blockchain, dans ce qui est appelé des smart contracts (contrats intelligents). Cela permet donc d'intégrer du code métier, infalsifiable, travaillant sur les données de la blockchain.
Une blockchain pionnière dans ce domaine est celle d'Ethereum, et c'est encore aujourd'hui la blockchain la plus utilisée pour les smart contracts.
Cependant, d'autres frameworks pour créer des applications utilisant une blockchain, tel que Substrate ou ARK, implémentent également des solutions de smart contracts, permettant d'embarquer du code métier interagissant avec les données de la blockchain et exposant une API pouvant être consommée par un site web ou une application mobile.
IPFS
Si la blockchain permet de résoudre la problématique côté serveur, et même si les frameworks JavaScript modernes permettent de faire en sorte que l'interface utilisateur soit rendue côté navigateur et donc de façon décentralisé, un problème demeure. En effet, les fichiers de cette interface devaient toujours être récupérés depuis un hébergement spécifique.
IPFS apporte une réponse comparable à la blockchain, mais en étant optimisé pour servir des fichiers. Comme la blockchain, il va stocker les fichiers en utilisant une structure d'arbre de Merkle pour les rendre très difficiles à falsifier. Il implémente également un système de réseau P2P, mais à la différence de la blockchain, tous les fichiers du réseaux ne sont pas systématiquement dupliqués.
IPFS est exécuté sur la machine cliente. Certains navigateurs comme Brave intègrent d'ailleurs directement le support d'IPFS.
Chaque utilisateur va enregistrer une copie des fichiers qu'il consulte sur le réseau. Ce qui diffère par rapport au cache traditionnel de votre navigateur, c'est que votre ordinateur peut servir de relai pour les fichiers que vous avez consulté. Autrement dit tout ordinateur connecté sur le réseau IPFS peut être serveur des fichiers qu'il dispose dans son dépôt IPFS local. Ainsi, chaque utilisateur est à la fois client et serveur.
C'est ce mécanisme qui permet à IPFS d'offrir une réelle décentralisation. Si une machine ayant le fichier que vous recherchez tombe en panne, il est fort à parier que d'autres machines auront une copie et pourront vous fournir ce fichier.
Créer et héberger un site en 100% décentralisé
En combinant les technologies des frameworks front JavaScript, de la blockchain, et IPFS, il est donc possible de créer et héberger un site web entièrement de façon décentralisé, sans avoir besoin de recourir à un hébergeur centralisé. Plus de crainte que votre site deviennent inaccessible à cause d'une panne, un incendie, ou autre incident.
Voyons concrètement ce que cela donne avec une application écrite en AngularJS et se connectant à un réseau d'ordinateurs utilisant la blockchain Duniter.
Application pratique: Césium
Pré-requis
- Installer IPFS: https://docs.ipfs.io/install/
- Récupérer le code source de Césium: https://github.com/duniter/cesium/releases/download/v1.6.12/cesium-v1.6.12-web.zip
Ajout du code source de l'application dans IPFS
Assurez vous d'abord d'avoir le démon IPFS démarré : ipfs daemon
Pour héberger un site en JavaScript sur IPFS, il suffit d’exécuter la commande suivante: ipfs add <répertoire_ou_fichier>
Ici, nous allons ajouter le répertoire de Césium:
mkdir cesium
cd cesium
unzip cesium-v1.6.12-web.zip
ipfs add -r ./cesium-v1.6.12-web
A la fin de l'ajout, vous devriez voir le hash du répertoire Césium sur la dernière ligne, qui ressemblera à celui-ci:
added QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n cesium
Accéder au site
Maintenant que le site est ajouté, vous pouvez y accéder depuis n'importe quel navigateur : http://dweb.link/ipfs/<hash>
Exemple pour Césium avec le hash ci-dessus : http://dweb.link/ipfs/QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n
Si vous êtes sur un navigateur intégrant IPFS, tel que Brave, vous pouvez aussi accéder au site en tapant: ipfs://<hash>
Exemple (toujours avec Césium) : ipfs://QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n
Si votre navigateur dispose de l'extension IPFS Companion, le site se charge directement depuis votre ordinateur. Sinon, il devra d'abord se propager dans le réseau pour pouvoir être chargé.
Elle est moche cette adresse !
Évidemment, une telle adresse n'est pas facile à retenir. Fort heureusement, il est possible d'affecter un nom de domaine, tout comme pour n'importe quel site.
Pour cela, il faut avoir un service de DNS, et ajouter les entrées suivantes:
sous_domaine IN CNAME dweb.link.
_dnslink.mon_sous_domaine IN TXT "dnslink=/ipfs/QmesyTwkSYfLFrXMk4gHG5W6DwpBuv5hatUd8D3DVXxY4n"
Par la suite, vous pourrez accéder à votre site avec l'adresse https://sous_domaine.domaine.ext
, comme n'importe quel site.
Le backend
Lorsque vous accédez à cette application, vous verrez qu'elle se connecte automatiquement à un ordinateur du réseau Duniter qui utilise la technologie de la blockchain pour stocker les données (transactions, certifications, ...) de la crypto-monnaie Ğ1.
Vous pouvez voir la liste des ordinateurs du réseau de la blockchain dans la section Réseau de l'application.
De même, vous pouvez consulter le contenu de la blockchain dans la section Dernier blocs.
En bref
Si le web décentralisé n'est pas encore une réalité au quotidien, les briques de bases pour sa concrétisation existent déjà. Il est donc d'ores et déjà possible de mettre en place une site web totalement décentralisé avec les technologies de la blockchain, IPFS et les frameworks front JavaScript tel que Angular, React ou Vue.
Cependant, ces technologies sont encore jeunes et avant que le web décentralisé supplante le web que nous connaissons aujourd'hui, il se passera certainement encore plusieurs années.
En attendant ce jour, veillez à choisir un hébergeur ou une solution de cloud qui ne perdra pas vos données et votre site en cas d'incendie ;)