Skip to content

Instantly share code, notes, and snippets.

@mariano-aguero
Last active November 3, 2023 10:22
Show Gist options
  • Save mariano-aguero/d223c2f9fbdeef0f2243ad027812b3d3 to your computer and use it in GitHub Desktop.
Save mariano-aguero/d223c2f9fbdeef0f2243ad027812b3d3 to your computer and use it in GitHub Desktop.
IPFS/ENS/IPNS

IPFS

Trabajando en un proyecto de Gnosis, nos surgio a partir de un requerimiento la necesidad de alojar y servir nuestra aplicacion de una forma totalmente descentralizada.

Usando IPFS(interplanetary file system) y ENS(ethereum name service) pudimos resolver este problema.

Para recordar un poco la definicion de IPFS es un sistema de archivos distribuidos punto a punto que busca conectar todos los dispositivos informáticos con el mismo sistema de archivos , por lo cual los archivos de la aplicacion van a estar descentralizados, alojados en diferentes nodos que pueden estar siendo ejecutados en cualquier lugar del mundo.

Asi como HTTP busca los recursos basandose en la URL, IPFS usa hashes para buscar recursos en su red, por ejemplo un hash es QmbgxQP34EtizTFQ7hEZKCvysQjgpei1hM5w4d2QnrVRQj, y podemos acceder al mismo a traves de un gateway como Pinata https://gateway.pinata.cloud/ipfs/QmbgxQP34EtizTFQ7hEZKCvysQjgpei1hM5w4d2QnrVRQj , u otro gateway como IPFS.io https://ipfs.io/ipfs/QmbgxQP34EtizTFQ7hEZKCvysQjgpei1hM5w4d2QnrVRQj/ , o cualquier otro servicio de gateway para IPFS.

Para hostear una aplicacion en un IPFS necesitamos dos cosas:

  • Un nodo que tenga la aplicacion pinned en el IPFS y este disponible para el resto de la red
  • Un gateway para que podamos acceder a la aplicacion.

Como podemos resolver esto? aca aparecen dos opciones, una tener nuestro propio IPFS, the hard way (ver tutorial para Digital Ocean, ) , y otra opcion es utilizar algun servicio ya existente asi nos ahorramos el tiempo de instalacion, soporte del servicio, etc. Por supuesto que optamos por la segunda.

Optamos por utilizar pinata, es realmente muy facil, y nos da 1 Giga gratis para utilizar. Nos registramos y creamos una cuenta. Vamos a obtener un API_KEY y un SECRET_API_KEY que tenemos que utilizar despues.

En esta imagen podemos ver algunos pinned hash de nuestra aplicacion en Pinata, y ademas el acceso al account donde podemos obtener las keys. IMAGE

Como trabajamos con React, lo que vamos a hacer es subir nuestra carpeta build al IPFS. Hacerlo de forma manual es engorroso, asi que automatizamos esto usando IPFS-DEPLOY.

Lo instalamos y creamos dos variables de entorno en nuestro archivo .env, IPFS_DEPLOY_PINATA__API_KEY y IPFS_DEPLOY_PINATA__SECRET_API_KEY, utilizando los valores que obtuvimos al registrarnos en Pinata.

Posteriormente agregamos un script en nuestro package.json para poder ejecutar el deploy a pinata, un ejemplo podria ser ipfs-deploy build --pinner pinata --no-open , donde especificamos el pinner service y el path.

Listo! Con esto ya estamos listos para poder realizar un deploy de nuestra app a un IPFS como pinata. Ejecutamos el script y el mismo nos va a informar del hash generado para nuestra aplicacion. Como es bastante dificil acordarse del hash, entonces lo que necesitamos es un nombre de dominio asi podemos acordarnos mas facil.

Glosario:
  • CID(Content identifier): es un string usado para apuntar a un contenido en un IPFS. No especifica donde esta guardado, pero si se genera basandose en el contenido. Si el contenido difiere va a producir un CID diferente.
  • Pinned: hacer Pinning de un CID le dice a un servidor IPFS que esos datos son importantes y no deben ser descartados. Debe ser contenido que uno considere importante, para que se mantenga a largo plazo.

ENS DOMAIN NAME

Segun la pagina de ENS, la misma ofrece el siguiente servicio, ENS offers a secure & decentralised way to address resources both on and off the blockchain using simple, human-readable names..

  • ENS es una forma de tener ciertos dominios asociados a algo. El caso más fácil de entender es asociar un dominio a una cuenta nuestra. Por ejemplo, yo registré aguero.eth. Si alguien me quiere mandar ETH, puede poner eso en Metamask, que lo resuelve a una dirección mía. Funciona como un alias.
  • Tambien podemos asociar un nombre de dominio a un hash IPFS. Por ejemplo, si tenemos el nombre de dominio test.eth y nuestro navegador posee metamask instalado (tiene un ENS Resolver), va al contrato de ENS, obtiene el hash de IPFS, y te redirige a un gateway con ese hash, entonces podés ver el contenido.

El truco esta en poner una barra al final para que pueda resolver el nombre de dominio, ejemplo test.eth/ para que metamask lo resuelva de forma correcta.

Pasos para comprar un nombre de dominio y asociarlo a nuestro IPFS:

  • Comprar un ENS Domain en https://app.ens.domains/ , consta de 3 pasos, hay que completarlos a todos, y los nombres de dominio comprados son por network (Rinkeby, Mainnet, etc)
  • Una vez registrado, hay que setear la opcion content y agregamos el hash IPFS de nuestra aplicacion.
  • Una vez que la transacion fue verificada ya podemos acceder al sitio que compramos.

En esta imagen podes visualizar el dominio ya creado y el content seteado. IMAGE

Para configurar una cuenta recomiendo este video tutorial

IPNS

El problema: si una aplicacion utiliza una imagen con una referencia que incluye un hash, la referencia debera actualizarse cada vez que se actualize la imagen. Sino la aplicacion va a hacer referencia a una version anterior de la imagen.

La solucion: IPFS utiliza IPNS, que proporciona el mapeo desde un URI legible a su hash IPFS actual correspondiente. El propietario de un nombre de dominio puede actualizar las asignaciones de todos los URI bajo ese dominio firmando transacciones.

Podemos decir que IPNS es un espacio de nombres global dirigido mediante el uso de hashes de clave pública, lo que permite a los usuarios crear un enlace inmutable para cambiar el contenido. Esto es muy util para tratar con contenido dinamico almacenado en IPFS.

IPNS se puede implementar de muchas maneras, pero su implementación actual utiliza una Tabla de hash distribuida. Como consecuencia, solo el mapeo mas reciente de cada URI a su hash correspondiente está disponible para resolucion, olvidando cualquier mapeo histórico. Esto es una contra, ya que las versiones anteriores de un archivo aún pueden existir en el almacen de IPFS y se pierden sus asignaciones de URI correspondientes

No todos los servicios soportan IPNS, Pinata no lo soporta(esta en su roadmap), y Temporal lo agrego hace poco.

Temporal dispone de un playground para generar registros.

Con Temporal podemos crear un registro de la siguiente forma:

  • Ingresamos a https://temporal.cloud/ipns
  • Hay que agregar el hash IPFS al que se desea hacer referencia en este registro IPNS. Este hash puede ser cualquier hash que este en la red IPFS.
  • Ingresamos el resto de los valores. Lifetime indica el tiempo maximo durante el cual un registro específico sera valido. TTL indica el tiempo minimo durante el cual un registro específico será valido.
  • Elegimos una clave publica de la lista. Si no existen, hay que crear una antes en la seccion correspondiente de Temporal.
  • Resolve en true

Aca tenemos una imagen de como crear un registro IPNS. IMAGE

Una vez obtenido el registro se puede acceder al mismo via https://ipfs.io/ipns/<PeerId>

Para mas informacion estan muy interesantes estos blog1 y blog2

@mariano-aguero
Copy link
Author

mariano-aguero commented Jun 22, 2020

Para que funcione en una aplicacion REACT es necesario hacer lo siguiente:

In the root directory of your React application, open up the package.json file and add the following entry to the top of the file:

"homepage": "./"

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment