Ejercicio: escritura de un contrato de token ERC20

Completado

Ahora que tenemos un proyecto básico configurado, vamos a crear un contrato de token mediante el estándar de token ERC20 de OpenZeppelin.

Creación del contrato de token

Vamos a crear un contrato de token para recompensar a los extractores por crear bloques en la cadena de bloques.

Para empezar, abra el proyecto Token20 en Visual Studio Code. Cuando el proyecto esté abierto, en el explorador, haga clic con el botón derecho en la carpeta contracts y seleccione Nuevo archivo. Guarde el nombre del archivo como ERC20MinerReward.sol. Copie el código siguiente en ese contrato:

// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract ERC20MinerReward is ERC20 {

    event LogNewAlert(string description, address indexed _from, uint256 _n);

    constructor() public ERC20("MinerReward", "MRW") {}

    function _reward() public {
        _mint(block.coinbase, 20);
        emit LogNewAlert('_rewarded', block.coinbase, block.number);
    }
}

Comprendiendo el código

Ahora, vamos a examinar las partes del contrato.

En primer lugar, se importa el contrato de OpenZeppelin que se quiere usar después de la directiva pragma. La cadena import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; permite que el contrato busque la definición de contrato ERC20 que se usará en el contrato.

Después, se define un evento denominado LogNewAlert, que se emitirá o al que se llamará más adelante en el contrato.

El constructor define un nuevo token ERC20 denominado MinerReward mediante el símbolo MRW. Cuando se crea un contrato, se genera este nuevo token.

Cuando se llama a la función reward, el extractor del bloque actual, block.coinbase, recibe 20 tokens MRW por extraer este bloque y se emite un evento.

Compilación del contrato

Después de guardar el archivo de contrato, está listo para compilarlo. Usaremos la CLI de Ganache como cadena de bloques personal para el desarrollo. Para ejecutar la compilación, recurriremos a Truffle.

  1. Abra el archivo truffle-config.js y busque la línea solc.
  2. En la sección solc, asegúrese de que el valor de versión sea 0.8.11 o superior. Este número de versión es necesario porque los contratos de OpenZeppelin especifican la directiva pragma como pragma solidity ^0.8.0;.
  3. Guarde el archivo.
  4. En Visual Studio Code, seleccione Terminal>Nuevo terminal para abrir una ventana de terminal.
  5. En el terminal, escriba ganache-cli para iniciar la CLI de Ganache. Se genera para las pruebas la información de aproximadamente 10 cuentas, seguida de las claves privadas de las cuentas y otros metadatos del servidor de desarrollo. La última línea indica que ganache-cli está escuchando en 127.0.0.1:8545, la ubicación de puerto predeterminada, que está definida en el archivo truffle-config.js.
  6. Haga clic con el botón derecho en la ventana del terminal y seleccione Nuevo terminal.
  7. En la nueva ventana del terminal, escriba truffle build.

Los mensajes del compilador similares a la siguiente salida deben aparecer en la ventana de terminal:

$ truffle build
No build configuration found. Preparing to compile contracts.

Compiling your contracts...
===========================
√ Fetching solc version list from solc-bin. Attempt #1
√ Downloading compiler. Attempt #1.
> Compiling @openzeppelin\contracts\token\ERC20\ERC20.sol
> Compiling @openzeppelin\contracts\token\ERC20\IERC20.sol
> Compiling @openzeppelin\contracts\token\ERC20\extensions\IERC20Metadata.sol
> Compiling @openzeppelin\contracts\utils\Context.sol
> Compiling .\contracts\ERC20MinerReward.sol
> Compiling .\contracts\Migrations.sol
> Artifacts written to /Users/username/Projects/Token20/build/contracts
> Compiled successfully using:
   - solc: 0.8.11+commit.d7f03943.Emscripten.clang

Observe que, además de los contratos definidos en la carpeta contracts, también se compilan los contratos incluidos en openzeppelin/contracts. Asegúrese de que la compilación haya finalizado correctamente antes de continuar.

Encapsulado

Este ejemplo es una implementación básica y directa de un token ERC20. Puede ver lo fácil que es escribir sus propios contratos de token que heredan funciones y eventos de un estándar de token ERC definido.

Es importante recordar que el término token no es más que una metáfora. Hace referencia a los activos o derechos de acceso que se administran colectivamente mediante una red de equipos o de cadenas de bloques. Los tokens son un elemento importante que se debe incorporar a la red de cadenas de bloques.

Para familiarizarse con los tokens, explore los demás contratos de token que están disponibles en OpenZeppelin. Pruebe también a crear sus propios contratos de token.