Emisión de Registros
msg! y sol_log_data escriben en registros de transacciones consumidos por exploradores, indexadores y simulaciones. Úselos con moderación: cada registro consume unidades de cómputo.
Receta
solana_program::msg!("vault deposit {}", amount);Cuándo usar esto:
- Para depurar instrucciones fallidas en devnet.
- Para correlacionar pasos en la cadena con análisis fuera de la cadena.
- Instrumentación temporal durante correcciones de auditoría.
Ejemplo Funcional
pub fn deposit(amount: u64) -> ProgramResult {
solana_program::msg!("deposit_start amount={}", amount);
if amount == 0 {
solana_program::msg!("deposit_reject zero");
return Err(ProgramError::InvalidArgument);
}
solana_program::msg!("deposit_ok");
Ok(())
}Lo que esto demuestra:
- Los tokens de prefijo estructurados ayudan a buscar en los registros.
- El registro de la ruta de rechazo antes del retorno de error.
- Elimine o limite los registros detallados antes de mainnet.
Análisis Profundo
Costo de CU
Los registros escalan con la longitud y el número de cadenas.
Alternativas a los Registros
- Errores personalizados para usuarios
- Eventos de Anchor para indexadores
Notas de Rust
solana_program::log::sol_log_data(&[b"evt", &amount.to_le_bytes()]);Trampas Comunes
- Registros en bucles - Explosión de CU. Solución: Registrar solo un resumen.
- Datos sensibles - Los registros son públicos. Solución: Nunca registre secretos o PII completos.
- Confiar en los registros para el flujo de control - Los registros no son entradas de consenso. Solución: El estado debe codificar la verdad.
- Pánicos de formato - El formato incorrecto es un error de desarrollo. Solución: Use literales simples en producción.
- Ruido en producción - Difícil de indexar. Solución: Prefiera eventos con esquema.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Anchor emit! | Eventos estructurados | Solo nativo |
| Códigos de error personalizados | Experiencia de usuario | Depuración interna |
| Trazas de simulación fuera de la cadena | Solo desarrollo | Observabilidad en producción |
Preguntas Frecuentes
¿Dónde aparecen?
logMessages de metadatos de la transacción.
¿Longitud máxima del registro?
Limitada por las CU y los límites de la tx.
¿msg vs sol_log_data?
El último para fragmentos binarios.
¿Indexar registros?
Geyser/webhooks analizan las líneas de registro.
¿Registros con marca de función?
Común para compilaciones de lanzamiento.
¿Registros en caso de fallo?
Aún se emiten antes del punto de fallo.
¿Múltiples programas?
Todos los registros se fusionan en orden.
¿La simulación muestra registros?
Sí, con simulateTransaction.
¿Cambios en Agave 4.1.1?
Reperfilar las CU si se registran mucho.
¿Reemplazar con eventos?
Para un diseño centrado en el indexador, sí.
¿Macro solo para depuración?
Envolver msg! en cfg.
¿Registrar el bump de PDA?
OK a corto plazo para depuración.
Relacionado
- Registros con msg - Registro consciente de CU
- Emisión de Eventos - Eventos estructurados
- Depuración de Transacciones Fallidas - Lectura de la salida
Versiones de Stack: Esta página fue escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0, y LiteSVM 0.6.x.