IPFS sense dolor (però això no és precís)

IPFS sense dolor (però això no és precís)

Malgrat que Habré ja ho era més d'un article sobre IPFS.

Aclariré de seguida que no sóc un expert en aquesta àrea, però he mostrat interès per aquesta tecnologia més d'una vegada, però intentar jugar-hi sovint em provocava una mica de dolor. Avui he tornat a començar a experimentar i he obtingut alguns resultats que m'agradaria compartir. En resum, es descriurà el procés d'instal·lació d'IPFS i algunes característiques (tot es va fer a ubuntu, no ho he provat en altres plataformes).

Si us heu perdut què és IPFS, està escrit amb cert detall aquí: habr.com/en/post/314768

Instal · lació

Per a la puresa de l'experiment, suggereixo instal·lar-lo immediatament en algun servidor extern, ja que tindrem en compte alguns inconvenients de treballar en mode local i remot. Aleshores, si es vol, no serà enderrocat durant molt de temps, no hi ha gaire.

Instal·leu go

Documentació oficial
Consulteu la versió actual a golang.org/dl

Nota: és millor instal·lar IPFS en nom de l'usuari que se suposa que l'utilitza més sovint. El cas és que a continuació considerarem l'opció de muntar via FUSE i hi ha subtileses.

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

Aleshores, heu d'actualitzar l'entorn (més detalls aquí: 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

Comprovant que go estigui instal·lat

go version

Instal·leu IPFS

M'ha agradat més el mètode d'instal·lació actualització ipfs.

Instal·leu-lo amb l'ordre

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

Després d'això, podeu executar les ordres següents:

versions ipfs-update - per veure totes les versions disponibles per descarregar.
versió ipfs-update - per veure la versió instal·lada actualment (fins que tinguem IPFS instal·lat, no n'hi haurà cap).
ipfs-update instal·lació més recent - instal·leu la darrera versió d'IPFS. En lloc de l'últim, respectivament, podeu especificar qualsevol versió desitjada de la llista de les disponibles.

Instal·lant ipfs

ipfs-update install latest

Comprovació

ipfs --version

Directament amb la instal·lació en termes generals tot.

Inicieu IPFS

Inicialització

Primer heu de realitzar la inicialització.

ipfs init

En resposta, rebreu alguna cosa com això:

 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

Podeu executar l'ordre suggerida

ipfs cat /ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv/readme

Resultat

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

Aquí, al meu entendre, comença l'interessant. Els nois de l'etapa d'instal·lació ja estan començant a utilitzar les seves pròpies tecnologies. El hash proposat QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv no es genera específicament per a vosaltres, sinó que s'ha cosit a la versió. És a dir, abans del llançament, van preparar un text de benvinguda, el van abocar a IPFS i van afegir l'adreça a l'instal·lador. Crec que és molt xulo. I aquest fitxer (més precisament, tota la carpeta) ara es pot veure no només localment, sinó també a la passarel·la oficial. ipfs.io/ipfs/QmS4ustL54uo8FzR9455qaxZwuMiUhyvMcX9Ba8nUH4uVv. Al mateix temps, podeu estar segur que el contingut de la carpeta no ha canviat de cap manera, perquè si hagués canviat, el hash també hauria canviat.

Per cert, en aquest cas, IPFS té algunes similituds amb el servidor de control de versions. Si feu canvis als fitxers font de la carpeta i torneu a abocar la carpeta a IPFS, rebrà una nova adreça. Al mateix temps, la carpeta antiga no anirà enlloc així i estarà disponible a la seva adreça anterior.

Llançament directe

ipfs daemon

Hauríeu de rebre una resposta com aquesta:

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

Obrint les portes a Internet

Fixeu-vos en aquestes dues línies:

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

Ara, si heu instal·lat IPFS localment, accedireu a les interfícies IPFS mitjançant adreces locals i tot estarà disponible per a vosaltres (per exemple, localhost:5001/webui/). Però quan s'instal·len en un servidor extern, per defecte, les passarel·les es tanquen a Internet. Passarel·les dues:

  1. administrador webui (GitHub) al port 5001.
  2. API externa al port 8080 (només de lectura).

Fins ara, els dos ports (5001 i 8080) es poden obrir per a experiments, però en un servidor de combat, per descomptat, el port 5001 s'hauria de tancar amb un tallafoc. També hi ha el port 4001, que és necessari perquè altres companys us puguin trobar. S'ha de deixar obert a sol·licituds externes.

Obriu ~/.ipfs/config per editar-lo i cerqueu-hi aquestes línies:

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

Canvieu 127.0.0.1 a la ip del vostre servidor i deseu el fitxer i, a continuació, reinicieu ipfs (atura l'ordre en execució amb Ctrl+C i torna a iniciar-lo).

Hauria d'aconseguir

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

Ara les interfícies externes haurien d'estar disponibles.

Comprovar

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

S'hauria d'obrir el fitxer readme anterior.

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

S'ha d'obrir la interfície web.

Si webui us funciona, la configuració IPFS es pot canviar directament, incloses les estadístiques de visualització, però a continuació consideraré les opcions de configuració directament a través del fitxer de configuració, que generalment no és crític. És millor recordar exactament on és la configuració i què fer amb ella, en cas contrari, si la cara web no funciona, serà més difícil.

Configuració d'una interfície web per treballar amb el vostre servidor

Aquí teniu la primera trampa, que va trigar unes tres hores.

Si heu instal·lat IPFS en un servidor extern, però no heu instal·lat ni executat IPFS localment, quan aneu a /webui a la interfície web, haureu de veure un error de connexió:

IPFS sense dolor (però això no és precís)

El fet és que webui, al meu entendre, funciona de manera molt ambigua. En primer lloc, intenta connectar-se a l'API del servidor on la interfície està oberta (en funció de l'adreça del navegador, és clar). i si no funciona allà, prova de connectar-se a la passarel·la local. I si tens IPFS que s'executa localment, aleshores webui funcionarà bé per a tu, només treballaràs amb IPFS local, i no extern, tot i que has obert webui en un servidor extern. A continuació, carregueu els fitxers, però per algun motiu no els veieu així en un servidor extern...

I si no s'executa localment, obtenim un error de connexió. En el nostre cas, el més probable és que l'error es degui a CORS, que també s'indica amb webui, que suggereix afegir una configuració.

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"]'

Acabo de registrar un comodí

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

Les capçaleres afegides es poden trobar al mateix ~/.ipfs/config. En el meu cas ho és

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

Reiniciem l'ipfs i veiem que webui s'ha connectat correctament (en qualsevol cas, ho hauria de fer, si heu obert les passarel·les per a sol·licituds des de l'exterior, com s'ha descrit anteriorment).

Ara podeu carregar carpetes i fitxers directament a través de la interfície web, així com crear les vostres pròpies carpetes.

Muntatge del sistema de fitxers FUSE

Aquí teniu una característica força interessant.

Els fitxers (així com les carpetes), podem afegir no només a través de la interfície web, sinó també directament al terminal, per exemple

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

L'últim hash és el hash de la carpeta arrel.

Utilitzant aquest hash, podem obrir una carpeta en qualsevol node ipfs (que pot trobar el nostre node i obtenir el contingut), podem a la interfície web al port 5001 o 8080, o podem localment mitjançant ipfs.

ipfs ls QmbnzgRVAP4fL814h5mQttyqk1aUxxxxxxxxxxxxx
QmfYuz2gegRZNkDUDVLNa5DXzKmKVxxxxxxxxxxxxxx 10 test.txt

Però encara podeu obrir-lo com una carpeta normal.

Creem dues carpetes a l'arrel i atorguem-hi drets al nostre usuari.

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

i reinicieu ipfs amb la bandera --mount

ipfs daemon --mount

Podeu crear carpetes en altres llocs i especificar-ne el camí mitjançant els paràmetres del dimoni ipfs -mount -mount-ipfs /ipfs_path -mount-ipns /ipns_path

Ara llegir d'aquesta carpeta és una mica inusual.

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

És a dir, no hi ha accés directe a l'arrel d'aquesta carpeta. Però podeu obtenir el contingut, coneixent el 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

Al mateix temps, fins i tot l'emplenament automàtic funciona dins de la carpeta quan s'especifica el camí.

Com he dit anteriorment, hi ha subtileses amb aquest muntatge: de manera predeterminada, les carpetes FUSE muntades només estan disponibles per a l'usuari actual (ni tan sols el root no podrà llegir des d'aquesta carpeta, per no parlar d'altres usuaris del sistema). Si voleu que aquestes carpetes estiguin disponibles per a altres usuaris, a la configuració heu de canviar "FuseAllowOther": false per "FuseAllowOther": true. Però això no és tot. Si executeu IPFS com a root, tot està bé. I si en nom d'un usuari normal (fins i tot sudo), obtindreu un error

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

En aquest cas, heu d'editar /etc/fuse.conf eliminant el comentari de la línia #user_allow_other.

Després d'això, reinicieu ipfs.

Problemes coneguts amb FUSE

El problema s'ha observat més d'una vegada que després de reiniciar ipfs amb el muntatge (i potser en altres casos), els punts de muntatge /ipfs i /ipns no estan disponibles. No hi ha accés, i ls -la /ipfs mostra ???? a la llista de drets.

He trobat aquesta solució:

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

A continuació, reinicieu ipfs.

Afegir un servei

Per descomptat, executar-se al terminal només és adequat per a proves inicials. En mode de combat, el dimoni hauria d'iniciar-se automàticament a l'inici del sistema.

En nom de sudo, creeu el fitxer /etc/systemd/system/ipfs.service i escriviu-hi:

[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, per descomptat, s'ha de substituir pel vostre usuari (i potser el camí complet al programa ipfs serà diferent per a vosaltres (heu d'especificar el camí complet)).

Activem el servei.

sudo systemctl enable ipfs.service

Comencem el servei.

sudo service ipfs start

Comprovació de l'estat del servei.

sudo service ipfs status

Per a la puresa de l'experiment, serà possible reiniciar el servidor en el futur per comprovar que ipfs s'inicia correctament automàticament.

Afegint-nos festes conegudes

Penseu en una situació en què tenim nodes IPFS instal·lats tant en un servidor extern com localment. En un servidor extern, afegim algun fitxer i intentem obtenir-lo mitjançant IPFS localment mitjançant CID. Què passarà? Per descomptat, el servidor local molt probablement no sàpiga res del nostre servidor extern i simplement intentarà trobar el fitxer per CID "demanant" a tots els parells d'IPFS disponibles (amb els quals ja ha aconseguit "conèixer-se"). Aquests, al seu torn, preguntaran als altres. I així successivament, fins que es trobi el fitxer. De fet, passa el mateix quan intentem aconseguir el fitxer a través de la passarel·la oficial ipfs.io. Si teniu sort, el fitxer es trobarà en pocs segons. I si no, no es trobarà ni en pocs minuts, la qual cosa afecta molt la comoditat de la feina. Però sabem on apareixerà primer aquest fitxer. Aleshores, per què no li diem immediatament al nostre servidor local "Cerca allà primer"? Pel que sembla, això es pot fer.

1. Anem al servidor remot i busquem a la configuració ~/.ipfs/config

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

2. Executeu l'estat de l'ipfs del servei sudo i cerqueu-hi entrades Swarm, per exemple:

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

3. Afegim a partir d'això l'adreça general de la forma "/ip4/ip_your_server/tcp/4001/ipfs/$PeerID".

4. Per fiabilitat, intentarem afegir aquesta adreça als companys a través del nostre webui local.

IPFS sense dolor (però això no és precís)

5. Si tot està bé, obriu la configuració local ~ / .ipfs / config, cerqueu-hi "Bootstrap": [...
i afegiu primer l'adreça rebuda a la matriu.

Reinicieu IPFS.

Ara afegim el fitxer al servidor extern i intentem sol·licitar-lo al local. Hauria de volar ràpid.

Però aquesta funcionalitat encara no és estable. Pel que entenc, fins i tot si especifiquem l'adreça d'un peer a Bootstrap, ipfs canvia la llista de connexions actives amb peers durant el funcionament. En tot cas, la discussió i desitjos sobre la possibilitat de concretar festes permanents està en marxa aquí i sembla que suposat afegir alguna funcionalitat a [protegit per correu electrònic]+

La llista de companys actuals es pot veure tant a la webui com al terminal.

ipfs swarm peers

I aquí i allà podeu afegir la vostra festa manualment.

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

Fins que no s'hagi millorat aquesta funcionalitat, podeu escriure una eina per comprovar si hi ha una connexió amb el parell desitjat i, si no, per afegir una connexió.

Raonament

Entre els que ja estan familiaritzats amb IPFS, hi ha arguments a favor i en contra d'IPFS. Bàsicament, ahir discussió i em va demanar que tornés a investigar IPFS. I pel que fa a la discussió esmentada anteriorment: no puc dir que m'oposi fermament a qualsevol argument dels qui van parlar (només estic en desacord amb el fet que un programador i mig utilitzen IPFS). En general, tots dos tenen raó a la seva manera (especialment comentari sobre els xecs et fa pensar). Però si descartem la valoració moral i legal, qui farà una valoració tècnica d'aquesta tecnologia? Personalment, tinc una mena de sensació interior que "això s'ha de fer de manera inequívoca, té certes perspectives". Però per què exactament, no hi ha una formulació clara. Com, si ens fixem en les eines centralitzades existents, en molts aspectes estan molt per davant (estabilitat, velocitat, maneigabilitat, etc.). No obstant això, tinc un pensament que sembla tenir sentit i que difícilment es pot implementar sense aquests sistemes descentralitzats. Per descomptat, m'estic balancejant massa, però ho formularia així: s'ha de canviar el principi de difusió de la informació a Internet.

Deixa'm explicar. Si hi penseu bé, ara tenim informació distribuïda segons el principi “Espero que aquell a qui la vaig donar la protegeixi i no la perdin ni la rebin aquells a qui no estava destinada”. Com a exemple, és fàcil tenir en compte diversos serveis de correu, emmagatzematge al núvol, etc. I amb què acabem? Al hub Habré Seguretat de la informació està en primera línia i gairebé cada dia rebem notícies sobre una altra filtració global. En principi, totes les coses més interessants s'enumeren a <ironia> meravellós article L'estiu gairebé s'ha acabat. Gairebé no queden dades no filtrades. És a dir, els principals gegants d'Internet són cada cop més grans, acumulen cada cop més informació i aquestes filtracions són una mena d'explosions atòmiques d'informació. Això no havia passat mai abans, i aquí està de nou. Al mateix temps, encara que molts entenen que hi ha riscos, seguiran confiant les seves dades a empreses alienes. En primer lloc, no hi ha gaire alternativa, i en segon lloc, prometen que han arreglat tots els forats i això no tornarà a passar mai més.

Quina opció veig? Em sembla que les dades inicialment s'han de distribuir obertament. Però l'obertura en aquest cas no vol dir que tot hagi de ser fàcil de llegir. Parlo de l'obertura d'emmagatzematge i distribució, però no d'obertura total en la lectura. Suposo que la informació s'ha de distribuir amb claus públiques. Després de tot, el principi de les claus públiques/privades ja és antic, gairebé com Internet. Si la informació no és confidencial i està destinada a un cercle ampli, es disposa immediatament amb una clau pública (però encara en forma xifrada, qualsevol pot desxifrar-la amb la clau disponible). I si no, llavors es disposa sense clau pública, i la clau en si es transfereix al que hauria de tenir accés a aquesta informació. Al mateix temps, el que l'hauria de llegir només hauria de tenir una clau, i d'on obtenir aquesta informació, realment no hauria de volar-se; només la trau de la xarxa (aquest és el nou principi de distribució per contingut, no per adreça).

Per tant, per a un atac massiu, els atacants hauran d'obtenir un gran nombre de claus privades, i això és poc probable que es faci en un sol lloc. Aquesta tasca, tal com la veig, és més difícil que piratejar un servei concret.

I aquí es tanca un altre problema: la confirmació de l'autoria. Ara a Internet podeu trobar moltes cites escrites pels nostres amics. Però, on és la garantia que van ser ells qui les van escriure? Ara, si cada registre estigués acompanyat d'una signatura digital, seria molt més fàcil. I no importa on estigui aquesta informació, el més important és la signatura, que, per descomptat, és difícil de falsificar.

I aquí teniu el que és interessant: IPFS ja porta eines de xifratge (al cap i a la fi, està construït amb tecnologia blockchain). La clau privada s'especifica immediatament a la configuració.

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

No sóc un especialista en seguretat i no sé exactament com utilitzar-lo correctament, però em sembla que aquestes claus s'utilitzen a nivell d'intercanvi entre nodes IPFS. I també js-ipfs i projectes exemple com ara òrbita-dbsobre el qual treballa òrbita.xat. És a dir, teòricament, cada dispositiu (mòbil i no només) es pot equipar fàcilment amb les seves pròpies màquines de xifrat-desxifrat. En aquest cas, només queda que tothom s'ocupi de desar les seves claus privades, i cadascú serà responsable de la seva pròpia seguretat i no serà ostatge d'un altre factor humà en algun gegant d'Internet súper popular.

Només els usuaris registrats poden participar en l'enquesta. Inicia sessiósi us plau.

Has sentit parlar d'IPFS abans?

  • No he sentit mai parlar d'IPFS, però em sembla interessant

  • No he sentit i no en vull sentir

  • Escoltat però no interessat

  • He sentit, però no ho he entès, però ara sembla interessant

  • He estat utilitzant activament IPFS durant molt de temps.

Han votat 69 usuaris. 13 usuaris es van abstenir.

Font: www.habr.com

Afegeix comentari