Por Darío López Padial

Introducción

Este tutorial está orientado a programadores con conocimientos en desarrollo web, pero con poca o nula experiencia en desarrollo de dApps sobre la red Ethereum o la tecnología blockchain en general.

Probablemente si estás aquí es porque ya has escuchado hablar de términos como «blockchain», «smart contract», «dApp», «Ethereum network», «Solidity», etc. Si los términos anteriores te suenan pero no los tienes del todo claros, te recomiendo que te leas el siguiente artículo antes de seguir con el tutorial:

http://truffleframework.com/tutorials/ethe- reum-overview

Para esta primera toma de contacto con el desarrollo de aplicaciones descentralizadas, he decidido usar el framework de desarrollo Truffle. Actualmente es el framework más avanzado y usado para estos menesteres por la comunidad. Nos permitirá compilar, desplegar o testear nuestros contratos inteligentes.

Está desarrollado en Node.js y lo usaremos mediante línea de comandos.

Bien, ¿y qué vamos a desarrollar?

Pues una dApp muy sencilla que nos ayude a entender dos de las cualidades más importantes que ofrece la tecnología blockchain. Nos referimos a la inmutabilidad y la transparencia de los datos.

Hasta ahora, en las bases de datos transaccionales hablábamos de las operaciones básicas CRUD (Create, Read, Update, Delete). Sin embargo, usando la tecnología blockchain para almacenar datos, el paradigma cambia por completo y las operaciones de modificación y borrado de datos carecen de sentido.

Implementaremos un sistema descentralizado de votación de propuestas donde cualquier usuario podrá crear propuestas para que los demás puedan votarlas con las opciones a favor, en contra o abstención. Conviene aclarar que cada usuario podrá ejercer su derecho a voto una sola vez por cada propuesta.

Configuración de las herramientas

En primer lugar, procedemos a configurar las herramientas que vamos a utilizar para el desarrollo.

Ganache

Es una herramienta, desarrollada por el equipo de Truffle, que nos permitirá ejecutar una blockchain en local, donde podremos desplegar nuestros contratos inteligentes, ejecutar tests e inspeccionar de un modo visual el estado de la blockchain mientras hacemos nuestras operaciones en desarrollo.

Para el desarrollo de aplicaciones descentralizadas sobre Ethereum esta no es la única vía, podríamos también usar alguna de las testnets de Ethereum, pero esto lo dejaremos para tutoriales posteriores.

Para usarlo, puedes descargar el software en su página oficial. Tienen clientes instalables para diferentes sistemas operativos:

http://truffleframework.com/ganache/

Una vez descargado, necesitaremos ejecutarlo. En la Imagen 1 puedes comprobar el aspecto del programa.

MetaMask

Es una herramienta que nos permitirá interactuar con nuestros contratos inteligentes desde el navegador web.

Para su instalación tan solo necesitas buscarla como extensión para navegadores como Mozilla Firefox o Google Chrome. Recomiendo usar Mozilla Firefox, ya que he experimentado menos problemas con este navegador.

A continuación, necesitamos configurar MetaMask. Para ello, recomiendo seguir la detallada guía gráfica de Truffle:

http://truffleframework.com/tutorials/pet-shop#ins- talling-and-configuring-metamask.

Paso a paso

Lo siguiente que necesitaremos es el código de la dApp. Para esto, lo primero que haremos es abrir nuestra consola y descargarnos el proyecto desde GitHub:

> git clone https://github.com/bukosabino/truffle-voting-dapp.git

Posteriormente, accedemos al directorio e instalamos los paquetes necesarios para el funcionamiento del proyecto:
> cd truffle-voting-dapp
> npm install -g truffle
> npm install

Para compilar nuestro contrato inteligente, usaremos el siguiente comando:

> truffle compile

Desplegamos el contrato en nuestra blockchain del siguiente modo:

> truffle migrate –reset

Y, por último, podemos ejecutar nuestro servicio con el siguiente comando:

> npm run dev

Puedes ver la aplicación en el navegador que hayas configurado con MetaMask visitando la siguiente URL:

http://localhost:3000

Ahora puedes crear propuestas y votarlas una única vez por cada usuario a través de tu navegador. Para comprobar esto último puedes cambiar de usuario en MetaMask. Para ello, necesitarás:

1. Buscar una clave privada de otro usuario en Ganache (pincha en el icono de la llave a la derecha de la Imagen 1, para mostrar la clave privada de cualquier usuario que no sea el primero que aparece, ya que es el que MetaMask usa por defecto).

2. Busca en MetaMask la opción «Import Account» para introducir la clave privada copiada de Ganache.

Dentro del código

Contrato contract/Voting.sol

Si miramos en detalle el código del contrato inteligente, lo primero que podemos apreciar es que para modelar la solución hemos usado dos structs: una para las propuestas y otra para los votos. Te preguntarás por qué en la estructura de las propuestas tenemos a la vez un map a los votos y una lista de los usuarios que han votado. Esto es así porque Solidity no nos permite retornar el map e iterar sobre este para comprobar los usuarios que han votado. Sí nos lo permite usando una lista. Por tanto, la usaremos aunque suponga una duplicación de la información. Además de las estructuras para modelar los datos, disponemos de algunas funciones útiles para consultar los datos de la blockchain desde el cliente en Javascript.

Solidity no nos permite retornar estructuras, y mucho menos una lista de estas. Por esto tenemos la función getNumProposals(), que nos devolverá el número de propuestas existentes en la blockchain y getProposal(uint proposalInt) para obtener una a una.

En la función vote(uint proposalInt, uint voteValue) comprobaremos en las primeras líneas que ningún usuario vote una propuesta repetidas veces.

Como puedes comprobar, Solidity es un lenguaje singular, con sintaxis muy parecida a lenguajes de sobra conocidos, pero que según lo que queramos hacer puede no resultar tan natural como estos. Debemos recordar que es un lenguaje moderno, sin demasiado tiempo de historia.

Si quieres tener un poco más de soltura con Solidity, te recomiendo que eches un vistazo a su documentación oficial. Está cargada de ejemplos e incluso se encuentra traducida al español:

https://solidity-es.readthedocs.io/es/latest/

Testeando el contrato inteligente /test/vo- ting.js

Antes de consumir los datos y operaciones de nuestro contrato inteligente, con Truffle podemos testear de un modo muy cómodo. Nos permite hacerlo con Solidity o con Javascript. Yo he elegido escribir los tests con Javascript porque me resulta más cómodo. Truffle hace un wrapper sobre el framework Javascript de desarrollo de test Mocha.

Una vez los tenemos escritos, podemos ejecutarlos fácilmente con el siguiente comando:

> truffle testv


Consumiendo el contrato inteligente desde el cliente Javascript /src/js/app.js

Desde este archivo interactuamos tanto con el contrato inteligente, consultando y añadiendo datos, como con el HTML, modificando la información de los nodos con jQuery.

Las primeras funciones son necesarias para la instalación de web3 y del contrato inteligente desarrollado, «Voting».

El resto de funciones son para obtención y añadido de datos en el sistema. Si echamos un vistazo a getProposals(), podemos ver cómo para obtener los datos de todas las propuestas primero usamos la llamada getNumProposal() para conocer el número de propuestas almacenadas, y una vez conocido este número podemos iterar para obtenerlas una a una. Luego, con jQuery rellenamos los campos de HTML.

Trabajo para el futuro

Aquí termina el tutorial pero, si a raíz de este, alguien tiene ganas de seguir desarrollando, le propongo algunas funcionalidades que podría incluir:

• Propuestas con fechas de inicio y fin. De este modo solo aparecerán en pantalla aquellas propuestas que estén dentro del rango acordado.

• Transacciones de usuarios anónimas.

• Montar la dApp sobre una de las redes de prueba de Ethereum (Ropsten).

¡Contáctame por GitHub si tienes dudas o ganas de que trabajemos juntos!

https://github.com/bukosabino/truffle-voting-dapp