Cómo desplegar nuestro contrato en Truffle

20/21

Lectura

Truffle es un ambiente para quienes desarrollan en blockchain, diseñado para testear y desplegar contratos de forma sencilla. En esta clase te explicaré como usar Truffle para desplegar nuestro contrato en Ropsten una de las testnet de Ethereum.

Instalando Truffle

Lo primero que vamos a hacer es instalar Truffle en nuestra máquina, para esto es necesario que tengamos instalado previamente el gestor de paquetes npm. Para verificar si ya lo tienes instalado puedes usar el siguiente comando:

npm --version

Si no lo tienes instalado, en las primeras tres clases del curso de gestión de dependencias y paquetes te explicaremos como hacerlo para cualquier sistema operativo.

Teniendo npm listo, debes ejecutar el siguiente comando para instalar Truffle:

npm install -g truffle

¡Listo! Ahora ya puedes usar Truffle dentro de tu máquina.

Creando un proyecto en Truffle

Ahora que hemos instalado Truffle vamos a crear un proyecto para desplegar nuestro contrato **CrowdFunding.sol**, para esto vas a crear una carpeta CrowdFunding y dentro de ella vas a ejecutar el siguiente comando

truffle init

Este comando inicializará tu proyecto con la siguiente estructura:

  • **contracts**: En esta carpeta debes agregar todos los contratos de tu proyecto, en este caso vamos a agregar nuestro contrato CrowdFunding.sol

  • migrations: Esta carpeta se agregarán los scripts necesarios para desplegar nuestro contrato, vamos a agregar un nuevo archivo 2_initial_migration.js con el siguiente contenido:

    //2_initial_migration.js
    const CrowdFunding = artifacts.require("CrowdFunding"); //Instancia de nuestro contrato CrowdFunding.sol
    
    module.exports = function (deployer) {
      deployer.deploy(CrowdFunding); //Este script hace deploy de nuestro contrato a la blockchain
    };
    
  • test: En esta carpeta se agregan todos los archivos de test que nos permiten testear si nuestras aplicaciones y contratos funcionan como deberían.

  • truffle-config.js: Este es el archivo principal de configuración Truffle, nos permitirá modificar las configuraciones de Truffle.

    Como nuestro contrato tiene el pragma pragma solidity >=0.7.0 <0.9.0; debemos cambiar la versión del compilador de Solidity que usa Truffle, para permitir que pueda compilar nuestro contrato.

    Buscamos dentro de este archivo la sección de compilers y agregamos la versión de compilador 0.8.7.

    Nuestro archivo ahora se vería de la siguiente forma:

    //truffle-config.js
    ...
    // Configure your compilers
      compilers: {
        solc: {
          version: "0.8.7",    // Fetch exact version from solc-bin (default: truffle's version)
          // docker: true,        // Use "0.5.1" you've installed locally with docker (default: false)
          // settings: {          // See the solidity docs for advice about optimization and evmVersion
          //  optimizer: {
          //    enabled: false,
          //    runs: 200
          //  },
          //  evmVersion: "byzantium"
          // }
        }
      },
    	...
    

Compilando nuestro contrato en Truffle

Ahora que hemos creado y configurado nuestro proyecto, vamos a compilar nuestro contrato, para verificar que todo esté bien, para esto vamos a usar el comando:

truffle compile

Ahora que nuestro contrato ha sido compilado sin errores, llego la hora de desplegarlo en Ropsten

Desplegando nuestro contrato en Ropsten

Configuraciones Iniciales

Para desplegar un contrato debemos contar con:

  • Un archivo .sol que al compilarlo no tenga ningún error.
  • Una wallet dentro de la red de Ropsten.
  • Un nodo que esté conectado con la red de Ropsten.

Para crear una wallet dentro de Ropsten, usaremos Metamask, como en la clase anterior.

Para conectaros a un nodo dentro de la red de Ropsten, vamos a usar Infura.

Infura nos proveerá un nodo público al que podremos conectarnos por medio de una API de forma muy sencilla.
Para crear una cuenta en Infura solo debemos ingresar un email y una contraseña en la caja de Get Started for Free. Infura tiene varios planes con diferentes precios, el plan gratuito será más que suficiente para desplegar nuestro contrato.

Infura-Get-Started-Signup-img.png

Una vez dentro de Infura, vamos a dar clic a la pestaña de Ethereum → Create A Project, le ponemos un nombre a nuestro proyecto, en este caso Crowd Funding.

Una vez creado el proyecto, vemos que tiene un project id, un project secret, y varios endpoints, para cambiarnos de la mainnet de ethereum a la red de Ropsten.

Vamos a dar clic en el selector de red y vamos a seleccionar Ropsten.

Infura-main-Crowdfunding-project-img

Configurando la red en Truffle

Ahora que contamos con todo lo que necesitamos para desplegar un contrato, vamos a configurarlo dentro de Truffle.

Para esto instalaremos dos dependencias, la primera será truffle hdwallet provider, que permite hacer transacciones a la blockchain usando nuestra wallet, para instalarlo utiliza el siguiente comando:

 npm install truffle-hdwallet-provider --save

La segunda dependencia que necesitaremos es dotenv. Esta te permite guardar variables con datos sensibles en archivo llamado **.env** y leerlas dentro del código sin que se revele su valor.

Para instalarlo usaremos el comando:

npm install dotenv --save

Una vez instaladas las dependencias, debemos configurar los datos de la red de Ethereum donde queremos desplegar nuestro contrato, para esto vamos a agregar la siguiente configuración en la entrada networks del archivo **truffle-config.js**

//truffle-config.js
...
const HDWalletProvider = require('@truffle/hdwallet-provider');
const { env } = require('process');
require('dotenv').config()
...
networks: {
    development: {
      host: "127.0.0.1",     // Localhost (default: none)
      port: 8545,            // Standard Ethereum port (default: none)
      network_id: "*",       // Any network (default: none)
    },

    ropsten: {
      provider: () => new HDWalletProvider(env.MNEMONIC, `https://ropsten.infura.io/v3/${env.PROJECT_ID}`),
      network_id: 3,       // Ropsten's id
      gas: 5500000,        // Ropsten has a lower block limit than mainnet
      confirmations: 2,    // # of confs to wait between deployments. (default: 0)
      timeoutBlocks: 200,  // # of blocks before a deployment times out  (minimum/default: 50)
      skipDryRun: true
}
...

Ahora creamos un archivo .env y agregamos las variables **MNEMONIC**, que tendrá la frase secreta que Metamask nos da como opción de recuperación de nuestra wallet y **PROJECT_ID** que es el valor que nos da Infura cuando creamos un proyecto:

MNEMONIC=example example example ...
PROJECT_ID=infura project id

Recuerda que si quieres subir tu proyecto a GitHub primero debes agregar un archivo llamado .gitignore en la raíz del proyecto, con las siguientes entradas, para evitar que hagas públicos los datos de tu archivo .env .

//.gitignore
.env
build/

Una vez configurada la red de Ropsten dentro de Truffle vamos ahora si a desplegar nuestro contrato, para eso ejecutamos el siguiente comando en la terminal:

truffle migrate --network ropsten

¡Y, listo! Tu contrato será desplegado. Para confirmarlo podrás ir a https://ropsten.etherscan.io/, en el buscador poner la dirección de tu wallet y en el resumen de las transacciones verás una de la siguiente forma:

.Contract-creation-ropsten-img.png

Cuando das clic sobre Contract Creation, verás que te lleva a una dirección, esta es la dirección del contrato dentro de Ropsten, ahora cualquiera dentro de la red puede encontrarlo y usarlo.

En esta clase has aprendido cómo desplegar un contrato a una red de Ropsten usando Truffle, comparte tus dudas en el sistema de comentarios y compártenos como te fue desplegando tu contrato.

Aportes 10

Preguntas 11

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

y recuerden NUNCA PERO NUNCA compartir información de su Wallet como la llave privada o la seed phrase. Les recomiendo crear una cuenta de pruebas para no mezclar su cuenta que usan en verdad

Cuando estan en Infura y cambian de Mainnet a Ropsten, denle en save changes arriba.

Si les da el error

Cannot find module '@truffle/hdwallet-provider'

Simplemente hagan

npm i @truffle/hdwallet-provider --save

Ya que en el import que se hace en truffle-config.js, ese es el paquete que se llama.

Wow información muy valiosa para todos los futuros programadores jajaj Saludos!

Podrian subir una clase en video para poder desplegar mi contrato en truffle. estoy bastante perdido en esta clase, gracias

Nos vemos en el siguiente curso Dapp

El archivo .env no debe tener ninguno nombre y el el truffle no debe contener los datos que van en el archivo

Hola, realice la practica con Ubuntu 20.04.3 LTS y para poder desplegar el contrato debi modificar en truffle-config.js la linea siguiente:

const HDWalletProvider = require('@truffle/hdwallet-provider');

por esta:

const HDWalletProvider = require('truffle-hdwallet-provider');

Con lo cual me dejo desplegar el SmartContract CrowdFunding.sol en Ropsten.

NOTA: Tambien recibia el siguiente error al tratar de instalar la dependencia de hdwallet-provider:

npm install truffle-hdwallet-provider --save
npm ERR! code ENOENT
npm ERR! syscall spawn git
npm ERR! path git
npm ERR! errno -2
npm ERR! enoent An unknown git error occurred
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent 

npm ERR! A complete log of this run can be found in:
npm ERR!     /home/jrsalas75/.npm/_logs/2022-01-22T16_28_19_163Z-debug-0.log

Pero aun sin poder ejecutar esta installacion de dependencia probando inclusive diferentes argumentos de npm, pude desplegar el contrato solamente cambiando la linea que les comparto, lo cual me indica que pareciera ser un paso no tan necesario.

Después de un rato buscando cómo resolver problemas y entendiendo, ya quedó.
En la captura también sale el que desplegué por REMIX. Todo muy cool.
.

Por si a alguien mas le tiraba error en los parametros de HDWalletProvider, me funciono de esta manera

provider: () =>
        new HDWalletProvider({
          mnemonic: {
            phrase: env.MNEMONIC
          },
          providerOrUrl: `https://ropsten.infura.io/v3/${env.PROJECT_ID}`,
          numberOfAddresses: 1,
          shareNonce: true,
      }),

Infura

The world’s most powerful blockchain development suite
infura.io