Configuración

Surfnet::start() (Rust) e Surfnet.start() (JS) inician una Surfnet sin conexión con producción de bloques en modo transacción y un pagador pre-financiado con 10 SOL. Cuando necesites algo más — una Surfnet bifurcada de mainnet, un reloj más lento, financiación determinista, un keypair de pagador específico — utiliza el builder (Rust) o startWithConfig (JS).

Valores por defecto

Si llamas a start() sin argumentos, obtienes:

ConfiguraciónValor
ModoSin conexión (sin RPC upstream)
Producción de bloquesTransacción (los bloques avanzan con cada tx)
Tiempo de slot1 ms
Pagadorkeypair aleatorio financiado con 10 SOL (10.000.000.000 lamports)
URL RPChttp://127.0.0.1:<random>
URL WSws://127.0.0.1:<random>
Configuración de funcionesConjunto de funciones de mainnet por defecto

Configuración personalizada

use surfpool_sdk::{BlockProductionMode, Pubkey, Surfnet};
#[tokio::test]
async fn starts_with_custom_configuration() {
let alice = Pubkey::new_unique();
let surfnet = Surfnet::builder()
.remote_rpc_url("https://api.mainnet-beta.solana.com")
.block_production_mode(BlockProductionMode::Transaction)
.slot_time_ms(10)
.airdrop_addresses(vec![alice])
.airdrop_sol(5_000_000_000)
.skip_blockhash_check(true)
.start()
.await
.unwrap();
assert_eq!(
surfnet.rpc_client().get_balance(&alice).unwrap(),
5_000_000_000
);
}

Referencia del builder

El builder de Rust y el objeto de configuración de JS exponen las mismas opciones lógicas bajo nomenclatura camelCase / snake_case.

OpciónSetter RustCampo JSTipoPor defecto
Modo sin conexiónoffline(bool)offline?: booleanbooltrue
RPC upstreamremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringCadena URLninguno
Producción de bloquesblock_production_mode(BlockProductionMode)blockProductionMode?: stringenum / "manual" | "clock" | "transaction"Transaction
Tiempo de slotslot_time_ms(u64)slotTimeMs?: numbermilisegundos1
Direcciones de airdropairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]lista de pubkeysvacío
Cantidad de airdropairdrop_sol(u64)airdropSol?: numberlamports10_000_000_000
Omitir blockhashskip_blockhash_check(bool)n/aboolfalse
Pagador personalizadopayer(Keypair)payerSecretKey?: Uint8Array | number[]Keypair / bytesgenerado
Activar funciónenable_feature(Pubkey)enableFeatures?: string[]ID(s) de funciónninguno
Desactivar funcióndisable_feature(Pubkey)disableFeatures?: string[]ID(s) de funciónninguno
Todas las funcionesn/aallFeatures?: booleanboolfalse
Configuración de funcionesfeature_config(SvmFeatureConfig)n/aconfiguración completamainnet por defecto

Alternativa RPC Remota

Configurar remoteRpcUrl (o remote_rpc_url en Rust) saca a Surfnet del modo sin conexión. Las cuentas que no están presentes localmente se obtienen bajo demanda desde el RPC de origen, que es como funcionan las pruebas de mainnet-fork.

let surfnet = Surfnet::builder()
.remote_rpc_url("https://api.mainnet-beta.solana.com")
.start()
.await?;

Usa un RPC de origen de alta calidad

Utiliza un endpoint de pago (Helius, Triton, QuickNode) para pruebas que accedan a muchas cuentas bifurcadas. El mainnet-beta público tiene límites de velocidad estrictos y fallará bajo cargas de pruebas paralelas.

Modo de Producción de Bloques

ModoCuándo avanzan los bloques
Transaction (predeterminado)Después de cada transacción. Ideal para pruebas que envían y verifican inmediatamente.
ClockA un intervalo fijo definido por slot_time_ms. Ideal para pruebas que dependen de que pasen múltiples slot sin transacciones explícitas.
ManualSolo cuando se envía un SimnetCommand::AdvanceClock. Ideal para pruebas sensibles al tiempo donde la prueba controla el reloj.

Pagador Personalizado

De forma predeterminada, el pagador es un keypair generado de nuevo. Proporciona el tuyo cuando las pruebas necesiten una dirección conocida, por ejemplo para pre-construir instrucciones que hagan referencia a la clave pública del pagador.

use surfpool_sdk::{Keypair, Signer, Surfnet};
let payer = Keypair::new();
let surfnet = Surfnet::builder().payer(payer.insecure_clone()).start().await?;
assert_eq!(surfnet.payer().pubkey(), payer.pubkey());

Compuertas de Funcionalidades

Activa o desactiva compuertas de funcionalidades individuales del SVM por ID, o activa todas las funcionalidades conocidas con allFeatures: true (solo JS — el constructor de Rust acepta feature_config para el conjunto completo).

use surfpool_sdk::{Pubkey, Surfnet};
let feature_id: Pubkey = "9bn2vTJUsUcnpiZWbu2woSKtTGW3ErZC9ERv88SDqQjK"
.parse()
.unwrap();
let surfnet = Surfnet::builder()
.enable_feature(feature_id)
.start()
.await?;

Omitir Verificación de Blockhash

skip_blockhash_check(true) (solo Rust) deshabilita la validación de blockhash en todas las transacciones. Útil para pruebas que firman transacciones con mucha anticipación a su envío o que no se preocupan por la expiración.

Errores

Un builder mal configurado falla en start(). El SDK de Rust devuelve SurfnetError:

VarianteCuándo
PortAllocation(String)No se pudo enlazar a un puerto RPC o WebSocket libre.
Startup(String)El runtime no pudo inicializarse (configuración incorrecta, URL remota inválida, etc.).
Runtime(String)El runtime falló durante el arranque antes de estar listo.
Aborted(String)El arranque fue cancelado (p. ej., señal de apagado durante el inicio).
Cheatcode(String)Una llamada a cheatcode dentro del builder falló.

El SDK de JS lanza un Error cuyo mensaje encapsula la misma variante subyacente.

Is this page helpful?

Tabla de Contenidos

Editar Página