Skip to content

Instantly share code, notes, and snippets.

@YannBouyeron
Last active Sep 5, 2021
Embed
What would you like to do?
InterPlanetary File System - Tutoriel

IPFS tutoriel

L`IPFS ou InterPlanetary File System est un protocole pair à pair (p2p) de distribution de contenu adressable par hypermédia. Il permet de "stocker" des fichiers ou des arborescences de fichiers de manière décentralisée et permanente, et d’y accéder via un noeud ipfs ou via un navigateur web. Il permet aussi d’héberger un site web statistique.

Installer ipfs

Rendez vous sur le site de IPFS et suivez les instructions.

Pour une installation sur raspbian:

Téléchargez la dernière version de ipfs:

wget https://dist.ipfs.io/go-ipfs/v0.4.13/go-ipfs_v0.4.13_linux-arm.tar.gz

Décompressez:

tar xvf go-ipfs_v0.4.13_linux-arm.tar.gz

Placez vous dans le répertoire go-ipfs

cd go-ipfs

Installez:

sudo make install

Puis:

sudo ./install

Initialisez votre noeud:

ipfs init

Lancer le daemon:

Ouvrez un terminal Linux et entrez la commandes suivante:

ipfs daemon

Lister les peers connectés à votre noeud ipfs:

ipfs swarm peers

Partager un fichier:

ipfs add <path du fichier>

Vous récupérez alors le hash

Lister les peers possédant un fichier:

ipfs dht findprovs <hash du fichier>

Accéder à votre fichier

ipfs cat <hash>

Ou

curl http://127.0.0.1:8080/ipfs/<hash>

Ou

curl https://ipfs.io/ipfs/<hash>

Ou pour le télécharger

ipfs get <hash>

ou

wget https://ipfs.io/ipfs/<hash>

Ou depuis votre navigateur internet à l’adresse: https://ipfs.io/ipfs/<hash>

Héberger un site

On va dans un premier temps créer un répertoire pour notre site, et se placer dedans:

pi@stretch:~ $ mkdir ipfsite
pi@stretch:~ $ cd ipfsite/

On crée ensuite un fichier index.html:

<!doctype html>

<html>
            
<head>
	<meta charset="utf-8">
	<title>Index</title>
	<link rel="stylesheet" href="style.css" type="text/css" />                                                                                
</head>
                                                                                    
<body>
                                                                                                    
	<h1>Bienvenue sur mon site web</h1>     
                                                                                                                                                                                                                                      
</body>
                                                                                                                            
</html>

On crée aussi un fichier style.css:

h1 {
	
	color:green;
}

Notre répertoire contient donc désormais deux fichiers:

pi@stretch:~/ipfsite $ ls
index.html  style.css

On ajoute nos fichiers sur ipfs:

pi@stretch:~/ipfsite $ ipfs add -r .
added QmSyMfjwNyuHUQE4YJ6Rq78YaztbuhRnhTxfEwQvULHqhK ipfsite/index.html
added QmNrbWL1C5GYRgHfKYMA9iFVk6NUQimUDZopBtEPhB8RZv ipfsite/style.css
added QmeufZKLAwGkFobboRfj2xJx7DwGxe6PyQYUXiqXPuTR5T ipfsite

Notre site est désormais accessible, à l’adresse suivante: https://ipfs.io/ipfs/QmeufZKLAwGkFobboRfj2xJx7DwGxe6PyQYUXiqXPuTR5T/ mais si vous effectuez des modifications sur votre site, cette adresse (qui est le hash de votre site) va changer (l’ancienne adresse existera toujours, mais elle continuera à pointer vers l’ancienne version du site), on va donc ajouter un domaine IPNS:

pi@stretch:~/ipfsite $ ipfs name publish QmeufZKLAwGkFobboRfj2xJx7DwGxe6PyQYUXiqXPuTR5T
Published to QmTMJG3uKfPVhS6JhwxMNBMx2Y4Em2kjwWnCysiGaaaJeY: /ipfs/QmeufZKLAwGkFobboRfj2xJx7DwGxe6PyQYUXiqXPuTR5T

Notre site est désormais accessible à l’adresse https://ipfs.io/ipns/QmTMJG3uKfPVhS6JhwxMNBMx2Y4Em2kjwWnCysiGaaaJeY/

On peut alors ajouter, modifier des fichiers dans notre répertoire, à condition de répeter les deux dernières étapes (ipfs add -r . et ipfs name publish) afin de prendre en compte nos modifications. L’adresse https://ipfs.io/ipns/QmTMJG3uKfPVhS6JhwxMNBMx2Y4Em2kjwWnCysiGaaaJeY/ pointera toujours vers votre site actualisé depuis le dernier ipfs name publish.

C’est tellement facile que ca donne presque envie de créer un autre site. Il vous faut alors un autre domaine ipns; il faut pour cela vous créer une nouvelle paire de clés, et il faudra mentionner le nom de la clé (et donc du domaine ipns) lorsque vous executerez la commande publish comme ceci: ipfs name publish -k <nom de la clé> <hash>

Gérer ses clés

Une première paire de clé est automatiquement générée lors de l’initialisation de ipfs

Créer et ajouter une nouvelle paire de clés.

ipfs key gen <name> -t rsa -s 2048

Afficher la liste des clés:

ipfs key list

Vous pouvez aussi renommer ou supprimer une clé avec les commandes ipfs key rename et ipfs key rm

IPFS API

API en ligne:

My IPFS API est une application web hébergée sur IPFS et permettant d’ajouter du texte ou de uploader des fichiers sur IPFS

Le code source de l’application est accesible ici

ipfshttpclient

Ce module python vous permet de gérer votre noeud IPFS local ou un noeud public (comme infura) avec python:

Installer ipfshttpclient:

>>> pip install ipfshttpclient

Puis dans python:

>>> import ipfshttpclient

>>> infura = ipfshttpclient.connect('/dns/ipfs.infura.io/tcp/5001/https', chunk_size=20000, session=True)

>>> local = ipfshttpclient.connect('/ip4/127.0.0.1/tcp/5001/http', chunk_size=20000, session=True)

Les objets 'infura' et 'local' vous donnent alors accès à toutes les fonctions de IPFS: .add(path), .add_str(str), .add_json(json), .cat(hash), .get(hash), .get_json(path), .id() ...

Avec l’api Infura et requests:

import json
import requests
import os


def addtxt(text, title="file.txt"):
	
	""" Ajoute du text sur ipfs """

	url = "https://ipfs.infura.io:5001/api/v0/add"
		
	files = {'file': (title, text)}
	
	r = requests.post(url, files=files)
	
	return r.json()
	
	


def addfile(path):
	
	""" Ajoute un fichier sur ipfs """
	
	if os.path.isfile(path) == False:
		
		return False
	
	url = "https://ipfs.infura.io:5001/api/v0/add"
	
	params = (('pin', 'false'),)
	
	files = {'file': (path, open(path, 'rb'))}

	r = requests.post(url, files=files, params=params)
	
	return r.json()
	
	
	

	
def getfile(hash):
	
	url = "https://ipfs.infura.io:5001/api/v0/cat"
	
	payload = {"arg":hash}
	
	r = requests.get(url, params=payload)
	
	try:
		
		return r.json()
		
	except:
		
		return r.text
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment