¿Cómo puedo depurar un contrato inteligente?

Al desarrollar mi contrato inteligente, ¿cómo puedo depurarlo? ¿Existen herramientas de depuración, prueba o simuladores que pueda usar para examinar mi código?

Hardhat tiene seguimientos de pila y console.log

Respuestas (6)

  1. El IDE de Remix tiene un gran simulador y depurador bloque por bloque integrado.
  2. Ganache permite pruebas de contrato rápidas sin la molestia de ejecutar un nodo.
  3. Una vez que el contrato está activo, el explorador de bloques etherscan.io se puede usar para ver el estado interno y los registros de ejecución de EVM.
Mix IDE ha sido descontinuado...
@CodingYourLife actualizó la respuesta con los últimos recursos

Todas esas son buenas herramientas, pero he descubierto que el registro de eventos es un método mucho más fácil para la depuración, además, si está haciendo algo con dinero, desea mantener un registro de lo que sucedió.

En Solidity, inicia sesión con Eventos . Luego puede escuchar todos los eventos en su contrato con la devolución de llamada web3.js "allEvents"

Así es como depuro mis (actualmente) 780 líneas de solidez.

¿Podría explicar un poco más cómo realiza la depuración con eventos? ¿Utiliza una consola de javascript para conectarse con el contrato manualmente y observar eventos o está utilizando un script de alguna manera para automatizar el proceso? Esto suena como una buena técnica y estoy tratando de aplicarlo mediante los resultados de eventos de console.log en pruebas de unidad de trufa, ¡pero aún no he logrado que funcione!
Estoy usando scripts de nodejs, que funcionan bien con web3.js. Aquí hay una versión pirateada de ether pudding que incluye registro (pero de un contrato solo por ahora), vea las pruebas unitarias para ver cómo funciona. github.com/barkthins/éter-pudding
Pero cuando la ejecución lanza ningún evento se registra en Solidity
buen punto. Intento evitar las excepciones en la medida de lo posible porque se comen toda la gasolina, entre otras cosas. Me encantaría que alguien agregara una respuesta sobre cómo depurar una excepción a posteriori. AFAICT tienes que examinar los registros de un nodo. Espero que alguien esté trabajando en una función de excepción 'suave' en la máquina virtual, la 'excepción dura' es básicamente el equivalente a un BSOD...
@PaulS Y si no se escriben eventos, incluso en el caso más simple, como volcar variables sin condición previa, ¿cómo puedo saber qué está mal? (y en un caso donde no se registra ninguna excepción)
@PaulS Cuando se enfrenta a un error en algunas funciones con 100 líneas de código, no se producirán eventos.

para depurar un contrato, puede usar el navegador solidity

el depurador le brinda la capacidad de depurar cualquier transacción (creación o llamada) paso a paso y visualizar la memoria/espacio de almacenamiento. le ayuda a rastrear el costo del gas por código de operación y el gas restante después de cada paso.

Para depurar transacciones, hay dos formas de hacerlo:

1-utilizando un número de bloque y un índice de transacción.ingrese la descripción de la imagen aquí

2-utilizando un hash de transacción.

ingrese la descripción de la imagen aquí

Al cargar la transacción con éxito, se mostrarán los campos hash, from y to. A continuación, se carga el seguimiento de máquina virtual.ingrese la descripción de la imagen aquí

El depurador en sí contiene varios controles que permiten pasar por encima de la traza y ver el estado actual de un paso seleccionado.

Deslizador y acción de paso:

El control deslizante permite pasar rápidamente de un estado a otro. Las acciones de paso son:

Paso hacia atrás Paso sobre Atrás Paso sobre adelante Paso hacia adelante Saltar Siguiente llamada (esto seleccionará el siguiente estado que se refiere a cambios de contexto - CALL, CALLCODE, DELEGATECALL, CREATE) Visor de estado:

El panel superior derecho contiene información básica sobre el paso actual:

VMTraceStep : el índice en la traza del paso actual. Paso Agregar memoria Gas: gas utilizado por este paso Gas restante: gas restante Dirección cargada: el código actual cargado, se refiere al código de ejecución. Los otros 6 paneles describen el estado actual seleccionado:

Lista de instrucciones : lista de todas las instrucciones que definen el código de ejecución actual. Pila Almacenamiento Cambios Memoria Llamada Datos$ Pila de llamadas

puntos de interrupción en remix Se pueden agregar y eliminar puntos de interrupción haciendo clic en el margen izquierdo de la primera línea de código. Puede agregar tantos puntos de interrupción como desee.ingrese la descripción de la imagen aquí

Weh intento depurar una transacción, copiar el hash de la transacción y hacer clic en el start debuggingbotón no hace nada excepto escribir 0xc09ff6fb32dd6ef66f5691367c11c762c8f730aadeab065d57f8137cd3746bfc is not a contract invokation or contract creationen el registro.

Puede usar truffle debugel comando: http://truffleframework.com/blog/anounce-full-portable-solidity-debugger

Es compatible con:

  • Código paso a paso (sobre, dentro, fuera, siguiente, instrucción, etc.)
  • Ubicación del código actual, incluida la dirección del contrato vigente
  • puntos de ruptura
  • Ver expresiones
  • Inspección de variables (pila, memoria y almacenamiento)
  • Evaluación de expresiones personalizadas utilizando variables de solidez

Para depurar las pruebas de Truffle Javascript en Visual Studio Code, esta respuesta funcionó para mí: https://ethereum.stackexchange.com/a/41096/3708

La última versión de truffle tiene un depurador incorporado que se puede usar para depurar el estado de una transacción fallida.

$ truffle debug <transaction-id>

donde <transaction-id>está el id de la transacción con error,

una vez que se inicia el depurador, siga las instrucciones para recorrer e imprimir el estado variable, etc.

Obtenga más información aquí: https://www.trufflesuite.com/blog/annunciando-full-portable-solidity-debugger