====== IPFS ======
===== Présentation =====
IPFS (InterPlanetary File System) est un P2P sous licence libre qui vise à proposer un web décentralisé, à l'instar de [[p2p>ZeroNet]]. Contrairement à [[p2p>I2P]] ou [[p2p>Freenet]], IPFS n'est pas anonymisant, mais des solutions pourraient être apportées, notamment par un couplage avec [[wpfr>Tor_(réseau)|Tor]]. Cette ambition orientée «web» n'interdit pas de s'en servir pour faire du partage de fichiers potentiellement volumineux.
Pour arriver à ses fins, IPFS réutilise des technologies à succès et s'en inspire ou les combine : [[wpfr>Git]], [[p2p>BitTorrent]], [[p2p>kademlia_reseau|Kademlia]], [[p2p>Bitcoin]], [[wp>Self-certifying_File_System|SFS]]((Self-Certified File System : un système de fichiers réseau similaire à NFS, mais dont les chemins d'accès aux fichiers contiennent la clé publique de la machine, permettant de s'assurer de leur authenticité)).
IPFS est développé par [[https://protocol.ai|Protocol Labs]], une start-up de San Francisco pour qui les protocoles qui ont permis de batir le réseau internet doivent être libres et ouverts. Il s'agit naturellement d'un logiciel libre, l'implémentation de référence est écrite en langage Go et est disponible pour la plupart des systèmes d'exploitation (Linux, Mac OS X, Windows). La boite développe aussi FileCoin, une solution de stockage avec rémunération, ainsi que libp2p, qui est la couche réseau utilisée par IPFS, IPLD, qui décrit le modèle de données pour un web décentralisé, et Multiformats.
IPFS cherche vraiment à remplacer (ou au moins trouver un modèle alternatif) au web centralisé essentiellement basé sur HTTP(S). Les adresses utilisées dans ce web décentralisé pointent non pas vers un emplacement (comme l'adresse IP d'un hôte) mais vers un contenu, identifié par un hash appellé **cid** (comme Content Identifier). Ce contenu peut être hébergé de façon décentralisée, comme avec BitTorrent, ce qui permet à l'auteur de ce contenu de ne pas avoir à l'héberger lui-même. La réplication des données confère au réseau une résilience et un rôle de protection contre la censure.
On peut naviguer sur IPFS avec un navigateur web ordinaire. Celui-ci se branche sur le [[def>daemon|démon]] IPFS en tâche de fond.
Fin 2018, le projet [[https://github.com/ipfs/go-ipfs/commits/master|poursuit son développement]] de façon soutenue.
===== Fonctionnement =====
==== Authentification ====
Si IPFS souhaite remplacer le web, il doit aussi remplacer HTTPS. Ca tombe bien, le protocole https est embourbé dans un vieux problème qui est celui des certificats et que IPFS pourrait évacuer. La confiance que l'on peut avoir dans une connexion sécurisée par https dépend d'un certificat, qui lui-même dépend des Autorités de Certifications (CA) embarquées dans votre système d'exploitation et dans votre navigateur. Ce système est réputé imparfait pour son approche top-down : le privilège d'être une autorité de certification n'est accordé qu'à certaines entreprises ou organismes, qui ont le pouvoir de certifier que les clés utilisées durant le chiffrement appartiennent bien au site consulté. Ce service de certificats a longtemps été monnayé, et cause de désagréments pour les personnes hébergeant des sites préférant s'en dispenser. L'arrivée des certificats //Let's encrypt// a permis de rendre plus accessible ce système, mais le modèle reste imparfait car les certificats restent manipulables par les nombreuses autorités dont il est illusoire de penser qu'elles sont toutes dignes de confiance. Ces autorités de certification ont donc un rôle ambigü, qui peuvent en faire par exemple des alliés privilégiés de la surveillance d'État rendue publique par Edward Snowden.
Dans les initiatives de web décentralisé, d'autres modèles cryptographiques sont envisagés.
==== Adressage et intégrité des ressources ====
D'abord, les ressources que vous consultez sont identifiées, on l'a dit, par des cid, qui permettent de vérifier que le résultat qui vous est servi est bien celui correspondant au hash (principe de l'intégrité). Le contenu ne sera donc pas modifié malintentionellement durant son voyage dans le réseau.
IPFS utilise la DHT (merkle tree).
L'utilisation de cid a plusieurs inconvénients.
D'abord, les adresses (URIs) utilisées sur ces réseaux sont alambiquées et très difficiles à retenir, puisqu'il s'agit de [[def>checksum|hashs]].
Un exemple : /ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs/ada.png ...
... auquel vous pouvez accéder :
* [[http://localhost:8080/ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs/ada.png|depuis votre propre instance IPFS]] (si vous l'avez démarré avec ''ipfs daemon'')
* ou bien [[https://ipfs.io/ipfs/QmZpc3HvfjEXvLWGQPWbHk3AjD5j8NEN4gmFN8Jmrd5g83/cs/ada.png|via une passerelle IPFS]], la plus utilisée étant ipfs.io mise en place par Cloudflare
D'autre part, la ressource sur laquelle pointe cette adresse ne peut pas être modifiée ni mise à jour. Si j'ai envie de rajouter une moustache à Ada, je devrai vous communiquer un nouveau lien. Ce n'est pas très pratique si mes envies de dessiner sont fréquentes. Cet inconvénient a deux solutions proposées : DNSLink, et IPNS (voir plus bas).
==== Stockage des ressources ====
IPFS utilise une blockchain pour stoquer les liens IPFS. Les données en elles-mêmes ne sont donc pas stockées dans la blockchain.
Comme dans un essaim BitTorrent, les données sont échangées entre les pairs, donc si vous partagez quelque chose, et que d'autres personnes le récupèrent, elles deviendront seeders à leur tour, ce qui permet aux ressources de rester accessibles même après que vous vous soyiez déconnecté du réseau. Plus exactement, cela maximise les chances qu'elle soit en ligne.
Plusieurs mécanismes sont proposés pour offrir un type de redondance.
D'abord, il est possible d'organiser plusieurs noeuds ipfs en cluster. Une instance maître (par exemple, votre ordinateur portable) dispose des fichiers et effectue une mise en partage initiale. Les données seront alors répliquées selon vos souhaits parmi les autres serveurs de votre cluster (comme par exemple un ou plusieurs serveurs distants accessibles 24h/24).
Une autre façon d'influer sur la permenance d'une donnée est d'utiliser le «pinning» sur une donnée qui se situe dans votre cache de données. Votre noeud dispose en effet d'un stockage limité pour stocker les données que vous sollicitez. Si ce cache est rempli, il supprimera les données anciennes. Le pin sert donc à indiquer qu'une ressource ne doit pas être supprimée du cache. Le pinning peut être sollicité auprès de noeuds autres que les votres, mais il faut pour cela passer par un mécanisme extérieur à IPFS, ce type de service est toutefois [[https://docs.ipfs.io/guides/concepts/pinning/#pinning-services|envisagé]] dans la doc, et des personnes se mettent en place avec leurs propres conditions, souvent en lien avec un système de monétarisation, comme [[https://www.eternum.io/|ce site]] ou bien [[https://twitter.com/ipfspin/status/1053376847596187648|cette personne]] sur twitter. L'hébergement redevient un service payant, bien que pas nécessairement : libre à la communauté de choisir ce qu'elle héberge, et de favoriser tel ou tel contenu.
===== Comparaison avec le web : IPFS, DNSLink et IPNS =====
IPFS ne se charge que de calculer les hashs des fichiers mis en partage. Comme avec BitTorrent, si le contenu de l'un de ces fichiers change, le hash sera altéré. Le problème est alors que les noeuds qui ne connaissent que l'ancien hash ne seront pas alertés de cette modification.
Nous étions habitués avec Bittorrent à ce que, une fois la ressource partagée, celle-ci n'évolue plus, et que tout changement soit republié en tant que nouveau torrent. IPFS dispose de mécanismes donnant une réponse à ce problème, typiquement via un niveau d'indirection.
Les deux mécanismes actuellement proposés sont :
* [[https://docs.ipfs.io/guides/concepts/dnslink/|DNSLink]], qui repose sur les registres DNS d'un nom de domaine
* et IPNS, qui correspond au hash d'une clé publique pointant vers un registre qui ne peut être mis à jour que par la personne disposant de la clé privée.
==== DNSlink ====
Si vous disposez d'un nom de domaine, vous pouvez vous en servir pour pointer vers une ressource IPFS.
IPFS utilise pour cela les registres TXT.
Ci-dessous un exemple de réponse DNS pour le site ipfs.io, lui-même hébergé sur IPFS, disposant d'un sous-domaine "docs" dont le registre dnslink pointe vers une ressource IPFS particulière :
$ dig +noall +answer TXT _dnslink.docs.ipfs.io
_dnslink.docs.ipfs.io. 1800 IN TXT "dnslink=/ipfs/QmV29UU6pxUD1jkcY6oBfYNw9zi15LvrrHyESg35PVtKFd"
==== IPNS ====
[[https://docs.ipfs.io/guides/concepts/ipns/|IPNS]] (Inter Planetary Naming System) est un système de signature par chiffrement asymétrique permettant d'établir qu'une ressource ne peut être mise à jour que par l'entité qui possède la clé privée.
Un lien IPNS se présente comme un nouveau hash (une clé publique) qui cette fois-ci se réfère à la dernière version d'une ressource, qui peut ainsi évoluer.
La personne disposant de la clé privée correspondant à la clé IPNS pourra mettre à jour le registre IPNS en signant les données.
==== Conclusion ====
Ces deux mécanismes permettent à la fois d'envisager IPFS en tant que web décentralisé, mais aussi de pallier à un problème fréquent avec Bittorrent qui est le caractère figé des ressources.
IPFS prétend également jouer le rôle de CDN (Content Delivery Network). Dans le principe cela signifie qu'une ressource sera récupérée depuis les noeuds proches du votre, plutôt que ceux qui sont éloignés. Il faudrait toutefois vérifier en quoi techniquement cette appellation est pertinente (ou plus pertinente qu'elle ne s'appliquerait déjà au sein du réseau BitTorrent, par exemple).
===== Passerelle HTTP =====
Pour consulter une ressource sur IPFS, vous pouvez bien sûr installer IPFS et envoyer une requête pour la récupérer, mais vous pouvez aussi utiliser votre navigateur web et vous rendre sur le site d'une passerelle pour y solliciter la ressource que vous désirez.
Il vous suffit d'indiquer le hash de la ressource à laquelle vous désirez accéder pour qu'elle vous soit servie par HTTP, directement dans votre navigateur.
Cloudflare propose une telle passerelle (et on ne vous en recommande pas l'usage car cet acteur s'accapare un lourd pouvoir d'observation du traffic internet), mais d'autres existent.
Ce type de passerelle est une commodité, et a l'avantage de rendre disponible une ressource pour des personnes non familières à IPFS, qui n'ont pas besoin d'installer ou de comprendre le logiciel.
===== Usages =====
L'installation de IPFS est assez simple, l'usage repose principalement sur la ligne de commande et s'inspire de la syntaxe de git.
Si l'anglais vous convient, vous pouvez regarder [[https://www.youtube.com/watch?v=8CMxDNuuAiQ|cette video de démonstration d'IPFS]] sur Youtube.
Exemple : pour partager toutes les données situées dans le répertoire courant :
ipfs add -r .
Voir aussi: [[https://docs.ipfs.io/introduction/usage/|la doc officielle]]
==== Amorcer votre noeud IPFS ====
Vous devriez avant toute chose commencer par amorcer ipfs.
ipfs init
Suivez le tutorial intégré à ipfs.
Vous devrez pouvoir lancer le démon ipfs pour passer en mode connecté, puis vous pouvez interroger la liste des noeuds accessibles.
ipfs daemon
ipfs swarm peers
==== Accéder à l'interface web ====
Il suffit de se rendre avec votre navigateur sur [[http://localhost:5001/webui|http://localhost:5001/webui]].
* http://localhost:8080/ipfs/ TODO: en quoi ces ports diffèrent ?
* http://localhost:5001/ipfs/ TODO
===== Projets utilisant IPFS =====
Les possibilités d'IPFS sont encore en cours d'exploration, d'autres outils en font des usages plus ciblés.
Une liste de ces projets est illustrée dans la section «[[https://awesome.ipfs.io/|Awesome]]» du site d'IPFS.
On y trouve des choses comme :
* [[https://brig.readthedocs.io/en/latest/|brig]], un outil proposant des fonctions similaires à Git sur IPFS
* un plugin pour beets, logiciel de gestion avancée de collection musicale
* DTube, site de partage de videos similaire à Youtube mis en place par Steemit. Le STEEM est une cryptomonnaie proposant une rétribution selon les votes positifs obtenus lors de la publication d'un contenu (voir leur [[https://steemit.com/faq.html#What_is_Steemit_com|FAQ]]).
* OpenBazaar, plateforme d'achats fonctionnant avec des cryptomonnaies.
* Et d'autres trucs, comme des applications utilisant [[p2p>bitcoin|Ethereum]].
Autre initiative, [[https://textile.io/|Textile]] est une collection d'outils permettant l'usage d'IPFS dans votre application (si j'ai bien compris).
===== Liens =====
* Site officiel : http://ipfs.io/
* Github : https://github.com/jbenet/ipfs,
* Journal DLFP qui en parle : http://linuxfr.org/news/ipfs-un-protocole-revolutionnaire-pour-un-hebergement-p2p-resilient-a-la-censure
* Un autre article de vulgarisation sur IPFS : https://lucas.bourneuf.net/blog/ipfs.html (si vous connaissez déjà p2pfr et êtes familiers avec les notions de notre [[:glossaire]], il est probable qu'une bonne partie des explications de l'article soit superflue)
* Un récapitulatif technique d'IPFS (en anglais) : https://medium.com/@seraya/ipfsf-abd5fccf528
* Rien à voir, les cours de Michel Foucault restaurés, hébergés sur IPFS : https://freefoucault.eth.link/ - utilise une passerelle web qui re-centralise, Michel tu vaux mieux !
* P2P similaires : [[p2p>Dat]]
{{tag>type:réseau-p2p type:client-p2p licence:libre réseau:ipfs système:windows système:mac système:linux}}