IPFS: un occhio al futuro di Internet
di jolek78
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 Filecoin.
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:
┬─[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:
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:
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 🙂
jolek78
La criptomoneta associata a IPFS é Filecoin non Litecoin…
molto vero
corretto. grazie 🙂