Blockchain: Desarrollando Smart Contracts para Ethereum con Truffle

Ya has visto cómo montar tu entorno de desarrollo en local, para no depender del IDE de Remix, pero todavía podemos mejorarlo un poco más 🙂 Hoy te quiero hablar del framework más popular para el desarrollo de smart contracts para Ethereum llamado Truffle.

Algunas de las cosas que te ofrece este framework son:

  • Compilación de smart contracts.
  • Automatización del testeo de contratos.
  • Automatización de los despliegues.
  • Gestión de las redes de Ethereum para desplegar tus smart contracts, ya sean públicas o privadas.

Instalación

Lo primero que necesitas es instalar Truffle en tu entorno de desarrollo. Puedes hacerlo a través de este comando, lo cual instalará un módulo de Node.js a nivel global.

npm install truffle -g

Crear un proyecto con Truffle

Mi objetivo para este artículo es crear un proyecto para nuestro ejemplo TimeControl, que vimos en el artículo anterior. Para iniciar un proyecto nuevo, crea un directorio con el nombre de tu proyecto (yo lo he llamado time-control-truffle), posiciónate en él y lanza el siguiente comando:

truffle init
truffle init

Esto creará una estructura de carpetas como la siguiente:

Estructura de un proyecto con Truffle
  • contracts/ para tus contratos en Solidity. Por defecto, existe un contrato llamado Migrations.sol que se encarga de auditar las migraciones que se han ido llevando a cabo.
  • migrations/ para los scripts que harán los despliegues de los contratos a la red Ethereum.
  • test/ aquí se almacenarán los tests tanto de tu aplicación como de los contratos.
  • truffle-config.js es, como su propio nombre indica, el archivo de configuración de truffle.

Como ves, esto nos permite tener nuestra Daaps mucho mejor estructuradas. Dentro de la carpeta contracts/ crea el archivo TimeControl.sol con el contenido que ya vimos.

pragma solidity ^0.5.8;

contract TimeControl{    
    
    address private owner;
    mapping (address => uint[]) private employeeRecords;
    
    constructor() public{        
        owner = msg.sender;
    }
    
   function Register() public{
       employeeRecords[msg.sender].push(now);
   }   
  
   function GetMyRegistries() public view returns (uint[] memory){
       
       uint[] memory result = new uint[] (employeeRecords[msg.sender].length);
       for (uint i = 0;i < employeeRecords[msg.sender].length; i++) {
           result[i] = employeeRecords[msg.sender][i];    
       }
        
        return result;
    }    
}

Compilar con Truffle

Otro de los puntos que nos aporta Truffle es que nos facilita la compilación. Si recuerdas, en el artículo anterior teníamos que utilizar el compilador solc a través del terminal o bien crear un script con el módulo de solc para llevar a cabo este trabajo. Con truffle es tan sencillo como ejecutar este comando:

truffle compile

Si estás usando mi código de ejemplo comprobarás que la compilación da error.

Esto se debe a que a día de hoy truffle tiene configurado por defecto la versión 0.5 para compilar, por lo que necesitamos modificar en el archivo truffle-config.js y cambiar la versión a la 0.5.8. Vuelve a lanzar el comando truffle compile y verás que ya todo funciona correctamente.

Cuando el proceso finalice, se generará una nueva carpeta llamada build con un archivo JSON por cada contrato, en este caso uno para Migrations.sol y otro para TimeControl.sol, que contendrá el ABI y el bytecode.

Desplegar los contratos en tu red de Ethereum

La última maravilla de Truffle de la que te voy a hablar hoy: el despliegue. En el artículo anterior utilizábamos primero solc para compilar y web3 para desplegar el contrato a través de una transacción. Con truffle todo esto es transparente para nosotros. Antes de lanzar ningún comando, abre Ganache y haz clic en Quickstart, para tener una red de pruebas disponible. Después ejecuta el siguiente comando para desplegar tus contratos en la red.

truffle migrate

Cuando vimos la estructura de carpetas, te conté que el directorio migrations almacena los scripts para los despliegues. En la estructura que monta truffle init solo existe código para Migrations, pero no para nuestro contrato TimeControl, y es por ello que solo se ha desplegado este primero. Para solucionarlo, vamos a crear un archivo dentro de la carpeta migrations llamado 2_timecontrol_migration.js con este contenido:

var TimeControl = artifacts.require('TimeControl');

module.exports = function (deployer) {
    //deployment steps
    deployer.deploy(TimeControl);
};

Como ves, se utiliza artifacts.require para recuperar el contrato que queremos desplegar. Después se exporta una función que tiene todos los pasos necesarios para el despliegue, en este ejemplo únicamente desployer.deploy, pasándole la variable que tiene nuestro contrato.

Si vuelves a ejecutar truffle migrate verás que esta vez se han desplegado ambos contratos en Ganache.

Truffle boxes

En la página de truffle existe un apartado llamado truffle boxes donde puedes ver diferentes aplicaciones de prueba, que te pueden dar una idea de todo lo que puedes llegar a crear. Puedes utilizar truffle unbox <box-name> para descargar cualquiera de ellas.

El código lo tienes en mi GitHub.

¡Saludos!