Esta esta segunda entrada del blog sobre el proyecto IberBlockTrac, tecnología blockchain aplicada a la trazabilidad de productos ibéricos comenzaremos a hablar sobre la parte técnica del proyecto. Más concretamente, detallaremos la configuración del entorno de trabajo para el desarrollo de aplicaciones de blockchain.
Recordemos que el objetivo final de este proyecto es diseñar y desarrollar un sistema informático que posibilite la trazabilidad de productos ibéricos mediante tecnología blockchain, permitiendo garantizar el origen, prevenir fraudes (etiquetado inadecuado), aumentar la confianza en el producto y, en último termino, fidelizar al consumidor. En definitiva, agregar valor al producto final.
Las DApps (Decentralised Applications o Aplicaciones Descentralizadas) son aplicaciones que utilizan la cadena de bloques (blockchain) para que los usuarios se relacionen directamente entre ellos y cierren acuerdos, sin que exista una entidad central que gestione el servicio. Es decir, no existe un único agente que tenga todo el control de la información, si no que esta compartida y distribuida entre todos los nodos que conforman la cadena de bloques.
Una Dapp combina:
- Backend: Formado por uno o varios contratos inteligentes (smart contracts) que pueden interaccionar entre si. Estos contratos inteligentes contienen la lógica de la aplicación y gestionan la interacción con la cadena de bloques.
- Frontend: Es la interfaz de usuario que permite a los usuarios interactuar con el contrato inteligente y, en última instancia, con la cadena de bloques. Principalmente, los usuarios podrán enviar transacciones y ver información.
En la Figura 1 podemos observar un ejemplo del ecosistema completo del proyecto.
Como podemos observar, desarrollar una DApp conlleva conocer y emplear un gran número de herramientas. Tras analizar varias alternativas, decidimos construir nuestra DApp sobre la blockchain de Ethereum.
La blockchain de Ethereum
La red de Ethereum ha sido una opción popular para muchos desarrolladores a lo largo de los años. Las principales ventajas que nos hicieron decantarnos por esta fueron:
- Madurez y Experiencia: Ethereum fue la primera blockchain en introducir el concepto de smart contracts y Esto la convierte en una de las cadenas de bloques más maduras y experimentadas, proporcionando una gran comunidad y documentación abundante.
- Amplia implantación de estándares: Ethereum ha establecido estándares ampliamente utilizados, como ERC-20 (tokens fungibles o criptomonedas) o ERC-721 (tokens no fungibles o NFT). Esto nos proporciona mayor flexibilidad en el desarrollo.
- Contratos inteligentes: permite la programación de contratos inteligentes, esencial para el desarrollo de nuestra aplicación descentralizada.
- Planes de Mejora y Escalabilidad: Implementa planes de mejora continua en la red, solucionando problemas de escalabilidad y mejorando la eficiencia de la red.
No obstante, probar nuestros desarrollos en la red principal de Ethereum (también conocida como Mainnet) es inviable, debido a los altos costes del gas (precio por transacción llevada a cabo en la cadena de bloques). Por ello, Ethereum proporciona un conjunto de redes de prueba (conocidas como Testnet) que permiten testear las funcionalidades de nuestro contrato sin coste de gas.
Dentro de las diferentes redes de prueba, nos hemos decantado por Sepolia. Sepolia es una de las redes de prueba más prominentes de Ethereum y fue introducida inicialmente en octubre de 2021. Además, Sepolia es una de las dos redes primarias junto con Goerli que no han sido deprecadas. Esto significa que Sepolia es mantenida actualmente por desarrolladores, asegurando que es un entorno de prueba seguro y preciso. Véase la figura 2.
Como comunicarse con una DApp
La mayoría de DApps son desarrolladas para la web, de modo que cualquier usuario pueda acceder mediante su navegador web. Sin embargo, la descentralización de este tipo de soluciones hace necesario, para los usuarios, utilizar una cartera (wallet).
En el contexto de la cadena de bloques, una cartera es un programa, un dispositivo físico o servicio en línea que permite a los usuarios almacenar y gestionar sus activos digitales (también conocidos como tokens). Actualmente, tenemos varios estándares de tokens, cada uno con sus funcionalidades y aplicaciones. Los más conocidos son los ERC-20, popularmente denominados criptomonedas. Toda cartera cuenta con una dirección (address) que permitirá identificarnos en el sistema.
La cartera no almacena realmente estos activos, sino que guarda las claves privadas necesarias para acceder y gestionar los tokens en la cadena de bloques. Las claves privadas son esenciales para demostrar que eres el propietario. Al utilizar una cartera, mantienes el control total sobre estas claves, lo que mejora la seguridad en comparación con dejarlas en una plataforma centralizada.
Existen dos enfoques diferentes en cuanto a la conexión de una wallet con la red:
- Carteras calientes (sería como el dinero que llevamos en la cartera de bolsillo): están conectadas a internet y es accesible en linea. Son convenientes para transacciones frecuentes y de acceso rápido. Tienen un mayor riesgo de seguridad debido a su conexión constante a la red.
- Carteras frías (sería como el dinero que tenemos en el banco): No esta conectada a internet la mayor parte del tiempo. Suelen utilizarse para almacenar a largo plazo grandes cantidades de activos y se conectan a la red para transferir activos a las carteras Proporcionan un nivel de seguridad adicional.
En nuestro caso, hemos utilizado Metamask (https://metamask.io/). Metamask es una cartera software caliente. Es una extensión del navegador que permite gestionar los activos digitales basados en la cadena de bloques de Ethereum e interactuar con Dapps directamente desde el navegador.
La principal característica que nos hizo inclinarnos por Metamask fue su diseño amigable y su fácil instalación. Usar Metamask es tan sencillo como descargarse la extensión, darse de alta y conectarse a la red donde vayamos a trabajar (ver Figura 3).
El desarrollo de contratos inteligentes
Toda la lógica de nuestra aplicación será desarrollada mediante contratos inteligentes que serán desplegados en la cadena de bloques de Ethereum, de modo que desde el frontend podamos interaccionar con ellos y, en último termino, realizar transacciones contra la cadena de bloques.
Los contratos inteligentes nos ofrecen numerosas ventajas. Desde el punto de vista de la automatización, el contrato se encarga de auto gestionar las transacciones de modo que no necesitemos intermediarios. Además, el código de los contratos desplegados en la cadena de bloques es público, de modo que podemos ver qué hace el contrato y así asegurarnos de que no es un contrato malicioso.
Por otro lado, el código, al desplegarse en la cadena de bloques, es inmutable, no puede ser alterado lo que repercute en una mayor seguridad. Sin embargo, esta inmutabilidad también implica que cualquier error en el contrato no puede ser corregido salvo que se despliegue un nuevo contrato. Debemos, por tanto, ser cautelosos a la hora de desarrollar contratos inteligentes. Los errores o vulnerabilidades en el código pueden tener graves consecuencias, por ejemplo, que los cripto-delincuentes nos roben nuestros activos digitales.
Características de los contratos inteligentes
Los contratos inteligentes se escriben en un lenguaje de alto nivel. En nuestro caso, utilizaremos Solidity (https://soliditylang.org/).
Solidity es un lenguaje de programación específicamente diseñado para desarrollar contratos inteligentes (vermación que soporta la cadena de bloques de Ethereum. Su sintaxis es similar a JavaScript y C++, lo cual, suaviza la curva de aprendizaje, y sigue el paradigma de programación orientado a objetos (POO). Todo esto convierte a Solidity en una opción estándar y popular para el desarrollo de contratos inteligentes..
Los usuarios pueden interaccionar con el contrato mediante las aplicaciones descentralizadas que actúan como interfaz. Cada contrato tiene definida una serie de funciones dentro de él. Estás funciones son invocadas por los usuarios repercutiendo en transacciones en la cadena de bloques. Al dispararse las funciones, los contratos pueden emitir eventos que quedan almacenados como un log en la blockchain y, al mismo tiempo, facilitan la comunicación entre el contrato y las aplicaciones, permitiendo a estas últimas escuchar y reaccionar a eventos específicos.
Principales herramientas y aplicaciones
Desarrollar un contrato inteligente no es un proceso trivial. Requiere de la instalación y configuración de numerosas herramientas, como hemos podido observar en la Figura 1. A continuación, hacemos una breve introducción de las herramientas seleccionadas:
- js: es un entorno de ejecución de JavaScript del lado del servidor que se utiliza comúnmente para desarrollar aplicaciones web. También se utiliza en el desarrollo del backend de las aplicaciones de blockchain, incluidos contratos inteligentes.
- Hardhat: es un framework para el desarrollo de contratos en Ethereum. Proporciona herramientas y funcionalidades que facilitan la creación, compilación, prueba y despliegue de contratos inteligentes.
- Compilación: Utiliza Node.js para gestionar el proceso de compilación de los contratos escritos en Solidity. La compilación convierte el código fuente en bytecode ejecutable por la Ethereum Virtual Machine (EVM).
- Pruebas: Facilita la escritura y ejecución de pruebas automatizadas utilizando bibliotecas populares de testing de Node.js como Mocha y Chai. Este framework simula, en local, una blockchain de prueba para testear las funcionalidades de nuestro contrato.
- Despliegue y Gestión: Hardhat utiliza Node.js para desplegar y gestionar contratos en la red Ethereum, ya sea en entornos locales de desarrollo, redes de prueba o en la red principal.
- js: es una alternativa a Web3.js, otra biblioteca popular para interactuar con Ethereum en JavaScript. ethers.js ha ganado popularidad por su diseño modular, su simplicidad y su rendimiento. Nos permite gestionar las carteras, interaccionar con los contratos inteligentes, crear transacciones y firmas, etc.. Esta librería la utilizaremos tanto en el frontend, para interaccionar con el contrato inteligente y llevar acabo la lógica de negocio, como en el backend, para testear las funcionalidades del contrato desarrollado antes de desplegarlo en la blockchain.
- js: es un framework de desarrollo web de código abierto basado en React.js. proporciona una capa adicional de abstracción sobre React.js y ofrece características adicionales para facilitar la construcción de aplicaciones web modernas y eficientes. Sera la principal herramienta para la elaboración del frontend de nuestra aplicación.
Este es el ecosistema de aplicaciones que utilizaremos en el proyecto. En próximas entradas describiremos con más detalle su utilización e integración para lograr el objetivo principal del proyecto.
Agradecemos a la Cátedra Telefónica de la Universidad de Extremadura por el soporte brindado.
- Consulta también las demás publicaciones sobre este proyecto:
- Proyecto IberBlockTrack: El futuro de la trazabilidad de los productos ibéricos pasa por la blockchain [1/4]
- Proyecto IberBlockTrack: estructura blockchain de las materias primas, los productos ibéricos y los operadores [3/4]
- Proyecto IberBlockTrack: Proyecto IberBlockTrack: interacción y experiencia del usuario final[4/4]