IPFS: un occhio al futuro di Internet

Dal blog

https://www.labottegadelbarbieri.org/

di jolek78 28 Maggio 2021

Ogni giorno nasce una gazzella, e sa che dovrà correre più veloce del leone per poter sopravvivere. Ogni giorno nasce un file, e sa che dovrà correre più veloce del censore per poter sopravvivere. Noi, da questo blog, noto anche nell’ambiente come l’ottava meraviglia del mondo (ma non ditelo all’UNESCO) parteggiamo per la gazzella e ci domandiamo se esista un sistema per poter accedere a quel file, in maniera limpida e chiara, senza dover per forza sembrare hacker in cerca di metanfetamine sul dark web. Quel sistema esiste e si chiama IPFS, acronimo che sta per interplanetary filesystem, ed è in buona sostanza un sistema molto simile a bittorrent per condividere files in maniera decentralizzata sul web. Non è chiaro? Tranquilli, non era chiaro neanche a me poco più di un anno fa…

Il salto in lungo

Il principio che sta alla base di tutto è la distribuzione dei file. Normalmente, quando si decide d’inserire qualcosa sul web, si fa l’upload dello stesso su un server, si condivide l’url (quello che comincia per http:// tanto per essere chiari) e si invitano gli utenti a visitare l’indirizzo. Questo pero’ in buona sostanza richiede una serie di passaggi, poiché la connessione non andrà dritta come una freccia da un punto A ad un punto B, ma passera’ attraverso diversi nodi presenti sul web per poi, alla fine, arrivare a destinazione. Come se per andare da Edimburgo a Bologna, facessi prima tappa a Doha, poi a Sidney, poi a Kuala Lumpur, poi a New York, poi a Parigi, e poi, soltanto alla fine, a Bologna.

Se non è chiaro, giusto per fare un esempio, dalla mia macchina per raggiungere il server di google abbiamo bisogno almeno di 13 salti:

┬─[jolek78@ubuntu-mizar:~]─[00:39:09]
╰─>$ host google.com
google.com has address 172.217.16.238
google.com has IPv6 address 2a00:1450:4009:821::200e

┬─[jolek78@ubuntu-mizar:~]─[00:44:14]
╰─>$ traceroute 172.217.16.238
traceroute to 172.217.16.238 (172.217.16.238), 64 hops max
  1   192.168.0.1  3.074ms  2.331ms  1.860ms 
  2   10.53.36.121  10.697ms  9.816ms  7.907ms 
  3   62.255.229.185  11.303ms  13.860ms  11.932ms 
  4   *  *  * 
  5   62.253.175.22  19.237ms  18.604ms  15.106ms 
  6   212.250.14.126  24.289ms  22.888ms  20.552ms 
  7   *  *  * 
  8   142.250.215.126  70.325ms  21.846ms  20.903ms 
  9   108.170.246.143  21.814ms  126.396ms  18.417ms 
 10   216.239.58.3  117.819ms  19.127ms  19.128ms 
 11   209.85.250.184  105.056ms  21.616ms  115.858ms 
 12   74.125.242.65  52.830ms  18.207ms  86.048ms 
 13   172.217.16.238  20.138ms  116.208ms  17.548ms

Immaginate ora un sistema dove ogni nodo della rete contenga una sorta di copia distribuita del file da noi condiviso sul web. L’avete immaginato?

sha256, questo sconosciuto

Ogni file ha una targa. Esattamente come un’automobile, ogni file ha le sue caratteristiche e conserva al suo interno proprietà che sono sue e soltanto sue. Ma siccome sono come San Tommaso, e se non vedo non credo, facciamo un esempio. Creiamo un file contenente la novella di Coleridge “la ballata del vecchio marinaio” e visualizziamo la sua targa:

┬─[jolek78@ubuntu-mizar:~]─[01:17:01]
╰─>$ vim the-rhyme-of-the-ancient-mariner.txt 

┬─[jolek78@ubuntu-mizar:~]─[01:17:51]
╰─>$ head -n 20 the-rhyme-of-the-ancient-mariner.txt 
Part I

It is an ancient mariner
And he stoppeth one of three.
--"By thy long grey beard and glittering eye,
Now wherefore stoppest thou me?

The bridegroom's doors are opened wide,
And I am next of kin;
The guests are met, the feast is set:
Mayst hear the merry din."

He holds him with his skinny hand,
"There was a ship," quoth he.
"Hold off! unhand me, grey-beard loon!"
Eftsoons his hand dropped he.

He holds him with his glittering eye--
The wedding-guest stood still,
And listens like a three-years' child:

┬─[jolek78@ubuntu-mizar:~]─[01:18:05]
╰─>$ wc -l the-rhyme-of-the-ancient-mariner.txt 
790 the-rhyme-of-the-ancient-mariner.txt

┬─[jolek78@ubuntu-mizar:~]─[01:18:17]
╰─>$ sha256sum the-rhyme-of-the-ancient-mariner.txt
3fb5782b75df9fa9a667278811800ffcd119c81b6e24fe53f5b4d131b5a88148 the-rhyme-of-the-ancient-mariner.txt

La targa dunque è:

3fb5782b75df9fa9a667278811800ffcd119c81b6e24fe53f5b4d131b5a88148

Cosa vuol dire questo? Che quella targa contiene in se’ le informazioni che la identificano riguardo i suoi metadata. Il che vuol dire anche che, se ne modifichiamo il contenuto, assumera’ una ash – targa – differente. Non ci credete? Proviamo ad aggiungere qualcosa nel file e verifichiamo:

┬─[jolek78@ubuntu-mizar:~]─[12:02:05]
╰─>$ echo "this is just a line, don't worry coleridge" >> the-rhyme-of-the-ancient-mariner.txt

┬─[jolek78@ubuntu-mizar:~]─[12:02:13]
╰─>$ sha256sum the-rhyme-of-the-ancient-mariner.txt
b8786d9c6392f6ed6fe29624a06449c55d4797701da99af30de96bedc68f3420 the-rhyme-of-the-ancient-mariner.txt

La nuova targa dunque e’:

b8786d9c6392f6ed6fe29624a06449c55d4797701da99af30de96bedc68f3420

IPFS for noobs

Che senso ha fare un percorso lungo quando se ne può fare uno più corto? È esattamente quello che si sono domandati i creatori dell’interplanetary filesystem circa sei anni fa. Tutto nasce da un progetto di ricerca che stava alla base dei Protocol Labs. Juan Bennet, un ragazzo americano appassionato di tecnologia, giusto nel 2004 era alla ricerca di un nuovo sistema che potesse strutturare interamente le basi per una nuova cripto moneta alternativa al Bitcoin. Esattamente come il fantomatico e ormai leggendario Satoshi Nakamoto, pubblico’ sul web un white paper per descrivere alla comunità dei computer scientists questa nuova idea. Chiamo’ appunto il sistema IPFS e la cripto moneta Litecoin .

Ma come funziona esattamente? Se avete familiarità col sistema bittorrent vi sarà subito chiaro. Facciamo finta che voi abbiate il file .txt precedentemente modificato, ovvero “la ballata del vecchio marinaio” di Coleridge, e che vogliate renderlo disponibile all’esterno. Sulla internet tradizionale, voi lo depositerete su un server e fornirete l’indirizzo. Sul IPFS voi lo depositerete all’interno del network, di modo che il file sarà identificato con la sua targa, o meglio, come abbiamo chiarito prima, con la sua chiave hash. L’indirizzo a questo punto non sarà più http:// ma ipfs:// ed esso sarà distribuito sui nodi del network.

È, in buona sostanza, un sistema peer-to-peer basato su un principio molto noto in campo informatico: la distributed hash table. In esso un file non è identificato per il suo indirizzo, ma per la sua hash, ed è condiviso da una serie di nodi che lo rendono disponibile.

Diventare un nodo

Osservare è bello ma partecipare è meglio. Uno dei modi per far parte di questa piccola e non indifferente rivoluzione, è essere membri attivi. Non vi tedierò oltremodo, ma tutte le informazioni su come installare IPFS sulla vostra macchina e farla diventare un nodo sono disponili sulla pagina principale di GitHub

Ma siccome val la pena far vedere passaggio per passaggio, ecco qui come funziona la configurazione. Lo faro’ dalla mia macchina Ubuntu Linux, ma procedure simili esistono per sia per Mac che per Windows:

https://github.com/ipfs/go-ipfs

┬─[jolek78@ubuntu-mizar:/]─[14:07:52]
╰─>$ sudo snap install ipfs
ipfs 0.8.0-ce693d7e8 from Leo Arias (elopio) installed

┬─[jolek78@ubuntu-mizar:/]─[14:08:07]
╰─>$ ipfs init
generating ED25519 keypair...done
peer identity: 12D3KooWMP6PNLijaFC5KeHmibmKonuF9pZEAnPn75Uh6RSdsQLB
initializing IPFS node at /home/jolek78/snap/ipfs/common
to get started, enter:

ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme

┬─[jolek78@ubuntu-mizar:/]─[14:08:38]
╰─>$ ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme
Hello and Welcome to IPFS!

E poi inizializziamo il demone

┬─[jolek78@ubuntu-mizar:/]─[14:08:39]
╰─>$ ipfs daemon
Initializing daemon...
go-ipfs version: 0.8.0-ce693d7e8
Repo version: 11
System version: amd64/linux
Golang version: go1.14.15
Swarm listening on /ip4/10.78.38.1/tcp/4001
Swarm listening on /ip4/10.78.38.1/udp/4001/quic
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip4/127.0.0.1/udp/4001/quic
Swarm listening on /ip4/172.17.0.1/tcp/4001
Swarm listening on /ip4/172.17.0.1/udp/4001/quic
Swarm listening on /ip4/192.168.0.14/tcp/4001
Swarm listening on /ip4/192.168.0.14/udp/4001/quic
Swarm listening on /ip4/192.168.122.1/tcp/4001
Swarm listening on /ip4/192.168.122.1/udp/4001/quic
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /ip6/::1/udp/4001/quic
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip4/127.0.0.1/udp/4001/quic
Swarm announcing /ip4/192.168.0.14/tcp/4001
Swarm announcing /ip4/192.168.0.14/udp/4001/quic
Swarm announcing /ip4/86.3.165.20/udp/4001/quic
Swarm announcing /ip6/::1/tcp/4001
Swarm announcing /ip6/::1/udp/4001/quic
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

IPFS è bello, ma con Firefox di più

Esiste una estensione per Firefox e per i browser piu’ popolari capace, attraverso un semplice pulsante, di farvi vedere lo stato del vostro nodo e molte altre informazioni dell’intero network. Si chiama ipfs-companion e, una volta installata, basterà andare a questo indirizzo per visualizzare tutto quello che vi serve:

http://127.0.0.1:5001/webui/

Pubblicare un file

Andiamo a pubblicare sulla rete il file contenente la novella di Coleridge:

┬─[jolek78@ubuntu-mizar:~]─[15:03:29]
╰─>$ ipfs add the-rhyme-of-the-ancient-mariner.txt
added QmXUXRxnShV7sxseb3uPhHqEdoFZTYt7tNHmw5a6KUa1Rv the-rhyme-of-the-ancient-mariner.txt
19.80 KiB / 19.80 KiB [======================================================================================================================================================] 100.00%

Da terminale, verifichiamo che il file esista sulla rete:

┬─[jolek78@ubuntu-mizar:~]─[15:11:41]
╰─>$ ipfs cat QmXUXRxnShV7sxseb3uPhHqEdoFZTYt7tNHmw5a6KUa1Rv |head 
Part I

It is an ancient mariner
And he stoppeth one of three.
--"By thy long grey beard and glittering eye,
Now wherefore stoppest thou me?

The bridegroom's doors are opened wide,
And I am next of kin;
The guests are met, the feast is set:

et voilà.

Per la serie: trova le differenze

1. b8786d9c6392f6ed6fe29624a06449c55d4797701da99af30de96bedc68f3420
2. QmXUXRxnShV7sxseb3uPhHqEdoFZTYt7tNHmw5a6KUa1Rv

Dov’e’ il file?

Cerchiamolo dal nostro browser attraverso la hash key:

QmXUXRxnShV7sxseb3uPhHqEdoFZTYt7tNHmw5a6KUa1Rv

e con l’estensione attivata, andiamolo a visualizzare dal browser:

https://ipfs.io/ipfs/QmXUXRxnShV7sxseb3uPhHqEdoFZTYt7tNHmw5a6KUa1Rv?filename=the-rhyme-of-the-ancient-mariner.txt

Ricapitolando

– ipfs significa interplanetary filesystem
– e’ un sistema decentralizzato
– basa il suo cuore sulle hash dei file
– e’ alla base della critomoneta litecoin
– potete diventare facilmente nodi della rete
– vi ci potete divertire

Maggiori informazioni

https://ipfs.io/
https://docs.ipfs.io/
https://blog.ipfs.io/
https://github.com/ipfs/go-ipfs
https://github.com/ipfs/ipfs-companion
https://invidious.snopyta.org/channel/UCdjsUXJ3QawK4O5L1kqqsew

… e poi, non perdetevi il Linux Tutorial ogni domenica su “la bottega del barbieri“, mi raccomando

Rispondi

Effettua il login con uno di questi metodi per inviare il tuo commento:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.