Saltar al contenido principal
Version: 4.x

Debugging del Contrato

Actualmente existen tres maneras de debuggear tu contrato ink!:

  • Puedes escribir test utilizando uno de los mecanismos descritos en la página Testing del Contrato.
  • Puedes interactuar con tu contrato via UI o línea de comandos. Esto está descrito en la página Ejecute su Contrato.
  • Puedes imprimir declaraciones de la depuración en su contrato. Estas apareceran en el nodo de Substrate stdout. Esto está descrito en esta página.

¿Cómo imprimo algo en la consola desde el runtime?

Puedes elegir entre estos dos macros:

Tienes que hacer tres cosas para poder mostrar en la consola los mensajes de debug:

  1. Permitir la feature pallet-contracts/unstable-interface en el runtime.
    Para substrate-contracts-node esto esta hecho por defecto aquí.

  2. Permitir la feature ink-debug para el crate ink_env.
    cargo-contract hace esto automaticamente para ti (para versiones >= 0.13.0), excepto si compilas un contrato en modo --release.

  3. Establecer el nivel de log de su nodo en runtime::contracts=debug.
    Por ejemplo, para que aparezcan solo los errores y el output del debug en el substrate-contracts-node:

substrate-contracts-node -lerror,runtime::contracts=debug

Ejemplo

El siguiente código muestra cómo imprimir declaraciones de depuración desde un mensaje o un constructor.

#[ink(constructor)]
fn new() -> Self {
ink::env::debug_println!("created new instance at {}", Self::env().block_number());
Self { }
}

#[ink(message)]
fn print(&self) {
let caller = self.env().caller();
let message = ink_prelude::format!("got a call from {:?}", caller);
ink::env::debug_println!(&message);
}
note

El debug output no se imprime para transaciones!

Solo se imprime para llamadas RPC o tests off-chain.