Olive Oil Trust

Olive Oil Trust

Tabla de contenidos

Introducción

Olive Oil Trust es un sistema de trazabilidad para el aceite de oliva implementado en Ethereum que permite a sus miembros rastrear y comerciar con una representación de sus propios productos en forma de token ERC-1155, y a los clientes finales rastrear y comprar esos tokens.

De esta manera, puede considerarse como una red de colaboración de olivareros, almazaras, fabricantes de botellas, plantas embotelladoras, distribuidores, minoristas y certificadores.

Los miembros de Olive Oil Trust acuerdan de manera implícita seguir las mismas reglas, es decir, cumplir con los mismos contratos inteligentes para comerciar con sus tokens o para certificar los tipos de los tokens.

Cada vez que se acuña un token, se puede depositar en un escrow, que es el mecanismo que otro actor de la cadena puede utilizar para adquirir la propiedad de este token tras el pago correspondiente al escrow y la aprobación del vendedor.

La idea detrás de este proyecto es utilizar la cadena de bloques de Ethereum como un medio para dar confianza a sus miembros y clientes de que las acciones realizadas en la cadena de suministro están, y siempre permanecerán, almacenadas e inalteradas.

Esto se debe a las características de inmutabilidad de esta tecnología, lo que hace que el uso de este sistema sea una excelente manera de rastrear un producto hasta su origen con total confianza.

Detalles técnicos

Los contratos están escritos en Solidity utilizando Hardhat, un entorno de desarrollo de Ethereum. Todos los contratos son actualizables y la mayoría son compatibles con el patrón de proxy UUPS.

Por su parte, el código de front end está principalmente escrito en TypeScript utilizando Next.js, un framework de React.js.

Se implementa en base a una arquitectura hexagonal en la que el estado global existe fuera del núcleo y persiste globalmente utilizando Redux.

Finalmente, los datos se consultan en un nodo de TheGraph utilizando GraphQL. El subgrafo que se utiliza está configurado para admitir múltiples redes, los datos del despliegue relevantes se compartirán para este propósito.

Perspectiva general

  • hardhat-env/contracts/*: contratos inteligentes escritos en lenguaje Solidity.
  • hardhat-env/scripts/*: scripts en TypeScript para desplegar contratos y escribir información relevante sobre ellos en los workspaces de front end y subgraph.
  • hardhat-env/tasks/setState: tarea de Hardhat para establecer un estado en el nodo local.
  • hardhat-env/test/*: tests unitarios de los contratos con Mocha y Chai que utilizan un plugin de Hardhat para la integración con Waffle y Ethers.js.
  • next-app/src/app/*: estado de app, mixins de PostCSS y un archivo css global, componentes de la interfaz de usuario y constantes.
  • next-app/src/features/*: Secciones explore y management de la página web. Cada feature con su núcleo, estilos, componentes y código de la interfaz de usuario. Las fuentes de datos, así como los repositorios y las entidades, están en una carpeta compartida en el mismo nivel de carpetas.
  • next-app/src/pages/*: páginas estáticas.
  • next-app/src/**/shared/*: código de interfaz de usuario y constantes compartidas entre archivos del mismo nivel de carpeta.
  • next-app/src/**/styles/*: archivos CSSModules.
  • services/*: nodo de TheGraph.
  • subgraph/scripts/*: script para generar un manifiesto del subgrafo a partir de una plantilla, reemplazando claves por valores de un archivo JSON.
  • subgraph/src/*: mappings, escritos en AssemblyScript, constantes y entidades utilizadas para extraer datos de la cadena Hardhat local, procesarlos y almacenarlos.
  • subgraph/templates/*: una plantilla del manifiesto del subgrafo.

Ejecución local

En primer lugar, se debe configurar un nodo TheGraph en services/graph-node.

Visite el repo del nodo de TheGraph para obtener más información sobre el nodo TheGraph.

El script npm para ejecutar este servicio actualmente ejecute la imagen de Docker del nodo, pero esto puede cambiarse según sus preferencias.

$ git clone https://github.com/albertobas/olive-oil-trust.git
$ cd olive-oil-trust
$ npm i

Ahora, ejecute el nodo de Hardhat:

$ npm run hardhat:node

Luego, abra dos pestañas o ventanas de terminal separadas y en una de ellas ejecute el siguiente comando para iniciar el nodo de TheGraph:

$ npm run services:start

Esto iniciará PostgreSQL, IPFS y el nodo TheGraph en Docker. Vea la página de GitHub de la imagen de Docker del nodo de TheGraph para más información.

Una vez que esté en funcionamiento, en la pestaña o ventana de la terminal que queda libre, ejecute el siguiente comando:

$ npm run start

Esto compilará los contratos, los desplegará en la cadena Hardhat local, pegará la información requerida en workspaces del subgrafo y del front end, generará el manifiesto del subgrafo y finalmente creará el subgrafo y lo desplegará, es decir, cargará el subgrafo, lo compilará, lo construirá y lo subirá a IPFS.

Este comando ejecutará múltiples comandos de manera secuencial para realizar las siguientes tareas:

  • compilar los contratos.
  • desplegarlos en la cadena Hardhat local.
  • crear archivos con la información requerida en los workspaces del subgrafo y del front end.
  • generar el manifiesto del subgrafo.
  • crear el subgrafo y desplegarlo, es decir, cargar el subgrafo, compilarlo, construirlo y subirlo a IPFS.
  • crear un artefacto graphclient en tiempo de ejecución para poder ejecutar consultas al subgrafo.

Cuando todo esto esté listo, simplemente ejecute el siguiente comando para iniciar el servidor de desarrollo de Next.js:

$ npm run next-app:dev

Entonces, visite http://localhost:3000 para ver su aplicación.

Para simular el flujo de trabajo en una cadena de suministro de aceite de oliva, la versión actual de Olive Oil Trust despliega varios contratos para miembros figurativos en esta cadena de suministro.

Se pueden utilizar direcciones de firmantes de la cadena local Hardhat para configurar múltiples billeteras en Metamask para cada uno de estos miembros, así como para un cliente final figurativo, y firmar así transacciones en la cadena localhost.

Podemos ver en hardhat-env/shared/constants.ts que dictAccounts recoge índices para los firmantes en esta simulación. Esos son los índices de las direcciones correspondientes en la lista de direcciones de la cadena local Hardhat.

Luego, a cada miembro figurativo, así como a un cliente final, de esta simulación en Olive Oil Trust se le asigna una dirección de billetera con Ether falso en la cadena local Harhdat, solamente con fines de desarrollo.

Ejecutando npm run hardhat:setState, o npm run start:setState arriba en lugar de npm run start, establecerá un estado a la cadena local para representar la acuñación de tokens y su comercialización desde un imaginativo olivarero hasta un figurativo cliente final.

Entradas relacionadas

He escrito las siguientes entradas para explicar en detalle este proyecto:

Notas

Este proyecto se publica bajo licencia GNU General Public v3.0.


Proyectos relacionados

albertobas.com

albertobas.com

Esta es mi página web personal, donde publico artículos y proyectos.

Ver más
Bank Microservices

Bank Microservices

Bank Microservices es mi propuesta de una aplicación, con arquitectura basada en microservicios y utilizando el stack MERN.

Ver más
zk Connect Four

zk Connect Four

zk Connect Four es una aplicación descentralizada de conocimiento cero que le permite jugar al juego de Conecta Cuatro contra una política de juego entrenada por un agente DQN, o contra otro usuario.

Ver más

¿Preparado para #buidl?

¿Está buscando colaboración en algún proyecto de Web3 o a un desarrollador para que se una a su equipo?. Entonces, no dude en contactarme por e-mail o en mi perfil de LinkedIn. También me puede encontrar en GitHub.