IPFS senza dolore (ma questo non è accurato)

IPFS senza dolore (ma questo non è accurato)

Nonostante fosse già su Habré più di un articolo su IPFS.

Preciso subito che non sono un esperto in questo campo, ma ho espresso più di una volta interesse per questa tecnologia, ma provare a giocarci spesso mi ha causato qualche sofferenza. Oggi ho ricominciato a sperimentare e ho ottenuto alcuni risultati che vorrei condividere. In breve verrà descritto il processo di installazione di IPFS e alcuni trucchi (tutto è stato fatto su Ubuntu, non l'ho provato su altre piattaforme).

Se ti sei perso cos'è IPFS, è scritto in dettaglio qui: habr.com/en/post/314768

Installazione

Per la purezza dell'esperimento, suggerisco di installarlo subito su qualche server esterno, poiché considereremo alcune insidie ​​​​nel lavorare in modalità locale e remota. Poi, se vuoi, non ci vorrà molto a demolirlo, lì non c'è molto.

Installa vai

Documentazione ufficiale
Per la versione attuale, cfr golang.org/dl

Nota: è preferibile installare IPFS per conto dell'utente che si prevede lo utilizzerà più frequentemente. Il fatto è che di seguito considereremo l'opzione di montaggio tramite FUSE e ci sono sottigliezze lì.

cd ~
curl -O https://dl.google.com/go/go1.12.9.linux-amd64.tar.gz
tar xvf go1.12.9.linux-amd64.tar.gz
sudo chown -R root:root ./go
sudo mv go /usr/local
rm go1.12.9.linux-amd64.tar.gz

Quindi è necessario aggiornare l'ambiente (maggiori dettagli qui: golang.org/doc/code.html#GOPATH).

echo 'export GOPATH=$HOME/work' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin' >> ~/.bashrc
source ~/.bashrc

Verifica che Go sia installato

go version

Installazione di IPFS

Quello che mi è piaciuto di più è il metodo di installazione: aggiornamento ipfs.

Lo installiamo con il comando

go get -v -u github.com/ipfs/ipfs-update

Successivamente è possibile eseguire i seguenti comandi:

Versioni di aggiornamento ipfs — per visualizzare tutte le versioni disponibili per il download.
versione di aggiornamento ipfs — per vedere la versione attualmente installata (fino a quando non avremo installato IPFS, non sarà disponibile).
ipfs-update installa l'ultima versione — installa l'ultima versione di IPFS. Invece dell'ultima, puoi rispettivamente specificare qualsiasi versione desiderata dall'elenco di quelle disponibili.

Installazione di ipfs

ipfs-update install latest

controllare la

ipfs --version

Tutto direttamente con l'installazione in termini generali.

Avvio di IPFS

inizializzazione

Per prima cosa devi eseguire l'inizializzazione.

ipfs init

In risposta riceverai qualcosa del genere:

 ipfs init
initializing IPFS node at /home/USERNAME/.ipfs
generating 2048-bit RSA keypair...done
peer identity: QmeCWX1DD7HnXXXXXXXXXXXXXXXXXXXXXXXXxxx
to get started, enter:
	ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

È possibile eseguire il comando suggerito

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

risultato

Hello and Welcome to IPFS!

██╗██████╗ ███████╗███████╗
██║██╔══██╗██╔════╝██╔════╝
██║██████╔╝█████╗  ███████╗
██║██╔═══╝ ██╔══╝  ╚════██║
██║██║     ██║     ███████║
╚═╝╚═╝     ╚═╝     ╚══════╝

If you're seeing this, you have successfully installed
IPFS and are now interfacing with the ipfs merkledag!

 -------------------------------------------------------
| Warning:                                              |
|   This is alpha software. Use at your own discretion! |
|   Much is missing or lacking polish. There are bugs.  |
|   Not yet secure. Read the security notes for more.   |
 -------------------------------------------------------

Check out some of the other files in this directory:

  ./about
  ./help
  ./quick-start     <-- usage examples
  ./readme          <-- this file
  ./security-notes

È qui che, secondo me, le cose si fanno interessanti. Anche in fase di installazione, i ragazzi stanno già iniziando a utilizzare le proprie tecnologie. L'hash proposto QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv non è generato appositamente per te, ma incorporato nella versione. Cioè, prima del rilascio, hanno preparato un testo di benvenuto, lo hanno inserito in IPFS e hanno aggiunto l'indirizzo al programma di installazione. Penso che questo sia molto bello. E questo file (più precisamente, l'intera cartella) ora può essere visualizzato non solo localmente, ma anche sul gateway ufficiale ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. In questo caso puoi star certo che il contenuto della cartella non è cambiato in alcun modo, perché se fosse cambiato, sarebbe cambiato anche l'hash.

A proposito, in questo caso IPFS ha alcune somiglianze con un server di controllo della versione. Se apporti modifiche ai file di origine della cartella e carichi nuovamente la cartella su IPFS, riceverà un nuovo indirizzo. Allo stesso tempo, la vecchia cartella non andrà da nessuna parte e sarà disponibile al suo indirizzo precedente.

Lancio diretto

ipfs daemon

Dovresti ricevere una risposta come questa:

ipfs daemon
Initializing daemon...
go-ipfs version: 0.4.22-
Repo version: 7
System version: amd64/linux
Golang version: go1.12.7
Swarm listening on /ip4/x.x.x.x/tcp/4001
Swarm listening on /ip4/127.0.0.1/tcp/4001
Swarm listening on /ip6/::1/tcp/4001
Swarm listening on /p2p-circuit
Swarm announcing /ip4/127.0.0.1/tcp/4001
Swarm announcing /ip6/::1/tcp/4001
API server listening on /ip4/127.0.0.1/tcp/5001
WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
Daemon is ready

Aprire le porte a Internet

Presta attenzione a queste due righe:

WebUI: http://127.0.0.1:5001/webui
Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080

Ora, se hai installato IPFS localmente, accederai alle interfacce IPFS utilizzando indirizzi locali e tutto sarà a tua disposizione (ad esempio, localhost:5001/webui/). Ma se installato su un server esterno, per impostazione predefinita i gateway sono chiusi su Internet. Ci sono due gateway:

  1. amministratore webui (github) sulla porta 5001.
  2. API esterna sulla porta 8080 (sola lettura).

Per ora entrambe le porte (5001 e 8080) possono essere aperte per esperimenti, ma su un server di produzione ovviamente la porta 5001 dovrebbe essere chiusa con un firewall. C'è anche la porta 4001, è necessaria affinché altri peer possano trovarti. Dovrebbe essere lasciato aperto alle richieste provenienti dall’esterno.

Apri ~/.ipfs/config per la modifica e trova queste righe al suo interno:

"Addresses": {
  "Swarm": [
    "/ip4/0.0.0.0/tcp/4001",
    "/ip6/::/tcp/4001"
  ],
  "Announce": [],
  "NoAnnounce": [],
  "API": "/ip4/127.0.0.1/tcp/5001",
  "Gateway": "/ip4/127.0.0.1/tcp/8080"
}

Cambiamo 127.0.0.1 nell'ip del tuo server e salviamo il file, dopodiché riavviamo ipfs (interrompiamo il comando in esecuzione con Ctrl+C ed eseguiamolo di nuovo).

Deve ottenere

...
WebUI: http://ip_вашего_сервера:5001/webui
Gateway (readonly) server listening on /ip4/ip_вашего_сервера/tcp/8080

Ora le interfacce esterne dovrebbero essere disponibili.

Partenza

http://домен_или_ip_сервера:8080/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Il file Leggimi sopra dovrebbe aprirsi.

http://домен_или_ip_сервера:5001/webui/

L'interfaccia web dovrebbe aprirsi.

Se hai webui in esecuzione, le impostazioni IPFS possono essere modificate direttamente al suo interno, inclusa la visualizzazione delle statistiche, ma di seguito prenderò in considerazione le opzioni di configurazione direttamente tramite il file di configurazione, che generalmente non è fondamentale. È solo meglio ricordare dove si trova esattamente la configurazione e cosa farne, altrimenti se l'interfaccia web non funziona, sarà più difficile.

Configurazione di un'interfaccia web per funzionare con il tuo server

Ecco la prima trappola, sulla quale sono state spese tre ore.

Se hai installato IPFS su un server esterno, ma non hai installato o eseguito IPFS localmente, quando vai su /webui nell'interfaccia web dovresti vedere un errore di connessione:

IPFS senza dolore (ma questo non è accurato)

Il fatto è che webui, secondo me, funziona in modo molto diverso. Per prima cosa tenta di connettersi all'API del server su cui è aperta l'interfaccia (ovviamente in base all'indirizzo nel browser). e se non funziona lì, tenta di connettersi al gateway locale. E se hai IPFS in esecuzione localmente, webui funzionerà bene per te, solo che lavorerai con IPFS locale e non esterno, anche se hai aperto webui su un server esterno. Quindi carichi i file, ma per qualche motivo non li vedi solo sul server esterno...

E se non viene avviato localmente, viene visualizzato un errore di connessione. Nel nostro caso l'errore è molto probabilmente dovuto a CORS, segnalato anche da webui, che suggerisce di aggiungere un file config.

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["http://ip_вашего сервера:5001", "http://127.0.0.1:5001", "https://webui.ipfs.io"]'
ipfs config --json API.HTTPHeaders.Access-Control-Allow-Methods '["PUT", "GET", "POST"]'

Ho appena registrato un jolly per me stesso

ipfs config --json API.HTTPHeaders.Access-Control-Allow-Origin '["*"]'

Le intestazioni aggiunte possono essere trovate nello stesso file ~/.ipfs/config. Nel mio caso lo è

  "API": {
    "HTTPHeaders": {
      "Access-Control-Allow-Origin": [
        "*"
      ]
    }
  },

Riavviamo ipfs e vediamo che webui si è connesso con successo (almeno dovrebbe se hai aperto i gateway per le richieste dall'esterno, come descritto sopra).

Ora puoi caricare cartelle e file direttamente tramite l'interfaccia web, nonché creare le tue cartelle.

Montaggio del file system FUSE

Questa è una caratteristica piuttosto interessante.

Possiamo aggiungere file (come cartelle) non solo tramite l'interfaccia web, ma anche direttamente nel terminale, ad esempio

ipfs add test -r
added QmfYuz2gegRZNkDUDVLNa5DXzKmxxxxxxxxxx test/test.txt
added QmbnzgRVAP4fL814h5mQttyqk1aURxxxxxxxxxxxx test

L'ultimo hash è l'hash della cartella principale.

Usando questo hash possiamo aprire la cartella su qualsiasi nodo ipfs (che può trovare il nostro nodo e ricevere i contenuti), possiamo farlo nell'interfaccia web sulla porta 5001 o 8080, oppure possiamo farlo localmente tramite ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Ma puoi anche aprirlo come una normale cartella.

Creiamo due cartelle nella radice e concediamo i diritti su di esse al nostro utente.

sudo mkdir /ipfs /ipns
sudo chown USERNAME /ipfs /ipns

e riavviare ipfs con il flag --mount

ipfs daemon --mount

È possibile creare cartelle in altri posti e specificarne il percorso utilizzando i parametri del demone ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Ora leggere da questa cartella è un po' insolito.

ls -la /ipfs
ls: reading directory '/ipfs': Operation not permitted
total 0

Cioè, non è possibile accedere direttamente alla radice di questa cartella. Ma puoi ottenere il contenuto se conosci l'hash.

ls -la /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx
total 0
-r--r--r-- 1 root root 10 Aug 31 07:03 test.txt

cat /ipfs/QmbnzgRVAP4fL814h5mQttyqxxxxxxxxxxxxxxxxx/test.txt 
test
test

Inoltre, all'interno di una cartella, funziona anche il completamento automatico quando si specifica il percorso.

Come ho detto sopra, ci sono delle sottigliezze con questo tipo di montaggio: per impostazione predefinita, le cartelle FUSE montate sono accessibili solo all'utente corrente (anche root non sarà in grado di leggere da tale cartella, per non parlare degli altri utenti nel sistema) . Se vuoi rendere queste cartelle disponibili ad altri utenti, nella configurazione devi cambiare "FuseAllowOther": false in "FuseAllowOther": true. Ma non è tutto. Se esegui IPFS come root, tutto è OK. E se per conto di un utente normale (anche sudo), riceverai un errore

mount helper error: fusermount: option allow_other only allowed if 'user_allow_other' is set in /etc/fuse.conf

In questo caso, è necessario modificare /etc/fuse.conf decommentando la riga #user_allow_other.

Successivamente riavviamo ipfs.

Problemi noti con FUSE

È stato notato più di una volta il problema che dopo aver riavviato ipfs con il montaggio (e forse in altri casi), i punti di montaggio /ipfs e /ipns diventano inaccessibili. Non è possibile accedervi, ma ls -la /ipfs mostra ???? nell'elenco dei diritti.

Ho trovato questa soluzione:

fusermount -z -u /ipfs
fusermount -z -u /ipns

Quindi riavviamo ipfs.

Aggiunta di un servizio

Naturalmente l'esecuzione nel terminale è adatta solo per i test iniziali. In modalità combattimento, il demone dovrebbe avviarsi automaticamente all'avvio del sistema.

A nome di sudo, crea il file /etc/systemd/system/ipfs.service e scrivi al suo interno:

[Unit]
Description=IPFS Daemon
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=simple
ExecStart=/home/USERNAME/work/bin/ipfs daemon --mount
User=USERNAME
Restart=always

[Install]
WantedBy=multi-user.target

USERNAME, ovviamente, deve essere sostituito con il tuo utente (e forse il percorso completo del programma ipfs sarà diverso per te (devi specificare il percorso completo)).

Attiviamo il servizio.

sudo systemctl enable ipfs.service

Iniziamo il servizio.

sudo service ipfs start

Controllo dello stato del servizio.

sudo service ipfs status

Per purezza dell'esperimento, in futuro sarà possibile riavviare il server per verificare che ipfs si avvii correttamente in automatico.

Aggiunta di peer a noi noti

Consideriamo una situazione in cui abbiamo nodi IPFS installati sia su un server esterno che localmente. Sul server esterno aggiungiamo alcuni file e proviamo a ottenerli tramite IPFS localmente tramite CID. Cosa accadrà? Naturalmente, molto probabilmente il server locale non sa nulla del nostro server esterno e proverà semplicemente a trovare il file tramite CID "chiedendo" a tutti i peer IPFS a sua disposizione (con i quali è già riuscito a "fare conoscenza"). Loro, a loro volta, chiederanno ad altri. E così via finché non viene ritrovato il file. In realtà, la stessa cosa accade quando proviamo a ricevere un file tramite il gateway ufficiale ipfs.io. Se sei fortunato, il file verrà trovato in pochi secondi. E in caso contrario, non verrà trovato nemmeno in pochi minuti, il che incide notevolmente sul comfort del lavoro. Ma sappiamo dove apparirà per primo questo file. Allora perché non diciamo immediatamente al nostro server locale di “guarda prima lì”? A quanto pare, questo può essere fatto.

1. Vai al server remoto e cerca ~/.ipfs/config nel file config

"Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuxxxxxxxxxxxxxxxx",

2. Esegui sudo service ipfs status e cerca le voci Swarm al suo interno, ad esempio:

Swarm announcing /ip4/ip_вашего_сервера/tcp/4001

3. Da questo aggiungiamo un indirizzo generale nel formato “/ip4/ip_of_your_server/tcp/4001/ipfs/$PeerID”.

4. Per affidabilità, proviamo ad aggiungere questo indirizzo ai peer tramite il nostro webui locale.

IPFS senza dolore (ma questo non è accurato)

5. Se tutto è a posto, apri la configurazione locale ~/.ipfs/config, trova "Bootstrap" al suo interno: [...
e aggiungere prima l'indirizzo ricevuto all'array.

Riavvia IPFS.

Ora aggiungiamo il file sul server esterno e proviamo a richiederlo su quello locale. Dovrebbe arrivare velocemente.

Ma questa funzionalità non è ancora stabile. Per quanto ho capito, anche se specifichiamo l'indirizzo del peer in Bootstrap, durante l'operazione ipfs cambia l'elenco delle connessioni attive ai peer. In ogni caso è in corso una discussione su questo punto e sugli auspici riguardo alla possibilità di specificare pari permanenti qui e sembra che supposto aggiungere alcune funzionalità a [email protected]+

L'elenco dei peer attuali può essere visualizzato sia in webui che nel terminale.

ipfs swarm peers

In entrambi i posti puoi aggiungere manualmente la tua festa.

ipfs swarm connect "/ip4/ip_вашего_сервера/tcp/4001/ipfs/$PeerID"

Fino a quando questa funzionalità non verrà migliorata, puoi scrivere uno strumento per verificare la connessione con il peer desiderato e, in caso contrario, per aggiungere una connessione.

Ragionamento

Tra coloro che hanno già familiarità con IPFS, ci sono argomenti sia a favore che contro IPFS. Insomma, l'altro ieri discussione e mi ha spinto a approfondire nuovamente IPFS. E per quanto riguarda la discussione di cui sopra: non posso dire di essere fortemente contrario a nessuna delle argomentazioni degli intervenuti (sono solo in disaccordo con il fatto che un programmatore e mezzo utilizza IPFS). In generale, entrambi hanno ragione a modo loro (soprattutto commento sugli assegni ti fa pensare). Ma se mettiamo da parte la valutazione morale e giuridica, chi darà quale valutazione tecnica di questa tecnologia? Personalmente, ho una sorta di sensazione interiore che "questo è assolutamente necessario, ha determinate prospettive". Ma perché esattamente, non esiste una formulazione chiara. Ad esempio, se si guardano gli strumenti centralizzati esistenti, per molti aspetti sono molto più avanti (stabilità operativa, velocità operativa, controllabilità, ecc.). Tuttavia ho un’idea che sembra sensata e che difficilmente può essere implementata senza sistemi così decentralizzati. Certo, sto esagerando, ma la formulerei in questo modo: il principio della diffusione delle informazioni su Internet deve essere cambiato.

Lasciatemi spiegare. Se la pensi in questo modo, ora distribuiamo le informazioni secondo il principio “Spero che colui a cui le ho date le protegga e non vadano perse o ricevute da qualcuno a cui non erano destinate”. Ad esempio, è facile considerare vari servizi di posta elettronica, archiviazione cloud, ecc. E cosa abbiamo alla fine? Hub su Habré Sicurezza delle informazioni è in prima linea e quasi ogni giorno riceviamo notizie di un'altra fuga di notizie globale. In linea di principio, tutte le cose più interessanti sono elencate nel <ironicamente> meraviglioso articolo L'estate è quasi finita. Non è rimasto quasi nessun dato che non sia stato trapelato. Cioè, i principali giganti di Internet stanno diventando sempre più grandi, accumulano sempre più informazioni e tali fughe di informazioni sono una sorta di esplosioni atomiche di informazioni. Questo non è mai successo prima, ed eccolo di nuovo. Allo stesso tempo, anche se molti comprendono che esistono dei rischi, continueranno ad affidare i propri dati a società terze. In primo luogo, non ci sono molte alternative e, in secondo luogo, promettono di aver riparato tutti i buchi e che ciò non accadrà mai più.

Quale opzione vedo? Mi sembra che inizialmente i dati dovrebbero essere distribuiti apertamente. Ma apertura in questo caso non significa che tutto debba essere di facile lettura. Parlo di apertura di archiviazione e distribuzione, ma non di apertura totale nella lettura. Presumo che le informazioni dovrebbero essere distribuite con chiavi pubbliche. Dopotutto il principio delle chiavi pubbliche/private è vecchio quanto Internet. Se l'informazione non è confidenziale ed è destinata a una cerchia ampia, viene immediatamente pubblicata con una chiave pubblica (ma sempre in forma crittografata, chiunque può decrittografarla con la chiave esistente). In caso contrario, viene pubblicato senza chiave pubblica e la chiave stessa viene trasferita a colui che dovrebbe avere accesso a queste informazioni. Allo stesso tempo, chi deve leggerlo dovrebbe avere solo una chiave, e dove trovare queste informazioni non dovrebbe importargli davvero - le prende semplicemente dalla rete (questo è il nuovo principio di distribuzione per contenuto, e non per indirizzo).

Pertanto, per un attacco massiccio, gli aggressori dovranno ottenere un numero enorme di chiavi private, ed è improbabile che ciò venga fatto in un unico posto. Questo compito, a mio avviso, è più difficile dell'hacking di un servizio specifico.

E qui sorge un altro problema: la conferma della paternità. Adesso su Internet puoi trovare molte citazioni scritte dai nostri amici. Ma dov'è la garanzia che siano stati loro a scriverli? Ora, se ciascuna di queste registrazioni fosse accompagnata da una firma digitale, sarebbe molto più semplice. E non importa dove si trovino queste informazioni, l’importante è la firma, che ovviamente è difficile da falsificare.

Ed ecco la cosa interessante: IPFS contiene già strumenti di crittografia (dopo tutto, è basato sulla tecnologia blockchain). La chiave privata è immediatamente indicata nel config.

  "Identity": {
    "PeerID": "QmeCWX1DD7HnPSuMHZSh6tFuMxxxxxxxxxxxxxx",
    "PrivKey": "CAASqAkwggSkAgEAAoIBAQClZedVmj8JkPvT92sGrNIQmofVF3ne8xSWZIGqkm+t9IHNN+/NDI51jA0MRzpBviM3o/c/Nuz30wo95vWToNyWzJlyAISXnUHxnVhvpeJAbaeggQRcFxO9ujO9DH61aqgN1m+JoEplHjtc4KS5
pUEDqamve+xAJO8BWt/LgeRKA70JN4hlsRSghRqNFFwjeuBkT1kB6tZsG3YmvAXJ0o2uye+y+7LMS7jKpwJNJBiFAa/Kuyu3W6PrdOe7SqrXfjOLHQ0uX1oYfcqFIKQsBNj/Fb+GJMiciJUZaAjgHoaZrrf2b/Eii3z0i+QIVG7OypXT3Z9JUS60
KKLfjtJ0nVLjAgMBAAECggEAZqSR5sbdffNSxN2TtsXDa3hq+WwjPp/908M10QQleH/3mcKv98FmGz65zjfZyHjV5C7GPp24e6elgHr3RhGbM55vT5dQscJu7SGng0of2bnzQCEw8nGD18dZWmYJsE4rUsMT3wXxhUU4s8/Zijgq27oLyxKNr9T7
2gxqPCI06VTfMiCL1wBBUP1wHdFmD/YLJwOjV/sVzbsl9HxqzgzlDtfMn/bJodcURFI1sf1e6WO+MyTc3.................

Non sono uno specialista della sicurezza e non so esattamente come usarlo correttamente, ma mi sembra che queste chiavi vengano utilizzate a livello di scambio tra i nodi IPFS. E anche js-ipfs e progetti di esempio come orbita-db, su cui funziona orbit.chat. Cioè, teoricamente, ogni dispositivo (mobile e non solo) può essere facilmente dotato delle proprie macchine di crittografia e decrittografia. In questo caso, tutto ciò che resta è che tutti si prendano cura di preservare le proprie chiavi private e ognuno sarà responsabile della propria sicurezza e non sarà ostaggio dell’ennesimo fattore umano su qualche gigante di Internet super popolare.

Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.

Hai mai sentito parlare di IPFS?

  • Non ho mai sentito parlare di IPFS, ma sembra interessante

  • Non ho sentito e non voglio sentire

  • Ne avevo sentito parlare, ma non ero interessato

  • L'ho sentito, ma non l'ho capito, ma ora sembra interessante

  • Utilizzo attivamente IPFS da molto tempo.

69 utenti hanno votato. 13 utenti si sono astenuti.

Fonte: habr.com

Aggiungi un commento