Bankrun (TS)
Bankrun proporciona pruebas rápidas de la VM de Solana en proceso desde TypeScript sin ejecutar solana-test-validator. Úsalo cuando tu equipo trabaje con pruebas de Anchor TS pero necesite la velocidad de LiteSVM.
Receta
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
import { startAnchor, BankrunProvider } from "anchor-bankrun";
import { Program } from "@coral-xyz/anchor";
const context = await startAnchor("", [], []);
const provider = new BankrunProvider(context);
const program = new Program(idl, provider);Cuándo usar esto:
- Las pruebas de Anchor TS son demasiado lentas al iniciar el validador.
- Para probar múltiples instrucciones en un archivo TypeScript rápidamente.
- Equipos que prefieren Mocha/
chaisobre Rust#[test]. - Pipelines de CI que evitan puertos de validador inestables.
Ejemplo de Trabajo
import { startAnchor, BankrunProvider } from "anchor-bankrun";
import { Program, BN } from "@coral-xyz/anchor";
import { Keypair, PublicKey } from "@solana/web3.js";
import { describe, it } from "node:test";
import assert from "node:assert/strict";
describe("vault bankrun", async () => {
const context = await startAnchor(".", [], []);
const provider = new BankrunProvider(context);
const program = new Program(idl as any, provider);
it("deposita tokens", async () => {
const user = Keypair.generate();
context.setAccount(user.publicKey, {
lamports: 1_000_000_000,
data: Buffer.alloc(0),
owner: PublicKey.default,
executable: false,
});
const [vaultPda] = PublicKey.findProgramAddressSync(
[Buffer.from("vault"), user.publicKey.toBuffer()],
program.programId
);
await program.methods
.deposit(new BN(500_000))
.accounts({ user: user.publicKey, vault: vaultPda })
.signers([user])
.rpc();
const vault = await program.account.vault.fetch(vaultPda);
assert.equal(vault.balance.toNumber(), 500_000);
});
});Lo que esto demuestra:
startAnchorcarga los programas del espacio de trabajo en la VM en proceso.BankrunProviderconecta el cliente Anchor sin RPC local.context.setAccountsiembra el estado de la cuenta antes de las instrucciones.
Inmersión Profunda
Cómo Funciona
- Bankrun incrusta SVM de forma similar a LiteSVM pero expone una API amigable para Node.
- Las IDs de los programas de Anchor y los artefactos
.sose cargan desde las rutas del espacio de trabajo. - Las transacciones se envían a través del proveedor como en las pruebas normales de Anchor.
- Sin puerto 8899: elimina las condiciones de carrera del validador en CI.
Bankrun vs anchor test
| Aspecto | Bankrun | anchor test (validador) |
|---|---|---|
| Inicio | ~ms | segundos |
| Fidelidad RPC | Alta para programas | Completa |
| SPL Token | Soportado | Nativo |
| Bifurcación DeFi | Limitada | Surfpool / clon |
Notas de TypeScript
// Mueve el reloj para ix dependientes del tiempo
context.warpToSlot(100n);Trampas
- IDL desincronizada - Una IDL desactualizada causa errores de resolución de cuentas. Solución:
anchor buildantes de las pruebas. - Programas SPL faltantes - Las CPI de tokens necesitan cuentas de programa explícitas en la configuración del espacio de trabajo. Solución: Incluir
spl_token.soen la lista de programas destartAnchor. - Alquiler de cuentas - Las cuentas con fondos insuficientes fallan silenciosamente. Solución: Establecer lamports por encima del mínimo exento de alquiler en
setAccount. - No es estado de mainnet - Sin bifurcación por defecto. Solución: Usar Surfpool para la capa de integración DeFi.
- Deriva de versión - Bankrun debe coincidir con el SDK de Solana utilizado por Anchor 0.32.1. Solución: Fijar versiones en
package.json. signersenrpc()- Olvidar.signers([user])en instrucciones mutables. Solución: Reflejar los patrones de prueba del validador.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| LiteSVM (Rust) | Equipo centrado en Rust | Desarrolladores solo TS |
| anchor test | Se necesita RPC completo | Bucle interno crítico para la velocidad |
| Surfpool | Lógica de programa simple | Bifurcación de mainnet DeFi |
Preguntas Frecuentes
¿Reemplaza Bankrun completamente a anchor test?
No: mantén las pruebas E2E del validador para rutas específicas de RPC; Bankrun cubre la mayor parte de las pruebas de lógica de Anchor.
¿Compatible con Anchor 0.32.1?
Usa la versión de anchor-bankrun alineada con tu versión de Anchor; consulta la README del paquete.
¿Puedo probar transacciones versionadas?
El soporte evoluciona: verifica ALT/transacciones versionadas para tu versión de bankrun; recurre al validador si no es compatible.
¿Cómo depuro los registros?
Habilita los registros detallados del proveedor o captura errores de transacciones e imprime el campo simulation logs.
¿CI sin servicio de validador?
Sí: npm test solo con bankrun; más rápido y sin conflictos de puertos.
¿Múltiples programas?
Pasa la matriz de rutas de programas a startAnchor para dependencias de CPI.
¿Pruebas de PDA?
Igual que las pruebas del validador: findProgramAddressSync + program.methods...accounts.
¿Pruebas negativas?
assert.rejects en rpc() esperando códigos de error de Anchor.
¿Funciona con @solana/kit?
Bankrun usa el modelo de proveedor de web3.js; las pruebas de kit pueden apuntar a la RPC de bankrun si se expone; la ruta de Anchor usa web3.js.
¿Cuándo usar Surfpool en su lugar?
Cuando la instrucción necesita cuentas de pool/oráculo reales de mainnet que no se pueden simular fácilmente.
Relacionado
- Pruebas de Anchor TS - pruebas de Anchor basadas en validador
- LiteSVM - equivalente en Rust
- Conceptos básicos de pruebas - pirámide
- Mejores prácticas de pruebas - política de CI
Versiones de la 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.