Introducción a IPFS

Introducción a IPFS

Intro

En esta entrada presentamos el servicio IPFS. Como ya hemos comentado, la publicación de este blog se realizará de forma distribuida. Para ello usaremos los servicios que ofrece IPFS para desplegar este blog estático. Y para hcerlo más portable, lo montaremos todo en una raspberry pi que tengo para uso doméstico.

¿Qués es IPFS?

Utilizaré la definició de Wikipedia El Sistema de archivos interplanetarios (del inglésː InterPlanetary File System - IPFS) es un protocolo y una red diseñados para crear un método p2p (peer-to-peer) direccionable por contenido para almacenar y compartir hipermedia en un sistema de archivos distribuidos.1​ IPFS fue diseñado inicialmente por Juan Benet, y ahora es un proyecto de código abierto desarrollado con la ayuda de la comunidad.

En la página del proyecto encontramos la descripción de los diferentes servicios de los que se compone el framework de IPFS.

Beneficios… o porqué una web distribuida

Comenzaré un un esquema que se repite en muchos artículos de información sobre sistema distribuidos:

Esquema teórico

Centralizado

Los sistemas centralizados han ayudado a construir Internet, pero tienen importantes desventajas. Eso es lo que tratan de abordar los sistemas descentralizados y distribuidos.

El debate de sistemas centralizados vs descentralizados vs distribuidos es importante tanto para los usuarios como para los proveedores de servicios en red, ya sean públicos o privados. Afecta a casi todos los que utilizan la web.

Si bien todos estos sistemas pueden funcionar de manera eficaz, algunos son más estables y seguros que otros por diseño. Los sistemas pueden ser muy pequeños, interconectando solo unos pocos dispositivos y un puñado de usuarios. O pueden ser inmensos y abarcar países y continentes. De cualquier manera, enfrentan los mismos desafíos: tolerancia a fallas, costos de mantenimiento y escalabilidad.

Internet en sí es la red más grande del mundo. De hecho, es tan grande que reúne todos estos sistemas diferentes en un gran ecosistema digital.

En un sistema centralizado, todos los usuarios están conectados a un “servidor”. El servidor central almacena datos, a los que pueden acceder otros usuarios, y también información del usuario. Es el caso de servidor web centralizado.

La principal limitación de los servicios centralizados es que si el servidor falla, el sistema ya no funciona correctamente y los usuarios no pueden acceder a los datos. Debido a que un sistema centralizado necesita un servidor central para conectar a todos los demás usuarios y dispositivos, la disponibilidad de la red depende de este propietario. Agregamos aquí también los problemas de sguridad asociados a la centralización.

Simplificando mucho y sin matices podríamos decir:

Pros Contras
Despliegue sencillo Propenso a caidas
Desarrollo rápido Risesgos mayores de seguridad y privacidad de datos
Fácil mantenimiento Tiempos de acceso más prolongados a los datos para los usuarios que se encuentran lejos del servidor
Práctico cuando los datos deben controlarse de forma centralizada

Descentralizado

Como su nombre lo indica, los sistemas descentralizados no tienen un propietario central. En su lugar, utilizan varios propietarios centrales, cada uno de los cuales generalmente almacena una copia de los recursos a los que los usuarios pueden acceder.

Un sistema descentralizado puede ser tan vulnerable a las caídas como uno centralizado. Sin embargo, por diseño es más tolerante a errores. Esto se debe a que cuando uno o más propietarios centrales o servidores fallan, los demás pueden seguir proporcionando acceso a los datos a los usuarios.

Los recursos permanecen activos si al menos uno de los servidores continúa funcionando. Por lo general, esto significa que los propietarios del sistema pueden reparar los servidores defectuosos y solucionar cualquier otro problema mientras el sistema continúa funcionando como de costumbre.

Los errores del servidor en un sistema descentralizado pueden afectar el rendimiento y limitar el acceso a algunos datos. Pero en términos de tiempo de actividad general del sistema, este sistema ofrece una gran mejora con respecto a un sistema centralizado.

Otra ventaja de este diseño es que el tiempo de acceso a los datos suele ser más rápido. Eso se debe a que los propietarios pueden crear nodos en diferentes regiones o áreas donde la actividad de los usuarios es alta.

Sin embargo, los sistemas descentralizados siguen siendo propensos a los mismos riesgos de seguridad y privacidad para los usuarios que los sistemas centralizados. Y aunque su tolerancia a fallas es mayor, esto tiene un precio. Mantener un sistema descentralizado suele ser más caro.

Es lo que conocemos com servidores en cloud

Pros Contras
Menos probabilidades de fallar que un sistema centralizado Riesgos de seguridad y privacidad para los usuarios
Mejor presentación Mayores costos de mantenimiento
Permite un sistema más diverso y flexible Rendimiento inconsistente cuando no se optimiza adecuadamente

Sistema distribuido

Un sistema distribuido es similar a uno descentralizado en el sentido de que no tiene un único propietario central. Pero yendo un paso más allá, elimina la centralización. En un sistema distribuido, los usuarios tienen el mismo acceso a los datos, aunque los privilegios de usuario se pueden habilitar cuando sea necesario. El ejemplo básico serían las redes p2p o más actualmente, las redes blockchain.

El sistema distribuido permite a los usuarios compartir la propiedad de los datos. Los recursos de hardware y software también se asignan entre usuarios, lo que en algunos casos puede mejorar el rendimiento del sistema. Un sistema distribuido está a salvo de fallas independientes de componentes, lo que puede mejorar considerablemente su tiempo de actividad.

Los sistemas distribuidos han evolucionado como resultado de las limitaciones de los otros sistemas. Con preocupaciones crecientes de seguridad, almacenamiento de datos y privacidad, es necesario plantear los nuevos servicios digitales de una forma más democrática, abierta y colaborativa.

Para mi los beneficios son claros:

  • Resiliencia
  • Velocidad
  • Escalabilidad
  • Seguridad
  • Eficiencia

La web distribuida, hacia una nueva Internet

La web distribuida se contrapone al sistema centralizado predominante actualmente (servidor web centralizado).

La web distribuida busca hacer que la distribución de contenido peer-to-peer (P2P) sea el nuevo valor predeterminado. Esto debería ayudar a que la topología web sea más democrática y resistente a la naturaleza y los caprichos políticos.

Últimamente mes está interesando el concepto de la web distribuida, la tecnología Blockchain y el Sitema de archivos interplanetarios (IPFS) en particular. En la web distribuida, cada cliente es también un servidor que sirve copias de todo lo que el cliente ha descargado recientemente. Este concepto ya tiene unos años… y se presentó en sociedad con servicios como Napser o otros protocolos de transferencia de archivos P2P como BitTorrent.

La Web se ha centralizado cada vez más y las iniciativas como las páginas móviles aceleradas (AMP) de Google buscan directamente trasladar sitios web que antes eran independientes a los propios servidores de Google. La web distribuida busca ir en sentido contrario y hacer que cada cliente participe en la distribución de contenidos. También si se analiza la cuota de mercado de los proveedores de hosting, observaremos como la centralización de los servicios web hace que pocos proveedores controlen la publicación de contenidos (10 proveedores controlan casi el 40% de los servicios web).

Como funciona IPFS

En otro artículo entraremos más a fondo con IPFS, pero aquí comentaremos un poco las características del servicio.

El contenido de IPFS es accesible mediante hashes criptográficos del propio contenido. Consulta la tabla de hash distribuida (DHT) en la red de nodos de IPFS para descubrir quién más afirma tener el archivo que desea, conectarse a ellos y solicitar el archivo. A su llegada, su cliente IPFS puede volver a calcular el hash criptográfico del archivo y así confirmar que envió el archivo correcto. Esto asegura la integridad de los archivos a los que accede y evita que los atacantes atacantes en el medio (MITM) modifiquen las páginas a las que desea acceder.

No existe una base de datos central que mantenga un encendido de cada archivo o hash de archivo disponible en la red. Cada cliente puede alojar una pequeña parte del DHT y compartir conocimientos sobre cómo conectarse a otros clientes que pueden tener hashes específicos.

La web distribuida se trata tanto de democratizar la distribución de contenido como de reestructurar la web para que sea más resistente. IPFS puede evitar interrupciones en el servicio, desastres naturales, cables submarinos mordidos por tiburones, ataques de inundación de paquetes contra los principales proveedores de servicios web, conflictos humanos, intereses comerciales, así como políticas gubernamentales y censura.

Siempre se puede obtener un archivo asumiendo que cualquier otra persona a la que puedas conectarte tenga el mismo archivo que nosotros. IPFS puede funcionar a través de enlaces directos de dispositivo a dispositivo y redes mesh, así como a través de Internet en general.

La web parece dirigirse a las manos de unas cuantas empresas multinacionales gigantes. Prefiero apostar por ver que la web va en la dirección opuesta y librarse de estos intereses controladores.

Y el caso de los servicios públicos de información. Por concepto, las administraciones públicas son organizaciones centralizadoras. En las correientes de Gobierno Abierto, se habla de la administración debe ser abierta, transparente y colaborativa con sus usuarios / administrados. ¿Qué sería más transparente, abierto y colaborativo que proporcionar los servicios públicos de forma distribuida ?

Instalando IPFS

Describimos en este apartado el proceso de instalación, del Sistema de ficheros Interplanetario

Instalación en Raspberry Pi

Buscamos la version estable, en plataforma ARM, última versión disponible

$ cd /tmp     # trabajamos en una carpeta temporal
$ wget https://dist.ipfs.io/go-ipfs/v0.7.0/go-ipfs_v0.7.0_linux-arm.tar.gz   # descargamos paquete
$ tar -zxvf go-ipfs_v0.7.0_linux-arm.tar.gz   #extraemos
$ cd go-ipfs
$ ./install.sh
	Moved ./ipfs to /usr/local/bin   # el script mueve el binario a la carpeta local/bin
# ipfs version       #verificamos versión
   ipfs version 0.7.0

Como podemos realizar, el setup inicial es muy sencillo. Ahora verificamos que el nodo funciona correctamente y fectuamos las primera pruebas


$ ipfs init
 ipfs init
generating ED25519 keypair...done
peer identity: 12D3KooWFrV1sAHXHnncisWgyrAZapNksYznhDQc4XBJ7Kv5p3pW
initializing IPFS node at /home/pi/.ipfs
to get started, enter:

        ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme


$ ipfs cat /ipfs/QmQPeNsJPyVWPFDVHb77w8G42Fvo15z4bG2X8D2GhfbSXc/readme     #realizamos la prueba
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

Una vez lo tenemos inicializado, pasamos a instalarlo como daemon de sistema.

$ sudo vi /lib/systemd/system/ipfs-daemon.service   #creamos script del servicio
$ cat /lib/systemd/system/ipfs-daemon.service   # mostramos ejemplo script de servicio. La inicialización del nodo la hemos hecho con el usuario pi
[Unit]
Description=IPFS daemon
Wants=network.target
After=network.target

[Service]
User=pi
Group=pi
Type=simple
Environment=IPFS_PATH=/home/pi/.ipfs/
ExecStart=/usr/local/bin/ipfs daemon --migrate
ExecStop=/usr/bin/pkill -f ipfs
Restart=on-failure
RestartSec=10s

[Install]
WantedBy=multi-user.target

$ service ipfs start
$ systemctl status ipfs-daemon.service   # verificamos ejecución
service ipfs-daemon start
Loaded: loaded (/lib/systemd/system/ipfs-daemon.service; disabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-01-17 22:21:59 CET; 1min 44s ago
 Main PID: 13883 (ipfs)
    Tasks: 17 (limit: 4915)
   Memory: 44.1M
      CPU: 29.954s
   CGroup: /system.slice/ipfs-daemon.service
           └─13883 /usr/local/bin/ipfs daemon --migrate

ipfs[13883]: Swarm listening on /ip4/192.168.171.6/udp/4001/quic
ipfs[13883]: Swarm listening on /p2p-circuit
ipfs[13883]: Swarm announcing /ip4/127.0.0.1/tcp/4001
ipfs[13883]: Swarm announcing /ip4/127.0.0.1/udp/4001/quic
ipfs[13883]: Swarm announcing /ip4/A.B.C.D/tcp/4001   #A.B.C.D --> IP de la máquina
ipfs[13883]: Swarm announcing /ip4/A.B.C.D/udp/4001/quic
ipfs[13883]: API server listening on /ip4/127.0.0.1/tcp/5001
ipfs[13883]: WebUI: http://127.0.0.1:5001/webui
ipfs[13883]: Gateway (readonly) server listening on /ip4/127.0.0.1/tcp/8080
ipfs[13883]: Daemon is ready

A partir de aquí, podemos ejecutar los comandos de gestión de IPFS o trabajar a través de la interficie web que el propio cliente de IPFS trae por defecto: http://127.0.0.1:5001/webui

Nota Como en nuestra raspberry no tenemos acceso al terminal gráfico, accederemos a la WebUI a través de otro equipo de red. Para una funcionalidad completa de la interficie web de gestión. Para ello:

$ vi ./ipfs/config
En la entrada Adresses, modificamos la entrada API, para añadir la IP de la máquina


 "Addresses": {
    "Swarm": [
      "/ip4/0.0.0.0/tcp/4001",
      "/ip6/::/tcp/4001",
      "/ip4/0.0.0.0/udp/4001/quic",
      "/ip6/::/udp/4001/quic"
    ],
    "Announce": [],
    "NoAnnounce": [],
    "API": "/ip4/A.B.C.Dtcp/5001",
    "Gateway": "/ip4/0.0.0.0/tcp/8080"
  },

En la entrada API, permitimos bind en las IPs que espcifiquemos, para método tanto PUT i POST

 "API": {
    "HTTPHeaders": {
        "Access-Control-Allow-Origin":["http://A.B.C.D:5001","http://localhost:3000","http://127.0.0.1:5001","https://webui.ipfs.io"],
        "Access-Control-Allow-Methods":["PUT","POST"]
        }
  },

Siguientes Pasos

  • Desplegar blog en IPFS
  • Probar accesos y probar servicio IPNS y DNS distribuida
  • PIN de contenido y clusterizar nodo

Todo ello, en el siguiente post.