Entorno desarrollo blockchain - Truffle


Continuando con la publicación anterior sobre creación de entornos de desarrollos para smart contracts.

En esta ocasión utilizaremos la suite de Truffle pero antes intentaré explicar brevemente que es Truffle.

📰

He creado un template en Github para que podáis iniciar desde cero cualquier proyecto con toda la configuracion.

GitHub

Truffle

Truffle Suite es un conjunto de herramientas de desarrollo de Ethereum que se utiliza para facilitar la creación, el despliegue y el testing de smart contracts. Truffle proporciona una serie de herramientas que hacen que el proceso de desarrollo sea más sencillo y eficiente, como por ejemplo una red de prueba local y una interfaz de línea de comandos.

Instalación

La instalación es super sencilla solamente es necesario tener Node.js instalado en nuestro ordenador.

A mi personalmente no me gusta tener instalado librerías globales, por lo que se realizará como una instalación local en un proyecto. En la documentación oficial recomiendan hacerlo a nivel global pero no se indica ningún motivo.

Instalación de Truffle de manera local

  • Crea una carpeta nueva. Esta carpeta es en la cual desarrollaremos nuestros smart contracts.

  • Inicializar el proyecto node. Con la flag -y omitimos todas las preguntas que pide para generar el package.json.

npm init -y
  • Instalar truffle.
npm install truffle

Seguramente durante la instalación aparezcan varios WARN no te preocupes es algo normal.

Una vez finalizado ya tenemos instalado Truffle en el proyecto.

Instalación de Truffle de manera global

Abre un terminal en cualquier carpeta. Como lo vamos a instalar de manera global no afecta el directorio en el que nos encontremos.

npm install -g truffle

También puede aparecer varios WARN durante la instalación pero no hay ningún problema.

Inicializar proyecto

Una vez tenemos instalado truffle de la forma que prefiramos ahora tenemos que inicializar el proyecto y configurarlo para poder ponernos a trabajar y crea nuestros smart contracts.

Aquí también tenemos dos alternativas:

  1. Crear proyecto desde cero.

  2. Utilizar una herramienta super útil que nos permite tener esqueletos ya configurados.

⚠️

Al realizarse como instalación local todos los comandos incluirán el prefijo npx para indicar que queremos utilizar la versión que se encuentre en el proyecto. Si quieres instalártelo de manera global serían los mismos comandos pero sin el npx.

Crear proyecto desde cero

Para comenzar con un proyecto en truffle no hay más que realizar el comando:

npx truffle init

Al ejecutarlo nos creará las siguientes ficheros y carpetas:

.
├── contracts
├── migrations
├── test
└── truffle-config.js

Cada carpeta tiene una función diferente:

  • contracts: Directorio en el cual se alojarán los contratos de Solidity.

  • migrations: Directorio donde estarán los ficheros para poder desplegar los contratos.

  • test: Directorio donde estarán los ficheros de testing.

  • truffle-config.js: Archivo de configuración de Truffle.

A partir de aquí podemos crear utilizando los comandos para crear contracts, tests y migration en un solo comando.

npx truffle create all {nombreContrato}

Hay que tener en cuenta que el migration aparecerá vacío ya que cada smart contract tiene su forma de desplegarse.

Inicializar proyecto usando boxes

Las boxes es como Truffle llama a los boilerplates/squeleton/starter es la manera más sencilla de poder comenzar a desarrollar (sobre todo cuando no se tiene mucha experiencia).

Lo bueno de estos boxes es la facilidad al comenzar, pero también suelen tener código innecesario para tu proyecto, por lo que te tocará hacer limpieza.

En esta url tenemos las distintas boxes disponibles, podemos ver que hay para una gran variedad de redes, también con una dapp con la que podrías interactuar, etc.

En esta ocasión utilizaremos la que en mi opinión es la más sencilla de todas: metacoin.

npx truffle unbox metacoin

Ya tenemos un base de la cual poder comenzar a desarrollar nuevos propios smart contracts.

Tests

Truffle tiene integrado dos formas de realizar tests de los smart contracts si queremos ejecutarlos en JS utiliza Mocha para la ejecución de los tests y Chai para la gestión de aserciones, pero si queremos escribir los tests en solidity, Truffle ha desarrollado su propio sistema de testing.

Para ejecutar los tests independientemente del lenguaje elegido para desarrollarlos se ejecuta el comando:

npx truffle test

Una vez terminada la ejecución de los tests podemos ver que se han compilado los contratos, y el resultado de los distintos tests.

En caso de ejecutar los tests que se encontraban en metacoin tendremos ambas versiones de tests, tanto solidity como JS.

Resultado de ejecución de los tests

Compilar

A veces no sabemos si el contrato escrito es válido, puede ser porque nuestro IDE no tenga ningún sistema que nos indique esto o porque hasta que no se hace un análisis más exhaustivo no se detecta.

npx truffle compile

Si tienes algún error este te saldrá indicando la línea en la que se encuentra.

Desplegar

Ya hemos desarrollado todo nuestro smart contract y ahora queremos desplegarlo para poder jugar desde alguna dapp o terminal.

Para esto necesitamos primero acceder a la terminal de truffle ya que en nuestro proyecto no hemos añadido en ningún lugar nada sobre nuestras llaves privadas, ni frase semilla.

⚠️

No utilizar frases semillas reales para desarrollar proyectos.

Para acceder a la terminal de truffle se introduce el comando:

npx truffle development

Una vez dentro nos aparecerán distintas cuentas y llaves privadas que nos ha generado para poder interactuar con la blockchain interna de truffle para testing.

Esta blockchain es local a nuestro sistema y no interactúa con ninguna red real.

Dentro de esta terminal ahora solo hay que escribir: migrate.

Nos empezará a compilar los contratos y a desplegar los contratos.

Luego nos muestra un resumen de como ha ido la transacción.

Starting migrations...
======================
> Network name:    'develop'
> Network id:      5777
> Block gas limit: 6721975 (0x6691b7)

1_deploy_contracts.js
=====================

 Deploying 'ConvertLib'
 ----------------------

  > transaction hash:    0xab56f1d7bf41f6626c4d62bf03d7f233a6fa89dad66cbbecfab5a69801b4cc4e

  > Blocks: 0            Seconds: 0
  > contract address:    0xdBd46321fEc026dd29Ba79A971CEAACB1d0c8167
  > block number:        1
  > block timestamp:     1677951054
  > account:             0x5ABee54635707F17De4834D9295Dda7715E6d19f
  > balance:             99.999468208
  > gas used:            157568 (0x26780)
  > gas price:           3.375 gwei
  > value sent:          0 ETH
  > total cost:          0.000531792 ETH

  Linking
  -------
  * Contract: MetaCoin <--> Library: ConvertLib (at address: 0xdBd46321fEc026dd29Ba79A971CEAACB1d0c8167)

  Deploying 'MetaCoin'
  --------------------

  > transaction hash:    0xef8283ab74690ec267eb1d405b1326098018209c64459ff4645da520c14db3bb

  > Blocks: 0            Seconds: 0
  > contract address:    0xD0942B45361bcf144Df8D5ade92E1e8ecF7BFA3F
  > block number:        2
  > block timestamp:     1677951054
  > account:             0x5ABee54635707F17De4834D9295Dda7715E6d19f
  > balance:             99.998105632065943366
  > gas used:            416594 (0x65b52)
  > gas price:           3.270752661 gwei
  > value sent:          0 ETH
  > total cost:          0.001362575934056634 ETH

  > Saving artifacts
  -------------------------------------
  > Total cost:     0.001894367934056634 ETH

Summary
=======
> Total deployments:   2
> Final cost:          0.001894367934056634 ETH

Enhorabuena ya tenemos desplegado nuestros contratos en la red interna de truffle. Pero ahora querremos interactuar de alguna forma.

Interactuar con el contrato

Dentro del mismo terminal de truffle podemos interactuar con los contratos. Aquí dentro acepta código JS por lo que podemos realizar las mismas operaciones que se encuentren en los ficheros de test.

Por ejemplo saber la cantidad de monedas tiene un usuario:

const metaCoinInstance = await MetaCoin.deployed();
const balance = await metaCoinInstance.getBalance.call(accounts[0]);
balance.toNumber()

Conclusión

Hemos logrado inicializar un proyecto, realizar tests, desplegar e interactuar con un smart contract utilizando nada más que la suite que nos proporciona Truffle.

La suite de Truffle es gigante y os invito a descubrir los distintos productos que tiene.