IPFS fără durere (dar acest lucru nu este exact)

IPFS fără durere (dar acest lucru nu este exact)

În ciuda faptului că era deja pe Habré mai mult de un articol despre IPFS.

Permiteți-mi să clarific imediat că nu sunt un expert în acest domeniu, dar mi-am exprimat interesul față de această tehnologie de mai multe ori, dar încercarea de a mă juca cu ea a provocat adesea o oarecare durere. Astăzi am început să experimentez din nou și am obținut câteva rezultate pe care aș dori să le împărtășesc. Pe scurt, se va descrie procesul de instalare IPFS și câteva trucuri (totul s-a făcut pe ubuntu, nu l-am încercat pe alte platforme).

Dacă ați omis ce este IPFS, este scris în detaliu aici: habr.com/en/post/314768

Instalare

Pentru puritatea experimentului, vă sugerez să îl instalați imediat pe un server extern, deoarece vom lua în considerare câteva capcane cu lucrul în modul local și la distanță. Apoi, dacă vrei, nu va dura mult să-l demolezi; nu sunt prea multe acolo.

Instalați go

Documentație oficială
Pentru versiunea curentă, vezi golang.org/dl

Notă: Este mai bine să instalați IPFS în numele utilizatorului care se așteaptă să îl folosească cel mai frecvent. Cert este că mai jos vom lua în considerare opțiunea de montare prin FUSE și există subtilități acolo.

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

Apoi trebuie să actualizați mediul (mai multe detalii aici: 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

Verificarea că go este instalat

go version

Instalarea IPFS

Cel mai mult mi-a plăcut metoda de instalare: ipfs-update.

Îl instalăm cu comanda

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

După aceasta, puteți rula următoarele comenzi:

versiuni ipfs-update — pentru a vedea toate versiunile disponibile pentru descărcare.
versiunea ipfs-update — pentru a vedea versiunea instalată curentă (până când vom avea IPFS instalat, nu va fi niciuna).
cel mai recent instalare ipfs-update — instalați cea mai recentă versiune de IPFS. În loc de cea mai recentă, puteți specifica orice versiune dorită din lista celor disponibile.

Instalarea ipfs

ipfs-update install latest

Control

ipfs --version

Totul direct cu instalarea în termeni generali.

Pornirea IPFS

Inițializare

Mai întâi trebuie să efectuați inițializarea.

ipfs init

Ca răspuns, veți primi ceva de genul acesta:

 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

Puteți rula comanda sugerată

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Rezultat

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

Aici, după părerea mea, lucrurile devin interesante. Chiar și în etapa de instalare, băieții încep deja să folosească propriile tehnologii. Hash-ul propus QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv nu este generat special pentru dvs., ci este încorporat în versiune. Adică, înainte de lansare, au pregătit un text de bun venit, l-au turnat în IPFS și au adăugat adresa la programul de instalare. Cred că asta este foarte tare. Și acest fișier (mai precis, întregul folder) poate fi acum vizualizat nu numai local, ci și pe gateway-ul oficial ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. În acest caz, poți fi sigur că conținutul folderului nu s-a schimbat în niciun fel, deoarece dacă s-ar fi schimbat, hash-ul s-ar fi schimbat și el.

Apropo, în acest caz, IPFS are unele asemănări cu un server de control al versiunilor. Dacă faceți modificări la fișierele sursă ale folderului și încărcați din nou folderul în IPFS, acesta va primi o nouă adresă. În același timp, folderul vechi nu va merge nicăieri așa și va fi disponibil la adresa anterioară.

Lansare directă

ipfs daemon

Ar trebui să primești un răspuns ca acesta:

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

Deschiderea ușilor către Internet

Acordați atenție acestor două rânduri:

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

Acum, dacă ați instalat IPFS local, atunci veți accesa interfețele IPFS folosind adrese locale și totul va fi disponibil pentru dvs. (De exemplu, localhost:5001/webui/). Dar atunci când sunt instalate pe un server extern, implicit gateway-urile sunt închise la Internet. Există două porți de acces:

  1. administrator webui (github) pe portul 5001.
  2. API extern pe portul 8080 (numai citire).

Deocamdată, ambele porturi (5001 și 8080) pot fi deschise pentru experimente, dar pe un server de producție, desigur, portul 5001 ar trebui să fie închis cu un firewall. Există și portul 4001, este necesar pentru ca alți colegi să te găsească. Ar trebui lăsat deschis la cereri din exterior.

Deschideți ~/.ipfs/config pentru editare și găsiți aceste linii în el:

"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"
}

Schimbăm 127.0.0.1 la ip-ul serverului tău și salvăm fișierul, după care repornim ipfs (oprim comanda de rulare cu Ctrl+C și rulăm din nou).

Trebuie obținut

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

Acum ar trebui să fie disponibile interfețele externe.

Verifica

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

Fișierul readme de mai sus ar trebui să se deschidă.

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

Ar trebui să se deschidă interfața web.

Dacă rulați webui, atunci setările IPFS pot fi modificate direct în el, inclusiv statisticile de vizualizare, dar mai jos voi lua în considerare opțiunile de configurare direct prin fișierul de configurare, care în general nu este critic. Este mai bine să vă amintiți unde este exact configurația și ce să faceți cu ea, altfel dacă interfața web nu funcționează, va fi mai dificil.

Configurarea unei interfețe web pentru a lucra cu serverul dvs

Iată prima capcană, pe care s-au petrecut trei ore.

Dacă ați instalat IPFS pe un server extern, dar nu ați instalat sau rulat IPFS local, atunci când accesați /webui în interfața web, ar trebui să vedeți o eroare de conexiune:

IPFS fără durere (dar acest lucru nu este exact)

Cert este că webui, în opinia mea, funcționează foarte diferit. În primul rând, încearcă să se conecteze la API-ul serverului unde este deschisă interfața (pe baza adresei din browser, desigur). iar dacă nu funcționează acolo, atunci încearcă să se conecteze la gateway-ul local. Și dacă aveți IPFS care rulează local, atunci webui va funcționa bine pentru dvs., doar că veți lucra cu IPFS local, și nu extern, chiar dacă ați deschis webui pe un server extern. Apoi încărcați fișierele, dar din anumite motive nu le vedeți doar pe serverul extern...

Și dacă nu este lansat local, atunci obținem o eroare de conexiune. În cazul nostru, eroarea se datorează cel mai probabil CORS, care este indicat și de webui, care sugerează adăugarea unei 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"]'

Tocmai am înregistrat un wildcard pentru mine

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

Antetele adăugate pot fi găsite în același ~/.ipfs/config. În cazul meu este

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

Repornim ipfs și vedem că webui s-a conectat cu succes (cel puțin ar trebui dacă ați deschis gateway-urile pentru solicitări din exterior, așa cum este descris mai sus).

Acum puteți încărca foldere și fișiere direct prin interfața web, precum și să vă creați propriile foldere.

Montarea sistemului de fișiere FUSE

Aceasta este o caracteristică destul de interesantă.

Putem adăuga fișiere (cum ar fi foldere) nu numai prin interfața web, ci și direct în terminal, de exemplu

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

Ultimul hash este hash-ul folderului rădăcină.

Folosind acest hash, putem deschide folderul pe orice nod ipfs (care poate să ne găsească nodul și să primească conținutul), o putem face în interfața web de pe portul 5001 sau 8080 sau o putem face local prin ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Dar îl puteți deschide și ca un folder obișnuit.

Să creăm două foldere în rădăcină și să le acordăm drepturi utilizatorului nostru.

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

și reporniți ipfs cu indicatorul --mount

ipfs daemon --mount

Puteți crea foldere în alte locuri și să specificați calea către ele folosind parametrii daemon ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Acum citirea din acest folder este puțin neobișnuită.

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

Adică, nu există acces direct la rădăcina acestui folder. Dar puteți obține conținutul dacă cunoașteți hash-ul.

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

Mai mult, în interiorul unui folder, chiar și completarea automată funcționează atunci când se specifică calea.

După cum am spus mai sus, există subtilități cu acest tip de montare: în mod implicit, folderele FUSE montate sunt accesibile doar utilizatorului actual (nici și root nu va putea citi dintr-un astfel de folder, ca să nu mai vorbim de alți utilizatori din sistem) . Dacă doriți să faceți aceste foldere disponibile pentru alți utilizatori, atunci în configurație trebuie să schimbați „FuseAllowOther”: false în „FuseAllowOther”: true. Dar asta nu este tot. Dacă rulați IPFS ca root, atunci totul este OK. Și dacă în numele unui utilizator obișnuit (chiar și sudo), veți primi o eroare

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

În acest caz, trebuie să editați /etc/fuse.conf prin decomentarea liniei #user_allow_other.

După aceasta, repornim ipfs.

Probleme cunoscute cu FUSE

A fost observată de mai multe ori o problemă că după repornirea ipfs cu montare (și poate în alte cazuri), punctele de montare /ipfs și /ipns devin inaccesibile. Nu există acces la ele, dar ls -la /ipfs arată ???? în lista drepturilor.

Am gasit aceasta solutie:

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

Apoi repornim ipfs.

Adăugarea unui serviciu

Desigur, rularea în terminal este potrivită doar pentru testele inițiale. În modul luptă, demonul ar trebui să pornească automat când sistemul pornește.

În numele sudo, creați fișierul /etc/systemd/system/ipfs.service și scrieți în el:

[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, desigur, trebuie înlocuit cu utilizatorul dvs. (și poate că calea completă către programul ipfs va fi diferită pentru dvs. (trebuie să specificați calea completă)).

Să activăm serviciul.

sudo systemctl enable ipfs.service

Să începem serviciul.

sudo service ipfs start

Verificarea stării serviciului.

sudo service ipfs status

Pentru puritatea experimentului, va fi posibil să reporniți serverul în viitor pentru a verifica dacă ipfs pornește automat cu succes.

Adăugarea de colegi cunoscuți nouă

Să luăm în considerare o situație în care avem noduri IPFS instalate atât pe un server extern, cât și local. Pe serverul extern adăugăm un fișier și încercăm să îl obținem prin IPFS local prin CID. Ce se va intampla? Desigur, serverul local, cel mai probabil, nu știe nimic despre serverul nostru extern și va încerca pur și simplu să găsească fișierul prin CID „întrebând” toți colegii IPFS disponibili pentru el (cu care a reușit deja să „se familiarizeze”). Ei, la rândul lor, îi vor întreba pe alții. Și așa mai departe până când fișierul este găsit. De fapt, același lucru se întâmplă atunci când încercăm să primim un fișier prin gateway-ul oficial ipfs.io. Dacă aveți noroc, fișierul va fi găsit în câteva secunde. Și dacă nu, atunci nu va fi găsit nici în câteva minute, ceea ce afectează foarte mult confortul de lucru. Dar știm unde va apărea primul fișier. Deci, de ce nu spunem imediat serverului nostru local să „Uită-te mai întâi acolo”? Aparent, acest lucru se poate face.

1. Accesați serverul la distanță și căutați ~/.ipfs/config în config

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

2. Rulați sudo service ipfs status și căutați intrările Swarm în el, de exemplu:

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

3. De aici adăugăm o adresă generală de forma „/ip4/ip_of_your_server/tcp/4001/ipfs/$PeerID”.

4. Pentru fiabilitate, să încercăm să adăugăm această adresă colegilor prin intermediul webui-ului nostru local.

IPFS fără durere (dar acest lucru nu este exact)

5. Dacă totul este OK, deschideți configurația locală ~/.ipfs/config, găsiți „Bootstrap” în el: [...
și adăugați mai întâi adresa primită în matrice.

Reporniți IPFS.

Acum să adăugăm fișierul pe serverul extern și să încercăm să îl solicităm pe cel local. Ar trebui să zboare repede.

Dar această funcționalitate nu este încă stabilă. Din câte am înțeles, chiar dacă specificăm adresa peer-ului în Bootstrap, în timpul funcționării ipfs schimbă lista conexiunilor active la peer-uri. În orice caz, o discuție în acest sens și dorințe cu privire la posibilitatea de a specifica colegi permanenți este în curs de desfășurare aici si se pare ca presupus adăugați unele funcționalități la [e-mail protejat]+

Lista colegilor actuali poate fi vizualizată atât în ​​webui, cât și în terminal.

ipfs swarm peers

În ambele locuri puteți adăuga manual propriul festin.

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

Până când această funcționalitate este îmbunătățită, puteți scrie un instrument pentru a verifica o conexiune cu peer-ul dorit și, dacă nu, pentru a adăuga o conexiune.

Raţionament

Printre cei deja familiarizați cu IPFS, există atât argumente pro și contra IPFS. Practic, alaltăieri discuție și m-a îndemnat să caut din nou în IPFS. Și în ceea ce privește discuția menționată mai sus: nu pot spune că sunt puternic împotriva oricăruia dintre argumentele date ale celor care au vorbit (nu sunt doar de acord cu faptul că un programator și jumătate folosesc IPFS). În general, ambele au dreptate în felul lor (în special comentariu despre cecuri te pune pe ganduri). Dar dacă lăsăm deoparte evaluarea morală și legală, cine va da ce evaluare tehnică a acestei tehnologii? Personal, am un fel de sentiment interior că „acest lucru este cu siguranță necesar, are anumite perspective”. Dar de ce exact, nu există o formulare clară. De exemplu, dacă te uiți la instrumentele centralizate existente, atunci, în multe privințe, acestea sunt cu mult înainte (stabilitatea funcționării, viteza de funcționare, controlabilitate etc.). Cu toate acestea, am o idee care pare să aibă sens și care cu greu poate fi implementată fără astfel de sisteme descentralizate. Desigur, fac prea tare, dar l-aș formula astfel: trebuie schimbat principiul diseminării informațiilor pe Internet.

Lasă-mă să explic. Dacă te gândești la asta, acum distribuim informații după principiul „Sper ca cel căruia i-am dat-o să o protejeze și să nu fie pierdută sau primită de cineva căruia nu a fost destinată”. De exemplu, este ușor să luați în considerare diverse servicii de e-mail, stocare în cloud etc. Și ce avem până la urmă? Hub pe Habré Securitatea informațiilor este pe prima linie și aproape în fiecare zi primim știri despre o altă scurgere globală. În principiu, toate cele mai interesante lucruri sunt enumerate în <ironic> minunat articol Vara aproape s-a terminat. Aproape că nu există date care să nu fi fost scurse. Adică, principalii giganți ai internetului devin din ce în ce mai mari, acumulează din ce în ce mai multe informații, iar astfel de scurgeri sunt un fel de explozii atomice informaționale. Acest lucru nu s-a mai întâmplat până acum și iată-l din nou. În același timp, deși mulți înțeleg că există riscuri, vor continua să-și încreadă datele companiilor terțe. În primul rând, nu există prea multă alternativă și, în al doilea rând, promit că au reparat toate găurile și acest lucru nu se va mai întâmpla niciodată.

Ce opțiune văd? Mi se pare că inițial datele ar trebui distribuite deschis. Dar deschiderea în acest caz nu înseamnă că totul ar trebui să fie ușor de citit. Vorbesc despre deschiderea de stocare și distribuție, dar nu de deschidere totală în lectură. Presupun că informațiile ar trebui distribuite cu chei publice. La urma urmei, principiul cheilor publice/private este deja la fel de vechi ca internetul. Dacă informațiile nu sunt confidențiale și sunt destinate unui cerc larg, atunci sunt postate imediat cu o cheie publică (dar încă în formă criptată, oricine le poate decripta cu cheia existentă). Și dacă nu, atunci este postat fără cheia publică, iar cheia în sine este transferată celui care ar trebui să aibă acces la aceste informații. În același timp, cel care trebuie să o citească ar trebui să aibă doar o cheie și de unde să obțină aceste informații nu ar trebui să conteze cu adevărat pentru el - pur și simplu o trage din rețea (acesta este noul principiu al distribuției după conținut, și nu după adresă).

Astfel, pentru un atac masiv, atacatorii vor trebui să obțină un număr mare de chei private, iar acest lucru este puțin probabil să se facă într-un singur loc. Această sarcină, după cum o văd, este mai dificilă decât piratarea unui anumit serviciu.

Și aici intervine o altă problemă: confirmarea calității de autor. Acum pe internet găsești multe citate scrise de prietenii noștri. Dar unde este garanția că ei le-au scris? Acum, dacă fiecare astfel de înregistrare ar fi însoțită de o semnătură digitală, ar fi mult mai simplu. Și nu contează unde se află această informație, principalul lucru este semnătura, care este evident dificil de falsificat.

Și iată ce este interesant aici: IPFS conține deja instrumente de criptare (la urma urmei, este construit pe tehnologia blockchain). Cheia privată este imediat indicată în configurație.

  "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.................

Nu sunt un specialist în securitate și nu știu exact cum să folosesc corect acest lucru, dar mi se pare că aceste chei sunt folosite la nivel de schimb între nodurile IPFS. Si deasemenea js-ipfs și astfel de proiecte exemplu ca orbita-db, pe care funcționează orbită.chat. Adică, teoretic, fiecare dispozitiv (mobil și nu numai) poate fi echipat cu ușurință cu propriile mașini de criptare și decriptare. În acest caz, tot ce rămâne este ca toată lumea să aibă grijă să-și păstreze cheile private și fiecare va fi responsabil pentru propria securitate și nu va fi ostaticul unui alt factor uman pe un gigant super-popular al internetului.

Numai utilizatorii înregistrați pot participa la sondaj. Loghează-te, Vă rog.

Ați mai auzit de IPFS?

  • Nu am auzit niciodată de IPFS, dar pare interesant

  • Nu am auzit și nici nu vreau să aud

  • Am auzit despre asta, dar nu m-a interesat

  • L-am auzit, dar nu am înțeles, dar acum pare interesant

  • Folosesc activ IPFS de mult timp.

Au votat 69 utilizatori. 13 utilizatori s-au abținut.

Sursa: www.habr.com

Adauga un comentariu