Registro
El ejemplo de registro demuestra cómo registrar con el propósito de depuración.
Los registros en los contratos solo son visibles en las pruebas, o al ejecutar contratos utilizando stellar-cli
. Los registros solo se compilan en el contrato si la opción del compilador Rust debug-assertions
está habilitada.
Los registros no son un sustituto para la depuración paso a paso. Las pruebas de Rust para Soroban se pueden depurar paso a paso en tu IDE habilitado para Rust. Consulta pruebas para más detalles.
Los registros no son accesibles por dapps y otras aplicaciones. Consulta el ejemplo de eventos para saber cómo producir eventos estructurados.
Ejecutar el ejemplo
Primero, pasa por el proceso de Configuración para configurar tu entorno de desarrollo, luego clona la etiqueta v21.6.0
del repositorio soroban-examples
:
git clone -b v21.6.0 https://github.com/stellar/soroban-examples
O, salta la configuración del entorno de desarrollo y abre este ejemplo en Gitpod.
Para ejecutar las pruebas del ejemplo, navega al directorio logging
, y utiliza cargo test
.
cd logging
cargo test -- --nocapture
Deberías ver la salida:
running 1 test
Hello Symbol(Dev)
test test::test ... ok
Código
[profile.release-with-logs]
inherits = "release"
debug-assertions = true
#![no_std]
use soroban_sdk::{contractimpl, log, Env, Symbol};
#[contract]
pub struct Contract;
#[contractimpl]
impl Contract {
pub fn hello(env: Env, value: Symbol) {
log!(&env, "Hello {}", value);
}
}
Ref: https://github.com/stellar/soroban-examples/tree/v21.6.0/logging
Cómo funciona
El macro log!
registra una cadena. Todos los registros que ocurren durante la ejecución se envían a stdout en stellar-cli
y están disponibles para que las pruebas validen o impriman.
Los registros solo se envían si el contrato se construye con la opción del compilador debug-assertions
habilitada. Esto hace que sea eficiente dejarlos en el código de forma permanente, ya que una construcción release
regular los omitirá.
Los registros solo se almacenan en los entornos de Soroban que tienen el registro habilitado. Los únicos entornos de Soroban donde el registro está habilitado son en las pruebas de Rust, y en el stellar-cli
.
Abre los archivos anteriores para seguirlo.
Cargo.toml
Perfil
Los registros solo se envían si el contrato se construye con la opción del compilador debug-assertions
habilitada.
El perfil test
que se activa al ejecutar cargo test
tiene habilitadas las debug-assertions
, así que al ejecutar pruebas, los registros están habilitados por defecto.
Se añade un nuevo perfil release-with-logs
a Cargo.toml
que hereda del perfil release
, y habilita debug-assertions
. Se puede utilizar para construir un archivo .wasm
que tiene los registros habilitados.
[profile.release-with-logs]
inherits = "release"
debug-assertions = true
Para construir sin registros utiliza la opción --release
o --profile release
.
Para construir con registros utiliza la opción --profile release-with-logs
.
Usando el macro log!
El macro log!
construye una cadena a partir de la cadena de formato y una lista de argumentos. Los argumentos se sustituyen dondequiera que aparezca el valor {}
en la cadena de formato.
log!(&env, "Hello {}", value);
El registro anterior se representará como sigue si value
es un Symbol
que contiene "Dev".
Hello Symbol(Dev)
Los valores enviados actualmente son relativamente limitados. Mientras que valores primitivos como u32
, u64
, bool
, y Symbol
s se representarán claramente en la salida del registro, Bytes
, Vec
, Map
, y tipos personalizados solo representarán su número de identificador. Las capacidades de registro están en desarrollo inicial.
Pruebas
Abre el archivo logging/src/test.rs
para seguirlo.
extern crate std;
#[test]
fn test() {
let env = Env::default();
let contract_id = env.register_contract(None, Contract);
let client = ContractClient::new(&env, &contract_id);
client.hello(&symbol_short!("Dev"));
let logs = env.logs().all();
assert_eq!(logs, std::vec!["Hello Symbol(Dev)"]);
std::println!("{}", logs.join("\n"));
}
El crate std
, que contiene la biblioteca estándar de Rust, se importa para que la prueba pueda usar los macros std::vec!
y std::println!
. Dado que los contratos deben usar #![no_std]
, las pruebas en contratos deben importar manualmente std
para usar la funcionalidad estándar como imprimir en stdout.
extern crate std;
En cualquier prueba, lo primero que siempre se requiere es un Env
, que es el entorno de Soroban en el que se ejecutará el contrato.
let env = Env::default();
El contrato se registra con el entorno utilizando el tipo de contrato.
let contract_id = env.register_contract(None, HelloContract);
Todas las funciones públicas dentro de un bloque impl
que está anotado con el atributo #[contractimpl]
tienen una función correspondiente generada en un tipo de cliente generado. El tipo de cliente se nombrará igual que el tipo de contrato con Client
añadido. Por ejemplo, en nuestro contrato, el tipo de contrato es HelloContract
, y el cliente se llama HelloContractClient
.
let client = HelloContractClient::new(&env, &contract_id);
let words = client.hello(&symbol_short!("Dev"));
Los registros están disponibles en las pruebas a través del entorno.
let logs = env.logs().all();
Se pueden validar como cualquier otro valor.
assert_eq!(logs, std::vec!["Hello Symbol(Dev)"]);
Se pueden imprimir en stdout.
std::println!("{}", logs.join("\n"));
Construir el contrato
Para construir el contrato, utiliza el comando stellar contract build
.
Sin registros
Para construir el contrato sin registros, utiliza la opción --release
.
stellar contract build
Un archivo .wasm
debería ser enviado al directorio target
, en el subdirectorio release
:
target/wasm32-unknown-unknown/release/soroban_logging_contract.wasm
Con registros
Para construir el contrato con registros, utiliza la opción --profile release-with-logs
.
stellar contract build --profile release-with-logs
Un archivo .wasm
debería ser enviado al directorio target
, en el subdirectorio release-with-logs
:
target/wasm32-unknown-unknown/release-with-logs/soroban_logging_contract.wasm
Ejecutar el contrato
Si tienes stellar-cli
instalado, puedes invocar funciones del contrato usándolo. Especifica la opción -v
para habilitar registros detallados.
- macOS/Linux
- Windows (PowerShell)
stellar -v contract invoke \
--wasm target/wasm32-unknown-unknown/release-with-logs/soroban_logging_contract.wasm \
--id 1 \
-- \
hello \
--value friend
stellar -v contract invoke `
--wasm target/wasm32-unknown-unknown/release-with-logs/soroban_logging_contract.wasm `
--id 1 `
-- `
hello `
--value friend
La salida debe incluir la siguiente línea.
stellar_cli::log::event::contract_log: log="Hello Symbol(me)"