Blockchain práctico - Joaquim de Dalmases - E-Book

Blockchain práctico E-Book

Joaquim de Dalmases

0,0
18,99 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.

Mehr erfahren.
Beschreibung

Descubra cómo programar en blockchain y desarrolle sus propias DApps con ejemplos prácticos y soluciones reales Si quiere programar con la tecnología blockchain, necesita conocer diversos conceptos esenciales: construir una identidad digital, gestionar transacciones firmadas desde su wallet o billetera digital y desarrollar contratos inteligentes que interactúen con redes descentralizadas. En este libro interiorizará todo esto de manera práctica y accesible, explorando casos reales que le llevarán de la teoría a la acción. A través de esta guía clara y detallada, sabrá elegir la red blockchain más adecuada para sus necesidades, implementará contratos inteligentes con interfaces y librerías modernas (como Remix, web3.js) y creará sus primeras aplicaciones distribuidas (DApps), que representarán de forma segura el valor de sus activos, desde datos y propiedades intelectuales hasta conceptos abstractos como la reputación. Con Blockchain práctico, aprenderá a gobernar su identidad digital y a gestionar activos económicos sin depender de intermediarios como bancos o instituciones gubernamentales. Además, esta obra le ofrece un enfoque integral con tres proyectos reales que abarcan dos tipos de redes blockchain, la pública y la permisionada, donde: -Identificará un problema del mundo real e ideará una solución DApp. -Definirá y programará una DApp compatible con la blockchain pública de Ethereum. -Creará una DApp en blockchain permisionada con Hyperledger Fabric. -Diseñará y planificará un proyecto blockchain sostenible desde su concepción hasta su implementación. La Unión Europea apuesta fuerte por la revolución digital que supone la tecnología del blockchain, impulsando estándares, marcos regulatorios y desarrollos prácticos mediante la propuesta de una infraestructura blockchain como la European Blockchain Services Infrastructure (EBSI). Blockchain es la tecnología del presente y del futuro. Adelántese y aprenda con Blockchain práctico las ventajas competitivas que le ofrece esta tecnología como desarrollador. Hará realidad sus ideas en una de las áreas más disruptivas de la actualidad. Aprenda, innove y transforme su creatividad en proyectos con impacto global.

Sie lesen das E-Book in den Legimi-Apps auf:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 230

Veröffentlichungsjahr: 2025

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



 

 

Blockchain práctico

© 2025 Joaquim de Dalmases

Primera edición, 2025

© 2025 MARCOMBO, S. L. www.marcombo.com

Gran Via de les Corts Catalanes 594, 08007 Barcelona

Contacto: [email protected]

Ilustración de cubierta; Jotaká

Maquetación: Reverté-Aguilar, S.L.

Corrección: Anna Alberola

Directora de producción: M.a Rosa Castillo

Cualquier forma de reproducción, distribución, comunicación pública o transformación de esta obra solo puede ser realizada con la autorización de sus titulares, salvo excepción prevista por la ley. Diríjase a CEDRO (Centro Español de Derechos Reprográficos, www.cedro.org) si necesita fotocopiar o escanear algún fragmento de esta obra

ISBN del libro en papel: 978-84-267-3981-0

ISBN del libro electrónico: 978-84-267-3996-4

Producción del ePub: booqlab

CONTENIDO

Prefacio

CAPÍTULO 1Proyecto Esbrinachain y publicación en Github

CAPÍTULO 2Propuesta de proyecto

CAPÍTULO 3Estructura de proyecto

3.1. Smarts contracts

3.1.1. Test unitarios

3.2. Angular Framework

3.2.1. Estructura del proyecto

3.2.2. Descripción de los componentes

3.2.2.1. Componente get-preg

3.2.2.2. Componente get-resp

3.2.2.3. Componente pregunta

3.2.2.4. Componente respuesta

3.2.2.5. Componente prestigio

3.2.2.6. Componentes registrar y wallet-in

3.2.2.7. Componente app

3.2.3. Particularidades en la funcionalidad de Esbrinachain

3.2.3.1. Caso crear pregunta

3.2.3.2. Caso crear respuesta

3.2.3.3. Caso realizar el voto por una respuesta

3.2.4. Complementos destacables del proyecto Esbrinachain

3.3. Firestore Cloud – (Google Firebase)

3.3.1. Colecciones de datos en Firestore Cloud

CAPÍTULO 4Casos de uso identificables en el proyecto Esbrinachain

4.1 Gestión de alta de usuarios

4.2 Crear una pregunta

4.3 Crear una respuesta

4.4 Iniciar y finalizar una votación por parte del administrador del contrato

4.5 Votar una respuesta

4.6 Resolución de una votación

4.7 Cálculo de la reputación del usuario

4.8 Incremento de la recompensa de una pregunta

4.9 Detalles de visualización en la interfaz

4.10 Soporte de idioma

4.11 Línea de estado para información del usuario

4.12 Pago por conocer la respuesta más votada

4.13 Configuración de un backend de datos en Firestore

Conclusiones

Agradecimientos

ANEXO 1: INSTALACIÓN DEL WALLET DE METAMASK

PARTE 2BLOCKCHAIN PRIVADA O PERMISIONADA

CAPÍTULO 5Sistema de auditoría de comunicaciones para una UTE de empresas

5.1 Introducción

5.2 Metodología seguida en HFLines

CAPÍTULO 6Propuesta de proyecto HFLines

CAPÍTULO 7Estructura de directorios en HFLines

CAPÍTULO 8Configuración de la red en HFLines

CAPÍTULO 9Metodología para la creación y despliegue de la red HFLines

CAPÍTULO 10Creación de la red HFLines paso a paso

CAPÍTULO 11Definición, instalación y ejecución de un chaincode

CAPÍTULO 12Implementación y ejecución de un chaincode en HFLines

CAPÍTULO 13API Rest de conexión a la red para clientes de HFLines

CAPÍTULO 14Monitorización de la red HFLines: Prometheus y Grafana

Conclusiones

Agradecimientos

ANEXO 1: INSTALACIÓN DE LA MÁQUINA VIRTUAL (GOOGLE CLOUD)

PARTE 3GESTIÓN DE PROYECTOS BLOCKCHAIN

CAPÍTULO 15Proyecto FoodChain_Km0. Venta de producto de proximidad y marca de calidad

15.1. Introducción

15.2. Resumen ejecutivo

15.2.1. Problemática por resolver

15.2.2. Propuesta de solución

15.2.3. Metodología de funcionamiento a diseñar

15.2.4. Conclusiones

15.3. Propuesta de valor

15.4. Comparación con los sistemas tradicionales

15.4.1. ¿Qué aporta la tecnología blockchain en comparación con los sistemas tradicionales?

15.4.2. Casos de uso

15.4.3. Resumen

15.5. Partes interesadas en FoodChain_Km0

15.6. Análisis de competidores

15.7. Modelo de negocio

15.7.1. ¿Cómo se generan los ingresos?

15.7.2. Posibilidad de ecosistema TOKENOMICS

15.7.3. Análisis financiero

15.8. Requisitos funcionales del proyecto FoodChain_Km0

15.8.1. Análisis de requerimientos globales

15.8.2. Modelado de procesos del negocio en FoodChain_Km0

15.8.3. Funcionalidad de la aplicación web FoodChain_Km0

15.9. Descripción y justificación de la tecnología usada

15.9.1. Arquitectura en la blockchain de Polygon

15.9.2. Esquema de arquitectura de la plataforma FoodChain_Km0

15.10. Recursos y planificación del desarrollo

Conclusiones

Agradecimientos

Bibliografía

PREFACIO

A quién va dirigido este libro

Este libro está pensado para estudiantes, profesionales o simpatizantes de la tecnología blockchain llegados de multitud de sectores, que conocen la teoría y conceptos de la cadena de bloques (en inglés, blockchain), y que desean disponer de casos prácticos donde comprobar cómo se traduce la teoría a la práctica.

Va dirigido al lector que ya ha pasado por la fase introductoria de la tecnología de la cadena de bloques, y que quiere poner en práctica todo lo aprendido pero necesita de ejemplos prácticos que le muestren el camino. Este libro pretende ser ese eslabón final, que acompaña las frases «y se envía una transacción», «calcular el gas límite» o «llamamos a una función de nuestro contrato inteligente» con el ejemplo práctico de cómo se hace.

Se dan por conocidos los conceptos de blockchain pública, privada o híbrida, la utilidad de la cadena de bloques y por qué es una tecnología en auge actualmente. Existen multitud de publicaciones con este tipo de contenido, y es por eso que este libro no pretende ser una más. Su objetivo prioritario consiste en mostrar tres implementaciones cuyo autor ha realizado para superar un curso académico, y que cree que pueden ser de utilidad para el resto de las personas interesadas en esta tecnología disruptiva, para dar ese paso inicial que cuesta dar cuando conocemos los conceptos teóricos pero todavía no hemos pasado a la práctica, y nos preguntamos «¿por dónde empiezo?».

No se trata de sentar cátedra, sino de aportar un granito de arena más a difundir la tecnología de cadena de bloques con ejemplos funcionales. El lector dispone de código programado en tres ámbitos: sobre la blockchain utilizando contratos inteligentes (lenguaje Solidity), en entorno de desarrollo web utilizando Angular Framework (Javascript, HTML, CSS), y en el entorno del cliente web3.js, que nos permite conectar la aplicación web y la red blockchain. Para el caso de blockchain permisionada habrá que sumar la programación Java y las herramientas proporcionadas por Hyperledger Fabric.

La variedad de librerías y lenguajes es una de las mayores dificultades a superar. Diferentes campos de especificación, entornos de programación, lenguajes, sintaxis y manuales de programación hacen que la mayoría de los usuarios o profesionales vean este proceso demasiado complejo. Poniendo al alcance de los lectores estos tres proyectos prácticos del ámbito académico, se pretende derribar esas barreras y dejar que, una vez adquirido el conocimiento, sea el lector quien dé el paso definitivo aportando su creatividad al mundo de las aplicaciones web conectadas a una red de tipo blockchain e implementar sus propios proyectos.

Contenido del libro

Para ello, se dispone de tres casos de uso. El primer proyecto, el sistema de conocimiento colaborativo Esbrinachain, nos muestra cómo crear e implementar una aplicación web que utiliza una blockchain pública como Ethereum o compatible con Ethereum. La temática es sencilla, un sistema de conocimiento colaborativo dotado de incentivos que permite poner en práctica la viabilidad e idoneidad del uso de la red blockchain. Debido a que un caso real implicaría un alto coste para el lector en transacciones, se ha desarrollado en la red de pruebas (testnet) Sepolia, 100 % compatible con Ethereum.

El segundo proyecto es, quizás, el caso más complejo. Hoy en día, las empresas con departamentos de innovación, que basan su éxito en ser pioneros en alguno de los campos punteros (como inteligencia artificial (IA), ciencia de datos o el mismo blockchain), son las más audaces destinando parte de sus presupuestos al desarrollo sobre blockchain privadas o híbridas. Y precisamente porque no siempre han tenido éxito, el proceso está siendo más largo y lento. No obstante, las ventajas potenciales en cuanto a una reducción muy significativa de los costes productivos derivados del uso de blockchain permisionada mantienen al alza sus expectativas. Este es el caso del proyecto HFLines, implementado con el objetivo de maximizar la colaboración entre empresas que comparten proyectos, sin descuidar la privacidad de cada una de ellas. Consiste en la implementación de un prototipo para el envío de mensajes entre empresas que colaboran en uno o más proyectos. HFLines permite disponer de un sistema de auditoría (grabado en la blockchain) de la toma de decisiones realizada (mensajes enviados) en aquellos proyectos compartidos, y donde es posible, además, mantener la privacidad de los interlocutores mediante la programación de canales privados seguros sobre una red blockchain permisionada (en la que el acceso está controlado y para participar se nos debe haber invitado primero).

En el tercer caso de uso, nos centramos en las funciones de un gestor de proyectos. En cómo debemos gestionar el diseño de un proyecto de tipo blockchain. En base a una idea de negocio establecida (la producción de productos de proximidad y marca de calidad), se muestra una solución de confianza para el consumidor final, basada en el uso de una red blockchain (cadena de bloques) pública.

FoodChain_Km0 nace con la idea de conectar a sus usuarios actores (entes de la administración, productores de cultivo de proximidad, transportistas, minoristas y consumidores finales) a un sistema seguro que certifique en la cadena de bloques que la producción y venta final realmente es la de un producto de proximidad y/o marca de calidad.

Aunque los tres casos de uso son fruto de proyectos finales académicos realizados en la escuela de negocios de nuevas tecnologías EBIS Business Techschool, y seguramente aplicados al mundo real necesitarían algunos complementos más, están bien trabajados y han estado bien valorados, por lo que son una buena base de partida para iniciarse en el desarrollo de proyectos basados en blockchain.

Los objetivos primordiales de este libro son:

■ Concentrar en una sola obra de nivel medio-avanzado tres proyectos sobre ámbitos de la tecnología blockchain tan diferentes como son: la blockchain pública, la blockchain empresarial permisionada y la gestión y diseño de un proyecto blockchain.

■ Difundir 3 proyectos académicos realizados por el autor sobre la cadena de bloques, de un modo práctico y nada teórico, y situar al lector en un punto de partida en la elaboración de aplicaciones web conectadas al tipo de blockchain compatible con Ethereum.

■ Mostrar al lector el desarrollo de código en los tres ámbitos necesarios: en la propia blockchain con contratos inteligentes (solidity), en backend utilizando librerías de conexión a blockchain (web3.js) y en frontend para la interfaz de la aplicación web (Angular Framework).

■ No solo mostrar el código implementado, sino también la salida por pantalla de su ejecución, para que el lector pueda perfectamente comprender el efecto y resultado de la programación y disponer de la respuesta a su ejecución en cada sistema en la misma lectura.

Los tres casos de uso pueden abordarse de manera independiente, por lo que el lector puede sentirse libre de leerlos en el orden que más le interese.

CAPÍTULO 1

PROYECTO ESBRINACHAIN Y PUBLICACIÓN EN GITHUB

Frecuentemente cuando empezamos a interesarnos por alguna tecnología, queremos averiguar el núcleo diferencial respecto al resto que conocemos. Algunas tecnologías como blockchain implican la capacidad de gestionar activos y, por tanto, necesitan de cierta inversión e implican potencialmente una posible pérdida económica. La cautela es, pues, normal a la hora de gestionar billeteras digitales (en inglés, wallets) o fichas que representen un valor (en inglés, tokens), siendo un caso particular de token las criptomonedas. El primer caso de uso presentado nos permitirá conocer y practicar nuestros conocimientos sobre blockchain pública sin coste alguno.

Se utiliza una blockchain pública para almacenar tres contratos inteligentes escritos en lenguaje Solidity, e implementar una aplicación web desarrollada en Angular Framework v17 (combinando HTML y CSS en diseño y estilo con Javascript para la programación). Para la conexión entre Angular y la red blockchain se han utilizado las librerías web3.js, bitcore-mnemonic, ethereumjs-wallet, bip39 y @ethereumjs/util. Lo más cercano a practicar un caso real con la red Ethereum pero sin coste es desarrollar aplicaciones sobre la Testnet de Sepolia, como es el caso del proyecto Esbrinachain. Para el lector interesado también en conocer el funcionamiento de una base de datos documental en la nube puede ser interesante ver los desarrollos realizados sobre Firestore Cloud (Google Cloud).

En los siguientes capítulos se procederá a describir cada una de las partes en las que podemos dividir el desarrollo del proyecto. Una de las mejores ventajas al utilizar una red blockchain pública consiste en que evitamos realizar fuertes inversiones para disponer de una estructura hardware. La red Testnet de Sepolia, al ser pública, concederá acceso y conexión a cualquier usuario potencial de la aplicación. Utilizando simplemente un navegador de Internet (como Google Chrome), el lector puede probar el proyecto sin costes, aunque sí deberá tener en cuenta que para realizar transacciones en Sepolia debe disponer de faucets, tokens ETH propios de Sepolia que no tienen coste, pero que resulta cada vez más complicado adquirir sin haber realizado operaciones previas en la mainnet de Ethereum.

La aplicación web de Esbrinachain está alojada en Github de forma gratuita sin coste y se puede interactuar con ella simplemente dándonse de alta con una dirección de correo ficticia, y disponiendo de un frase de recuperación para una dirección Ethereum o, alternativamente, un wallet de Metamask.

Para tener acceso al proyecto completo y disponer de una primera toma de contacto en Esbrinachain, podemos acceder a la publicación del código en Github utilizando el siguiente enlace:

https://github.com/EsbrinaChain/esbrina

En este enlace encontraremos en su totalidad el desarrollo de la aplicación web en Angular Framework. El conjunto de carpetas y ficheros es, básicamente, el fiel reflejo de la estructura del desarrollo realizado en Angular Framework. En el fichero de GitHub README.CMD podemos leer una primera definición del proyecto ESBRINACHAIN:

“Un sistema colaborativo de conocimiento

sobre red blockchain pública”

Esbrinachain proporciona un espacio en la nube para poder preguntar lo que nos interese saber y poder contestar lo que a los demás les interesa. Se diferencia del resto de proyectos en que basa su funcionamiento en contratos inteligentes almacenados en una red blockchain pública. Su propósito es la gestión del conocimiento y la gestión de activos de valor para cada usuario. Es capaz de realizar transmisión de activos de valor sin la necesidad de una tercera parte que ejerza como ente oficial reputado o certificador. Incorpora para cada usuario el uso de billeteras y autonomía para los usuarios para que ofrezcan recompensas económicas por sus preguntas y reciban beneficios por las respuestas que resulten ser las más votadas por el resto de los usuarios. En la figura 1, se puede ver el proyecto publicado en Github.

Figura 1: Publicación en GitHub del proyecto Esbrinachain.

CAPÍTULO 2

PROPUESTA DE PROYECTO

ESBRINACHAIN se pensó como un proyecto académico capaz de utilizar la tecnología blockchain de una red compatible a Ethereum para implementar UN SISTEMA DE CONOCIMIENTO COLABORATIVO basado en incentivos.

Mediante este ejemplo práctico, seremos capaces de poder utilizar los principales elementos de la teoría de la cadena de bloques: disposición de cuentas de usuarios con billetera compatible Ethereum, transmisión de valor sin validación de terceros, definición de contratos inteligentes, realizar mediante un sistema transaccional el acceso a la funcionalidad de los contratos inteligentes.

El primer paso que se debe dar siempre consiste en tener una idea clara del proyecto a implementar. Para esta tarea es indispensable disponer de una propuesta de proyecto, que describa con detalle sus funciones básicas. Es poco probable que sea la definitiva y seguro que, según vamos teniendo más claro el proyecto, acabaremos de pulir la propuesta hasta el más mínimo detalle; pero las funciones básicas deben estar planificadas en el momento de empezar a implementar. Entrar en metodologías de diseño queda fuera del alcance de este libro, pero sí mostraremos la evolución en el caso de Esbrinachain.

En este apartado se describe la propuesta de proyecto (figura 2) que se diseñó inicialmente, y se subrayan los cambios realizados durante la realización del proyecto, que podemos revisar en la propuesta final (figura 3).

Figura 2: Documento inicial de especificación técnica del proyecto Esbrinachain.

Como se puede observar en la propuesta de proyecto inicial, se añaden muchos complementos de aplicación. Finalmente se decidió concentrar los esfuerzos de desarrollo en las operaciones básicas:

■ Gestión de usuarios: alta y asignación de wallet (personalizado si se facilita una semilla y contraseña) o mediante la billetera digital de Metamask.

■ Crear una pregunta en el sistema, con su correspondiente recompensa.

■ Crear una respuesta en el sistema.

■ Implementar un sistema de votación que determine la respuesta idónea a una pregunta.

■ Calcular la reputación de cada usuario o usuarios que sean autor/autores de la respuesta más votada.

■ Control de los estados de cada pregunta: abierta (a respuestas), votando (cuando se ha iniciado el periodo de votación), en consulta (cuando la pregunta ha sido respondida y votada y los usuarios del sistema quieren conocer la respuesta) y finalmente anulada (casos en que no ha recibido respuestas o no ha recibido votos).

■ Control de la duración de los periodos definidos para cada estado de una pregunta.

■ Cálculo del vencedor (uno o más) en la votación de una pregunta.

■ Cálculo del pago a cada vencedor.

■ Cálculo de la reputación de cada usuario.

■ Concentrar todos los complementos de tipo de estadísticas, por un solo caso de uso en que cada usuario puede ver su clasificación de reputación en comparación con el resto de los usuarios.

Aunque pueda parecer que la propuesta de proyecto se ha reducido, queda compensada con aspectos introducidos durante el desarrollo de la aplicación, que inicialmente no se había detectado que podían ser necesarios:

■ Disponer de un backend a modo de base de datos que dé soporte al refresco de datos que, por no ser críticos, pueden no almacenarse en la cadena de bloques de Sepolia, o bien que controle la gestión de los usuarios del sistema. En nuestro caso se ha usado Firestore como base de datos cloud facilitada por Google.

■ Sincronización correcta del backend con el sistema vigente en la cadena de bloques. Los posibles errores al intentar transacciones pueden ocasionar discrepancias, puesto que hay que considerar la interacción multiusuario asíncrona con la cadena de bloques.

■ Diseño de la interfaz web para la aplicación.

■ Desarrollo de los test unitarios para el aplicativo.

■ Permitir la modificación de parámetros de configuración, como el tiempo de respuesta, el tiempo de votación y el cupo de respuestas.

Han quedado para versiones futuras las siguientes propuestas originales:

■ El control de respuestas repetidas. En la versión actual se deja que el resultado de la votación decida y se repartan beneficios de manera equitativa en caso de empate. Los premios mensuales a final de mes por mejor reputación en el sistema.

■ No se hacen valoraciones sobre las respuestas, sino que se reparte equitativamente a los ganadores de una votación.

■ El periodo de consulta se reduce a visualizar la respuesta más votada 15 segundos, excepto para el autor de la pregunta, que es gratuito. Esta opción debería mejorarse, considerando retardos en la red.

■ La única estadística considerada es la clasificación global de reputación de los usuarios del sistema. Así pues, no se han implementado clasificaciones de las temáticas de las preguntas, que bien podrían valorarse en etapas donde el diseño ya estuviera avanzado y consolidado.

■ Los usuarios no pueden modificar el estado de una pregunta a anulada. Solo el sistema define qué preguntas pasan al estado de anuladas.

Finalmente, la propuesta de proyecto más realista, que combina rendimiento y práctica completa de los conocimientos adquiridos de la teoría, es la mostrada en la figura 3.

Figura 3: Documento final de especificación técnica del proyecto Esbrinachain.

CAPÍTULO 3

ESTRUCTURA DE PROYECTO

El proyecto Esbrinachain está publicado en Github en la dirección:

https://github.com/EsbrinaChain/esbrina

En las siguientes secciones se hará referencia a partes de la estructura de directorios descrita en este apartado. El proyecto se puede descargar cuando se necesite poner en funcionamiento, clonando el proyecto en la máquina o computador local.

La mayoría de los proyectos implementados en Angular Framework pueden completarse con las propias librerías de Angular, pero también es muy común que para temas específicos optemos por incluir librerías externas dedicadas a una temática. Los proyectos tienen un carpeta etiquetada con el nombre de node_modules que contiene estas librerías, y acostumbra a ser una carpeta de gran volumen, que se evita publicar en Github. Para el correcto funcionamiento del proyecto en local, en este caso no es suficiente con clonar el proyecto, sino que también se facilita todo el contenido de la carpeta node_modules comprimida en 7 volúmenes, para evitar posibles problemas de compatibilidad por la evolución de las versiones de cada librería. Clonando el proyecto en local y descomprimiendo correctamente la carpeta node_modules, no debería haber problemas para recompilar el código original y acceder a la aplicación en la URL local:

https://localhost:4200

En la figura 4, se describen las carpetas más significativas de la estructura publicada. En caso de probar el proyecto en local, el lector deberá generar por su cuenta los perfiles de usuario y un wallet para cada perfil, en caso de querer probar la aplicación con múltiples usuarios interactuando en diferentes navegadores a la vez.

Lo mismo sucede con la parte de backend creada en Firestore Cloud. El lector puede usar por defecto la existente en la aplicación o replicar una en su propia cuenta cloud. La aplicación de Esbrinachain solo necesita el acceso al espacio cloud, ya que de cero crea las colecciones que necesita. Pero todos estos detalles se comentarán más adelante y con más detalle.

Figura 4: Estructura de directorios completa del proyecto Esbrinachain.

Además de los componentes creados en el proyecto, existe un fichero de configuración. El fichero Firestore1.ts almacena la configuración de acceso a Firestore Cloud. Se han utilizado 2 para, en caso de agotarse los límites operacionales permitidos en los perfiles gratuitos, disponer de un recambio.

Los ficheros dbs-preg.ts y db-resp.ts contienen ejemplos de preguntas y respuestas usados durante el desarrollo como base de datos de preguntas y respuestas.

Finalmente, el fichero idioma.ts implementa toda la mensajería usada en la aplicación en tres idiomas: castellano, catalán e inglés.

3.1. Smarts contracts

Una de las características más importantes de la red blockchain es la posibilidad de programar smarts contracts, o contratos inteligentes. En Esbrinachain, nos permiten formalizar las relaciones contractuales del funcionamiento del sistema colaborativo de conocimiento, gestionando quién pregunta, quién responde, quién vota y el contexto en que lo hacen, es decir, establecen las reglas de negocio y funcionamiento bajo las cuales el sistema funciona de manera transparente y de forma automatizada. Ejemplos de reglas son: «hay que formular una pregunta siempre ofreciendo una recompensa», «hay un periodo de respuesta», «hay un periodo de votación», «existe un administrador del sistema», «solo se puede responder una vez»... y las podemos extraer de la propuesta de proyecto. En el contrato inteligente se resolverá la votación que determina la mejor respuesta según los usuarios del sistema, y se asignará el valor de la recompensa a los autores de la respuesta más votada. El control lo establece de forma automatizada y, al ser inmutable, su código por ejecutarse en la cadena de bloques no permite cambio alguno, proporcionando un blindaje de confianza al funcionamiento del sistema.

Utilizar contratos inteligentes proporciona al sistema Esbrinachain seguridad, inmediatez, precisión y transparencia. El lenguaje utilizado para su definición es Solidity, y se han desarrollado utilizando el compilador online de REMIX.

https://remix.ethereum.org/

En Esbrinachain existen tres contratos, contenidos en los ficheros:

1.esb_pregunta.sol: se ocupa de las reglas de negocio relacionadas con la acción de «Preguntar». Contiene el código del contrato esbAdmin, que se ocupa de restringir el acceso a ciertas operaciones reservadas solo al administrador.

2.esb_respuesta.sol: se ocupa de las reglas de negocio relacionadas con la acción de «Responder».

3.esbrinachain.sol: hereda el código de los dos anteriores y se ocupa de dar soporte al proceso de votación y, en general, a todos los aspectos del sistema Esbrinachain.

En las tres figuras siguientes podemos visualizar el código implementado en cada uno. Existe una EIP (Ethereum Improvement Proposal) o propuesta de mejora, la EIP-170, que establece que el límite de tamaño de los smart contracts está definido en 24575 bytes. El desarrollo de Esbrinachain está cercano a este límite y, por ello, cualquier modificación implicaría una de reducción de código. Por esto es importante, al desarrollar contratos inteligentes, tener en cuenta el límite de tamaño cuando se implementan y no intentar modificarlos una vez desarrollados. Otro aspecto interesante para el lector —y no menos importante— consiste en desarrollar código que no sea potencialmente de gasto de gas infinito. Esto implica que los bucles for que se incluyan no sean infinitos, sino de número corto o finito de ciclos. En Esbrinachain, podría darse el caso de que, para un número muy elevado de preguntas, los bucles for incluidos en el código pudieran representar un coste de gas superior al soportado por la transacción. Es un ejemplo claro de que un caso de proyecto de producción debe pensarse teniendo en cuenta estos detalles con más atención, utilizando analizadores de código que revisen tanto la seguridad como el rendimiento en coste de gas de los contratos inteligentes. Por otro lado, en la mayoría de los casos en los que se ha implementado un bucle for, se ha realizado asegurando que el número de ciclos en el for es finito y corto.

Existen librerías consolidadas, como OpenZeppelin, que pueden ayudarnos a implementar patrones de código seguros y óptimos en rendimiento.

Los criterios ideales para economizar su tamaño serían:

1. Uso de bibliotecas y proxies.

2. Acortar los mensajes de error.

3. No usar las variables evitables.

4. No pasar estructuras de datos struct como parámetros, sino los propios parámetros.

5. Utilizar errores personalizados.

6. Declarar la visibilidad correcta para funciones y variables.

7. Reducir el uso de modificadores.

Esbrinachain, al ser un proyecto académico, no cumple algunas características por necesidades propias de su condición, como es el caso de acortar los mensajes de error o evitar todo tipo de código que no fuera imprescindible, debido a que estos se han utilizado para demostraciones y formación académica.

Queda claro, pues, que deberemos dedicar un tiempo a la seguridad del código y a mantener un equilibrio adecuado entre su coste en gas y su seguridad.

Cuando se empieza a programar smart contracts es fácil dejarse llevar por el código que funciona y no evitar posibles patrones no deseables en el código. Es por ello por lo que se aconseja al lector dedicar un tiempo a obtener las directrices de qué patrones no son seguros y permiten posibles ataques, como DDOS o reentrancy. En el caso de Esbrinachain, las operaciones críticas se han restringido mediante modificadores que solo permitían ejecutarlas al usuario administrador del contrato, como se verá más adelante. Tampoco se realizan llamadas a otros contratos cuando se cambia el estado de la blockchain ni se integran librerías de terceros. En estos aspectos, el código tiene margen de mejora, e incluso una estructura distribuida de los contratos podría ser una buena estrategia.

En la figura 5, se muestra el código fuente del contrato inteligente preguntar.

Figura 5: Código fuente del contrato inteligente «preguntar» (esb_preguntar.sol).

El contrato preguntar incluye un contrato sencillo llamado esbAdmin, que establece qué wallet de usuario se asigna como administrador del sistema cuando se despliega el contrato, y contiene el modificador soloAdmin, que se define para permitir el acceso solo al administrador a ciertas operaciones exclusivas de su rol.

En el contrato preguntar se define el conjunto de estados posibles para las preguntas: abierta, votando, consulta y anulada. También las estructuras funcionales de una pregunta, una respuesta y de los usuarios del sistema. En la figura 6, se muestran todas las estructuras usadas en los contratos inteligentes:

Figura 6: Estructura de una pregunta, una respuesta y de un usuario.

Cada pregunta almacena su estado, la recompensa asociada a contestarla de manera óptima, la fecha en que se crea, la fecha en que se inicia su votación, su autor, su enunciado y si ha sido votada o no.

Cada respuesta almacena su identificador único, el identificador único de su pregunta, el número de votos recibidos en la votación de la pregunta, su autor, su enunciado y si ha resultado ganadora en la votación.

Cada usuario está definido por un nombre, apellido, alias