Saltar al contenido
0%

¿Qué es el console log de Solidity?

Escrito por Turja

Publicado el 4 de octubre de 20227 min de lectura

La depuración es un paso vital y recurrente en aprender a escribir contratos inteligentes en Solidity, corregir vulnerabilidades y solucionar errores problemáticos. Los dos tipos de errores de desarrollo típicos en contratos inteligentes son los errores de tiempo de ejecución y los errores de lógica.

Aprovechar herramientas que faciliten la comprensión de los desarrolladores permite una experiencia de desarrollo más sencilla, especialmente cuando se trata de corregir errores en los programas. De forma similar al desarrollo en JavaScript, la función console.log() se usa para retornar un mensaje de salida a la consola web, lo cual ayuda en el proceso de depuración.

El console.log() acepta un parámetro (por ejemplo, un array, un objeto o un mensaje) e imprime el valor en la consola web para que los desarrolladores lo evalúen. Este método permite a los desarrolladores identificar el problema que pueda ocurrir al describir la salida del código paso a paso.

En este artículo, mostraremos la forma principal de depurar Solidity, revisaremos herramientas de depuración en Hardhat, Foundry, Truffle y Brownie, y luego daremos algunos consejos de depuración.

¿Qué es el console log de Solidity?

Registrar información en la consola es una herramienta común usada para depurar código, y console.log() es una función de una librería de contratos provista por Hardhat. El registro de información en la consola ayuda a los desarrolladores a entender y solucionar problemas en su programa. En Solidity, esto se conoce como un evento.

Ethereum ofrece una funcionalidad de registro que almacena datos en la estructura de datos de logs de la transacción en la blockchain. Los eventos de Solidity brindan una abstracción de esta funcionalidad, ya que le permiten al desarrollador emitir datos en la blockchain.

Debido a que los logs permanecen intactos junto con la dirección del contrato en la blockchain y quedan accesibles junto con el bloque, los desarrolladores de Solidity pueden consultar y referenciar la blockchain para obtener los datos específicos de una transacción.

Casos de uso de los eventos de Solidity

Los eventos de Solidity se pueden usar de varias formas, incluyendo pruebas de contratos inteligentes, indexación de datos de transacciones, referencia para desarrollo frontend y más. Lo más común es que los desarrolladores usen eventos en tres casos de uso:

  1. En contratos inteligentes, para retornar valores que se puedan usar en el frontend
  2. Como disparador asíncrono para que el contrato inteligente emita un evento que active una acción en el frontend
  3. Como forma más económica de almacenamiento, ya que los datos se guardan en el log de la transacción.

Dentro de los eventos, los parámetros se pueden especificar como indexados o no indexados. Los datos de la transacción dentro de un log se verán codificados si el contrato está verificado; de lo contrario, se mostrarán como no indexados o con hash.

En otros casos, si el proceso de desarrollo tiene lugar en entornos que lo soportan, como Hardhat, se puede usar la función console.log() además de los eventos, y esto funcionaría de forma similar al desarrollo en JavaScript.

¿Por qué son importantes los console logs?

Los console logs son una herramienta necesaria para los desarrolladores en el proceso de depuración de contratos inteligentes. El console log es una combinación del entorno de pruebas del programa (console) y una función usada para emitir datos (log()).

En esencia, el console log entrega una salida del programa en un entorno de pruebas que se puede aprovechar en el proceso de desarrollo y depuración. Si surge un error o problema en el programa, el console log se usaría como un primer paso para inspeccionar el código e identificar la causa raíz de un bug.

Al escribir contratos inteligentes en Solidity, los console logs sirven igualmente como un paso efectivo en el proceso de depuración para extraer el código y comprender la lógica.

¿Cómo funciona el registro (logging) en Solidity?

El registro, también conocido como protocolo de observación de eventos o evento, produce señales generadas por transacciones y bloques, que se usan para proveer información que no se puede obtener del contrato inteligente.

Solidity tiene el concepto de "evento". Los eventos se pueden emitir en funciones de contratos inteligentes y pueden tener de 0 a 4 topics, que se indexan para una búsqueda rápida. En Solidity, se usa la palabra clave "emit" para emitir eventos. Esto se traduce en uno de los opcodes del EVM, LOG0, LOG1, ..., LOG4.

Debido a que los datos del contrato viven en el trie de States y los datos de eventos se almacenan en el trie de Transaction Receipts, los contratos inteligentes no pueden leer datos de eventos.

Los datos de la transacción o las entradas de log constan de:

  • Address: la dirección del contrato
  • Topic: los valores indexados del evento
  • Data: los valores codificados en ABI o no indexados del evento

Herramientas de depuración de Solidity en Hardhat

Hardhat es un entorno de desarrollo de Ethereum enfocado en permitir a los desarrolladores desarrollar localmente contratos inteligentes en Solidity y dotarlos de herramientas esenciales de depuración de Solidity.

Hardhat ofrece un conjunto de herramientas para probar, compilar, desplegar y depurar apps. Aprovechando la Hardhat Network, los desarrolladores pueden crear, compilar y desplegar contratos inteligentes desde su máquina local a través de la interfaz de Solidity.

1. Console.log

Dentro de la Hardhat Network, la función console.log() se puede usar como una herramienta confiable para emitir mensajes de registro y extraer detalles directamente del código Solidity. La Hardhat Network está diseñada para proveer una inspección de ejecución flexible y completa, sin importar si hay fallas en la transacción.

Cómo imprimir en los console logs de Solidity

Los console logs de Solidity se pueden imprimir con una estructura similar a la de JavaScript. Una vez completada la importación, se puede usar la función console.log() dentro de la función para imprimir una salida específica según el contexto del contrato inteligente. El siguiente código describe el proceso.

Primero, importa hardhat/console.sol en el contrato inteligente

Luego, agrega la función console.log() dentro de una función específica del contrato inteligente:

Nota: La herramienta de console log de Hardhat solo se puede usar una vez que hardhat/console.sol esté importado en el contrato inteligente.

2. Stack traces de Solidity

La herramienta de stack trace de Hardhat es una combinación de JavaScript y Solidity que genera un reporte cuando ocurre una transacción o falla una llamada. Este reporte automático de errores le brinda al desarrollador información valiosa para evaluar y depurar su contrato inteligente.

3. Errores explícitos

Hardhat ofrece una variedad de posibles errores que pueden ayudar a los desarrolladores a simplificar el proceso de depuración, incluyendo:

  • general
  • red (network)
  • definición de tareas
  • argumentos
  • resolución de dependencias
  • tareas integradas
  • artifacts
  • plugins
  • internal
  • nombres de fuentes
  • nombres de contratos

Consejo sobre console log en Solidity: usa eventos y funciones para mejorar la depuración

Los eventos se pueden usar para emitir datos desde los logs de transacción hacia la consola, tanto en las etapas de depuración como de producción. Un evento sirve como marcador para indicar si un proceso tuvo lugar. Además, los eventos indicarán si ha ocurrido un problema en pasos particulares. Este proceso es similar a la palabra clave "require" en Solidity, que verifica si una condición es verdadera y permite que el código continúe solo cuando se cumple dicha condición.

Para empezar a usar eventos y funciones que mejoren la depuración, crea un evento correctamente definido y emítelo dentro de la función. Estos dos pasos aseguran que el evento ocurra cada vez que se llame a la función.

Herramientas adicionales de console log en Solidity

Si bien Hardhat es la herramienta de desarrollo de Solidity estándar en la industria para construir, probar y depurar contratos inteligentes, existen algunas herramientas alternativas para solucionar problemas en código Solidity, incluyendo Foundry, Truffle y Brownie.

1. Foundry

Foundry ofrece un conjunto de herramientas de desarrollo de contratos inteligentes de Ethereum que permite gestionar dependencias, compilar contratos inteligentes, desplegarlos, probarlos e interactuar con ellos en la cadena.

El conjunto de herramientas de Foundry se puede integrar con Hardhat para aprovechar su función console.log() en el proceso de depuración. Los desarrolladores pueden llamar a la función con hasta 4 parámetros, incluyendo uint, string, bool y address.

Forge

Forge es una herramienta de línea de comandos (CLI) integrada con Foundry para probar, construir y desplegar contratos inteligentes. Este framework de pruebas permite a los desarrolladores crear pruebas en Solidity usando JavaScript o TypeScript, además de habilitar numerosas funciones para el proceso de depuración.

El comando test de forge automatiza las pruebas de Solidity y además provee un resumen de los resultados, incluyendo logs y stack traces. El comando debug de forge es también un depurador interactivo que revisa un solo contrato inteligente como si fuera un script, para identificar errores en el programa.

Cast

Cast es una herramienta de interfaz de línea de comandos (CLI) que interactúa con llamadas RPC de Ethereum. Esto incluye llamadas a contratos inteligentes, transacciones o la obtención de datos de la cadena a través de la línea de comandos.

Anvil

Anvil es un nodo de testnet local integrado con Foundry que permite desplegar y probar contratos inteligentes desde el frontend o mediante interacciones vía RPC (Remote Procedure Calls) con redes compatibles con el EVM (Ethereum Virtual Machine).

2. Truffle

Truffle ofrece tres herramientas para desarrolladores de contratos inteligentes en Ethereum: un entorno de desarrollo, un framework de pruebas y un pipeline de activos para blockchains. El ecosistema integral de Truffle brinda a los desarrolladores diversas herramientas para crear, probar y depurar aplicaciones descentralizadas de extremo a extremo.

Los conjuntos de herramientas que ofrece Truffle son:

  • Kit de contratos inteligentes: compilación, linking, despliegue, etc.
  • Depuración: breakpoints, análisis de variables, ejecución paso a paso, pruebas automatizadas de contratos
  • Gestión: frameworks de red, paquetes y migraciones

Más información: https://trufflesuite.com/docs/truffle/

3. Brownie

Brownie es un framework de desarrollo y pruebas basado en Python para contratos inteligentes en Ethereum, con soporte para Solidity y Vyper, y está dividido en 4 categorías: pruebas, depuración, interacción y despliegue. Cada etapa apoya a los desarrolladores en la creación de programas flexibles.

Los desarrolladores pueden acceder a diversas herramientas de depuración para recopilar información detallada sobre fallas en las transacciones, y para localizar, reproducir y solucionar errores de Solidity.

  • TransactionReceipt.revert_ms: obtiene un mensaje directo que explica la falla de la transacción
  • TransactionReceipt.error(): localiza la causa raíz y la sección del contrato inteligente que causó una transacción fallida
  • TransactionReceipt.events: muestra los eventos que se emitieron en transacciones revertidas
  • TransactionReceipt.trace: muestra una lista de diccionarios que contienen la información de la transacción
  • TransactionReceipt.call_trace(): muestra un mapa completo (trace) de los pasos de la transacción

Los desarrolladores también pueden usar pytest para pruebas unitarias de contratos inteligentes, y luego revisar el reporte de stack trace que se genera.

Más información: https://eth-brownie.readthedocs.io/en/v1.2.1/index.html

Aprende sobre el console log de Solidity con Alchemy University

Este artículo te ha presentado las herramientas de registro y depuración más populares para desarrollar contratos inteligentes en Solidity. Si estás aprendiendo Solidity, elegir las mejores herramientas para depurar contratos inteligentes es esencial para resolver los problemas que enfrentes en el desarrollo con Solidity.

Para comenzar o acelerar tu formación en desarrollo con Solidity, explora el bootcamp de desarrollo en Solidity gratuito de 7 semanas de Alchemy University, que originalmente era un curso de certificación de $3,000 dictado por ChainShot, ¡y ahora está totalmente integrado con Alchemy! Si eres nuevo en el desarrollo en general, el curso intensivo de JavaScript de 3 semanas de Alchemy es un excelente requisito previo antes de comenzar un bootcamp de Ethereum.

Background gradient

Construye magia blockchain

Alchemy combina los productos y herramientas de desarrollo Web3 más potentes con recursos, comunidad y un soporte legendario.