litesvm, mollusk y solana-bankrun
Los entornos de prueba rápidos de Solana evitan los ciclos completos de solana-test-validator. LiteSVM 0.6.x ejecuta una SVM en proceso para pruebas de Rust. Mollusk ejecuta instrucciones individuales contra un ELF de programa con fixtures. solana-bankrun (Bankrun) incrusta un entorno similar a un validador para pruebas de integración de TypeScript. Elige según el lenguaje y las necesidades de fidelidad en la semántica de Agave 4.1.1.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
[dev-dependencies]
litesvm = "0.6"
mollusk-svm = "0.1"npm install -D solana-bankrun @solana/kit@7.0.0use litesvm::LiteSVM;
let mut svm = LiteSVM::new();
// svm.add_program(...) y enviar txs en pruebasCuándo recurrir a esto:
- Pruebas unitarias para programas Anchor/nativos en CI sin validadores Docker.
- Benchmarking del uso de CU en variantes de instrucciones.
- Pruebas de integración de TS que cargan tu
.soy verifican deltas de cuentas. - Bucles rápidos de rojo/verde durante correcciones de seguridad.
Ejemplo de Trabajo
use litesvm::LiteSVM;
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
signature::{Keypair, Signer},
system_program,
transaction::Transaction,
};
#[test]
fn transfer_in_litesvm() {
let mut svm = LiteSVM::new();
let payer = Keypair::new();
let recipient = Keypair::new();
svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();
let ix = Instruction {
program_id: system_program::ID,
accounts: vec![
AccountMeta::new(payer.pubkey(), true),
AccountMeta::new(recipient.pubkey(), false),
],
data: solana_sdk::system_instruction::transfer(&payer.pubkey(), &recipient.pubkey(), 10_000).data,
};
let bh = svm.latest_blockhash();
let tx = Transaction::new_signed_with_payer(&[ix], Some(&payer.pubkey()), &[&payer], bh);
svm.send_transaction(tx).unwrap();
let bal = svm.get_balance(&recipient.pubkey()).unwrap();
assert_eq!(bal, 10_000);
}Lo que esto demuestra:
- LiteSVM otorga lamports sin necesidad de un faucet CLI.
- La instrucción real del programa del sistema se ejecuta en proceso.
- El blockhash proviene del estado de svm, no de un RPC externo.
- Las aserciones leen los saldos directamente de svm.
Análisis Profundo
Cómo Funciona
- LiteSVM incrusta la ejecución compatible con Agave para binarios de programas cargados.
- Mollusk se centra en un entorno de instrucción única con una lista de cuentas simuladas.
- Bankrun inicia el estado del banco para pruebas de TS con hooks de despliegue de programas.
- Ninguno reemplaza completamente las pruebas del validador para casos de borde de RPC/red.
Tabla de Crates de Rust
| Crate | Lenguaje | Fidelidad | Velocidad |
|---|---|---|---|
litesvm | Rust | Transacciones multi-instrucción | Muy rápido |
mollusk-svm | Rust | Instrucción única | Micro-benchmarks más rápidos |
solana-program-test | Rust | Validador asíncrono antiguo | Más lento |
CLI surfpool | Cualquiera (RPC) | Simulación de fork de Mainnet | Medio |
Tabla de TypeScript / NPM
| Paquete | Rol | Fijación |
|---|---|---|
solana-bankrun | Banco incrustado para pruebas de TS | Coincidir con la era Agave |
@solana/kit | Construir/enviar en pruebas | 7.0.0 |
Ejecutor de pruebas anchor | Pruebas de TS de Anchor heredadas | 0.32.1 |
Notas de Rust
// Carga tu programa .so en pruebas de LiteSVM
// svm.add_program(program_id, "target/deploy/my_program.so");
// Compara los logs de CU con `mollusk` para la optimización de instrucciones claveTrampas
- Pruebas sin artefacto BPF desplegado - fallos de ID de programa vacío. Solución:
anchor buildantes de las pruebas; enlaza la ruta en CI. - Desviación de características de mainnet - la disponibilidad de syscall difiere según la versión. Solución: fija LiteSVM 0.6.x con la cadena de herramientas Agave 4.1.1.
- Ruta de programa de Bankrun incorrecta en monorepos -
.soobsoleto. Solución: copia el artefacto en el script de configuración de pruebas. - Simulación excesiva de cuentas en Mollusk - pasa las pruebas, falla en mainnet. Solución: añade casos de integración de LiteSVM.
- Omitir completamente las pruebas del validador - se pierden errores de serialización de RPC. Solución: mantén un conjunto delgado de
solana-test-validator.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
solana-test-validator | Integración precisa con RPC | Bucles unitarios de menos de un segundo |
| Fork de Surfpool 0.12.0 | Estado de cuenta de Mainnet | Matemáticas unitarias puras |
| Pruebas de despliegue en Devnet | Pruebas de humo previas al lanzamiento | Cada commit de PR |
| Verificación formal | Invariantes críticos | Toda la lógica de negocio |
Preguntas Frecuentes
¿LiteSVM vs program-test?
LiteSVM es más rápido y simple para la mayoría de las pruebas unitarias de Anchor/nativas.
¿Mollusk cuándo?
Micro-benchmarks y casos de seguridad centrados en instrucciones.
¿Bankrun con kit?
Sí - construye transacciones con kit, ejecuta en el contexto de Bankrun.
¿Entorno de prueba de Anchor?
anchor test puede orquestar el validador; añade LiteSVM para capas de velocidad.
¿Medición de CU?
Lee el consumo de los logs en las salidas de LiteSVM/Mollusk.
¿Caché de CI?
Caché de artefactos target/deploy/*.so entre trabajos.
¿Pruebas del programa Token?
Carga programas SPL en svm o usa imágenes pre-cargadas según la documentación del entorno.
¿Bankrun inestable?
Fija la versión de Node y el orden de despliegue del programa; evita carreras en pruebas paralelas.
¿Fuzz + Mollusk?
Combina entradas de cargo-fuzz con la ejecución de Mollusk para investigación de seguridad.
¿Complemento de Surfpool?
Usa Surfpool para estado bifurcado; LiteSVM para casos unitarios deterministas.
Relacionado
- LiteSVM - guía detallada
- Mollusk - entorno de instrucción
- Bankrun (TS) - pruebas de TS
- Conceptos básicos de pruebas - pirámide
Versiones de la pila: 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.