Mollusk
Mollusk SVM es un ligero arnés de Rust para ejecutar instrucciones individuales contra programas BPF compilados. Úsalo cuando desees pruebas a nivel de instrucción sin la API de transacciones completa de LiteSVM o un validador en ejecución.
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
use mollusk_svm::Mollusk;
use solana_sdk::instruction::{AccountMeta, Instruction};
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let result = mollusk.process_instruction(&ix, &account_store);
assert!(result.program_result.is_ok());Cuándo usar esto:
- Desarrollo de programas nativos de Rust sin Anchor TS.
- Benchmarking del uso de CU de instrucciones en pruebas.
- Validación del orden de las cuentas independiente del SDK del cliente.
- Regresión rápida en el análisis de datos de instrucciones.
Ejemplo de Trabajo
use mollusk_svm::{Mollusk, result::Check};
use solana_sdk::{
account::Account,
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
#[test]
fn process_deposit() {
let program_id = Pubkey::new_unique();
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let user = Pubkey::new_unique();
let vault = Pubkey::new_unique();
let accounts = vec![
(user, Account::default()),
(vault, Account::default()),
];
let ix = Instruction {
program_id,
accounts: vec![
AccountMeta::new(user, true),
AccountMeta::new(vault, false),
],
data: vec![0], // discriminador de depósito
};
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[Check::success()],
);
}Lo que esto demuestra:
process_and_validate_instructionejecuta la instrucción y verifica las comprobaciones de éxito.- La tienda de cuentas es una lista explícita de tuplas de pubkey + estado de Cuenta.
- La ruta del programa apunta al artefacto
target/deploydecargo build-sbf.
Inmersión Profunda
Cómo Funciona
- Mollusk carga el ELF e invoca el punto de entrada con las cuentas proporcionadas.
- Devuelve un resultado de ejecución detallado, incluido el consumo de CU.
- El enum
Checkvalida el éxito, los códigos de error y los patrones de registro. - Se compone con los tipos del SDK de Solana, sin capa RPC.
Mollusk vs LiteSVM
| Aspecto | Mollusk | LiteSVM 0.6.x |
|---|---|---|
| Nivel de API | Instrucción | Transacción |
| Métricas de CU | Comprobaciones integradas | Disponible en errores |
| Soporte CPI | Sí | Sí |
| Control del reloj | Cuentas manuales | Ayudantes de Sysvar |
Notas de Rust
use mollusk_svm::result::Check;
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[
Check::success(),
Check::compute_units(45_000..=60_000),
],
);Trampas
- Datos de cuenta vacíos - Las cuentas predeterminadas carecen de discriminador. Solución: Serializar los datos de la cuenta de Anchor en
Account::data. - Ruta de programa incorrecta - Discrepancia entre
.sode depuración y lanzamiento. Solución: Perfil decargo build-sbfconsistente en CI. - Solo indicadores de firmante -
is_signeren meta sin verificación de firma en el contexto de mollusk. Solución: Emparejar con pruebas de transacciones de LiteSVM para rutas de firma. - Propietario faltante - El propietario de la cuenta debe coincidir con el programa esperado para la deserialización. Solución: Establecer
account.owner = program_id. - CPI de token - Se necesita el programa de token cargado en la configuración de mollusk. Solución: Agregar bytes del programa SPL según la documentación de mollusk.
- CU de verificación demasiado estricta - Las actualizaciones cambian las CU. Solución: Usar rangos, no valores exactos.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| LiteSVM | Flujos de transacciones completos | Solo se necesita a nivel de instrucción |
| prueba de anchor | Clientes de IDL de Anchor | Desarrolladores solo de Rust |
| Trident fuzz | Entradas aleatorias | Regresión determinista |
Preguntas Frecuentes
¿Necesito un validador para Mollusk?
No, ejecución puramente en proceso.
¿Mollusk soporta programas Anchor?
Sí, carga el .so de Anchor y pasa los bytes del discriminador en los datos de la instrucción.
¿Cómo afirmo errores personalizados?
Usa Check::err(solana_sdk::program_error::ProgramError::Custom(code)).
¿Puedo medir CU?
Sí, Check::compute_units con límites de rango inclusivos.
¿Cómo pruebo cadenas CPI?
Incluye las cuentas del programa llamado y carga los ELFs de programas dependientes en mollusk.
Mollusk vs crate program-test?
Mollusk se mantiene para pruebas centradas en instrucciones; preferirlo para nuevos proyectos solo de Rust.
Configuración de CI?
cargo test después de anchor build o cargo build-sbf - capa rápida en el pipeline.
Alquiler de cuenta?
Establece suficientes lamports en las cuentas para satisfacer los mínimos exentos de alquiler.
¿Se necesita blockhash?
No para process_instruction; las preocupaciones a nivel de transacción usan LiteSVM en su lugar.
Compatibilidad con Agave 4.1.1?
Mantén la crate mollusk-svm actualizada junto con las fijaciones de la cadena de herramientas de Solana SDK 2.x / Agave.
Relacionado
- LiteSVM - pruebas a nivel de transacción
- Prueba de CPI y PDA - grafos de cuentas
- Tamaño del Programa y Disciplina de CU - presupuestos de CU
- Conceptos Básicos de Pruebas - ubicación en la pirámide
Versiones de pila: Esta página se escribió 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.