Foundry: Claves y uso

Foundry: uso y puntos clave

Foundry_un_framework_para_Solidity._Claves_y_uso_por_Juan_fuente

Foundry: Un framework para Solidity. Claves y guía de uso.

Foundry es un completo conjunto de herramientas para el desarrollo de contratos inteligentes en Ethereum, escrito en Rust. Ofrece una alternativa eficiente y robusta a otros frameworks como Hardhat, permitiendo escribir pruebas directamente en Solidity y proporcionando herramientas avanzadas para compilación, pruebas, depuración y despliegue. 

Uno de sus puntos fuerte es la facilidad que otorga para el desarrollo de test y la velocidad con que estos se ejecutan.

Foundry: Componentes principales

  • Forge: Herramienta para compilar, probar y desplegar contratos inteligentes.
  • Cast: CLI para realizar llamadas RPC en Ethereum, permitiendo interactuar con contratos desplegados y enviar transacciones.
  • Anvil: Nodo de prueba local que simula una red Ethereum para pruebas y desarrollo.
  • Chisel: REPL avanzado para Solidity, útil para probar fragmentos de código en una red local o bifurcada.

Instalación:

Para instalar Foundry, sigue estos pasos:

1. Ejecuta el siguiente comando en tu terminal para descargar e instalar Foundryup:

curl -L https://foundry.paradigm.xyz | bash

2. Una vez instalado, ejecutamos:

foundryup

3. Esto instalará las herramientas Forge, Cast, Anvil y Chisel en el sistema.

4. Verificar la instalación ejecutando:

forge –version

1. Componentes de Foundry: Forge

Forge es una herramienta de línea de comandos que permite compilar, probar, depurar y desplegar contratos inteligentes.

Inicializar un proyecto: 

  • Inicializamos el proyecto:
      forge init nombre_del_proyecto

              cd nombre_del_proyecto

  • Se generará una estructura de proyecto con las siguientes carpetas y archivos:
    • src/: Directorio para contratos inteligentes.
    • test/: Directorio para los test en Solidity.
    • script/: Archivos de scripting en Solidity, como el despliegue.
    • lib/: Dependencias del proyecto.
    • foundry.toml: Archivo de configuración del proyecto.

Compilar contratos: Para compilar los contratos en el proyecto, se utiliza:

forge build

Este comando compilará todos los contratos en el directorio src/ y generará los artefactos correspondientes en el directorio out/.

Ejecutar pruebas: Forge permite escribir pruebas directamente en Solidity. Para ejecutarlas:

  • Ejecutar todas las pruebas:

              forge test

  • Ejecutar test de un contrato específico:

              forge test -mc NombreContrato

  • Ejecutar un test específico dentro de un contrato

              forge test -mc NombreContrato -mt NombreTest

  • Ajustar el nivel de verbosidad para obtener más detalles:

      forge test -mc NombreContrato -mt NombreTest -vvvvv

El nivel de verbosidad se controla con la opción -v, cuantas más letras «v»  más aumenta el detalle de la salida.

Desplegar contratos: Se pueden escribir scripts de despliegue en Solidity y ejecutarlos.

forge script script/nombre_del_script.s.sol

Además, Forge ofrece el comando forge create para desplegar contratos directamente desde la línea de comandos:

forge create –rpc-url –private-key src/NombreContrato.sol:NombreContrato

Es necesario asegurarse de reemplazar con la URL de tu nodo RPC y con la clave privada de la cuenta que realizará el despliegue.

Consideraciones adicionales:

  • Gestión de dependencias: Para instalar dependencias, utilizamos forge install
  • Actualización de dependencias: Para actualizar dependencias, utilizamos forge update
  • Limpieza del proyecto: Para eliminar artefactos de compilación y cachés, utilizamos forge clean

Para una referencia completa de los comandos disponibles y sus opciones, es posible consultar la documentación oficial de Foundry:

2. Componentes de Foundry: Cast

Cast es una herramienta versátil para interactuar con contratos inteligentes desde la línea de comandos.

Como ejemplos, estás son algunas consultas usando Cast:

  • Consultar el número de bloque actual:
    cast block-number –rpc-url https://mainnet.infura.io/v3/tu_proyecto
  • Consultar el balance de una dirección:
    cast balance direccion_wallet/contrato –rpc-url https://mainnet.infura.io/v3/tu_proyecto
  • Enviar una transacción:
    cast send direccion_contrato «funcion(uint256)» valor –rpc-url https://mainnet.infura.io/v3/tu_proyecto –private-key tu_clave_privada

Para más comandos y opciones, se puede consultar la documentación oficial.

3. Componentes de Foundry: Anvil

Anvil es un nodo local rápido para el desarrollo en Ethereum, similar a Hardhat Network o Ganache. Es ideal para probar y depurar contratos inteligentes en un entorno controlado.

Iniciar Anvil:

anvil

Esto iniciará un nodo local en http://127.0.0.1:8545/ con cuentas preconfiguradas y fondos para pruebas.

Podemos utilizar Anvil junto con Forge para pruebas que requieren un entorno blockchain simulado.

Conectar Forge a Anvil:

En el proyecto de Foundry, nos aseguramos de que el archivo foundry.toml esté configurado para apuntar a la instancia de Anvil:

[profile.default]

rpc_url = «http://127.0.0.1:8545»

Desplegar un contrato en Anvil:
Supongamos que tenemos un contrato llamado SimpleStorage.sol. Escribimos un script de despliegue en Solidity (DeploySimpleStorage.s.sol) y lo ejecutamos con Forge:

forge script script/DeploySimpleStorage.s.sol –broadcast –rpc-url http://127.0.0.1:8545

Esto desplegará el contrato en la instancia local de Anvil.

Interactuar con un contrato en Anvil:

  • Obtener el balance de una dirección:
    cast balance 0xTuCuenta –rpc-url http://127.0.0.1:8545
  • Llamar a una función de un contrato:
    Supongamos que el contrato tiene una función getValue(). Podemos llamarla así:
    cast call 0xdirecciónContracto»getValue()» –rpc-url http://127.0.0.1:8545
  • Enviar una transacción para cambiar el estado:
    Si el contrato tiene una función setValue(uint256 newValue), podemos ejecutarla con:
    cast send 0xdireccionContracto «setValue(uint256)» 42 –private-key 0xtuPrivateKey –rpc-url http://127.0.0.1:8545

Para una lista completa de comandos y opciones de Anvil, podemos consultar la documentación oficial.

4. Componentes de Foundry: Chisel

Chisel es un REPL (Read-Eval-Print Loop) para Solidity que permite ejecutar fragmentos de código en tiempo real, lo que es útil para pruebas rápidas y exploración de código.

Iniciar Chisel:
chisel

Dentro de Chisel, podemos declarar variables, ejecutar funciones y obtener retroalimentación inmediata, lo que es útil para pruebas rápidas y exploración de código.

Ejecutar código Solidity en tiempo real:

Dentro de la sesión de Chisel, podríamos declarar variables y ejecutar funciones:

> uint256 a = 10;

> uint256 b = 20;

> a + b;

Chisel evaluará y mostrará el resultado de cada operación.


Para más detalles sobre Chisel, tenemos la sección correspondiente en la documentación de Foundry.

Prueba práctica

Si quisiéramos crear un smart contrat de prueba:

Dentro de la carpeta src/, creamos un archivo llamado MiContrato.sol con el siguiente contenido:

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.26;

contract MiContrato {

    uint256 public numero;

    function establecerNumero(uint256 nuevoNumero) public {

        numero = nuevoNumero;

    }

    function incrementar() public {

        numero++;

    }

}

 

Compilación del contrato:

Para compilar el contrato, ejecutamos:

forge build

Esto generará los artefactos de compilación en la carpeta out/.

Escritura de pruebas:

Creamos un archivo en la carpeta test/ llamado MiContrato.t.sol con el siguiente contenido:

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.26;

import «forge-std/Test.sol»;

import «../src/MiContrato.sol»;

 

contract MiContratoTest is Test {

    MiContrato public miContrato;

 

    function setUp() public {

        miContrato = new MiContrato();

        miContrato.establecerNumero(0);

    }

    function testEstablecerNumero() public {

        miContrato.establecerNumero(42);

        assertEq(miContrato.numero(), 42);

    }

    function testIncrementar() public {

        miContrato.establecerNumero(1);

        miContrato.incrementar();

        assertEq(miContrato.numero(), 2);

    }

}

Para ejecutar las pruebas, utilizamos:

forge test

Despliegue del contrato:

Para desplegar el contrato en una red, podemos utilizar Forge junto con una URL RPC y una clave privada:

forge create –rpc-url TU_RPC_URL –private-key TU_CLAVE_PRIVADA src/MiContrato.sol:MiContrato

 

Debemos asegurarnos  de reemplazar TU_RPC_URL y TU_CLAVE_PRIVADA con las credenciales correspondientes.

Interacción con el contrato:

Una vez desplegado, es posible  interactuar con el contrato utilizando Cast:

cast send DIRECCION_CONTRATO «establecerNumero(uint256)» 10 –rpc-url TU_RPC_URL –private-key TU_CLAVE_PRIVADA

Esto establecerá el valor de numero a 10 en el contrato desplegado.

Conclusión

Foundry es una potente y flexible herramienta para el desarrollo de contratos inteligentes en Solidity. Su conjunto de herramientas incluye:

Forge, que facilita la construcción, prueba y despliegue de contratos.

Anvil, que permite simular una red local de Ethereum para pruebas.

Cast, que facilita la interacción con contratos desde la línea de comandos.

Chisel, que ofrece un entorno interactivo para evaluar código Solidity en tiempo real.

 

Puedes ver este artículo también en linkedin pulsando aquí.

 ¿Crees que le sacas todo el partido a Foundry? ¡Será interesante leerte en los comentarios!