Configurazione

Surfnet::start() (Rust) e Surfnet.start() (JS) avviano un Surfnet offline con produzione di blocchi in modalità transazione e un payer pre-finanziato con 10 SOL. Quando hai bisogno di altro — un Surfnet con fork da mainnet, un clock più lento, finanziamento deterministico, un keypair specifico per il payer — utilizza il builder (Rust) o startWithConfig (JS).

Impostazioni predefinite

Se chiami start() senza argomenti, ottieni:

ImpostazioneValore
ModalitàOffline (nessun RPC upstream)
Produzione blocchiTransazione (i blocchi avanzano ad ogni tx)
Tempo slot1 ms
Payerkeypair casuale finanziato con 10 SOL (10.000.000.000 lamport)
URL RPChttp://127.0.0.1:<random>
URL WSws://127.0.0.1:<random>
Configurazione featureSet di feature mainnet predefinito

Configurazione personalizzata

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
);
}

Riferimento del builder

Il builder Rust e l'oggetto di configurazione JS espongono le stesse opzioni logiche con denominazione camelCase / snake_case.

OpzioneSetter RustCampo JSTipoPredefinito
Modalità offlineoffline(bool)offline?: booleanbooltrue
RPC upstreamremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringStringa URLnessuno
Produzione blocchiblock_production_mode(BlockProductionMode)blockProductionMode?: stringenum / "manual" | "clock" | "transaction"Transaction
Tempo slotslot_time_ms(u64)slotTimeMs?: numbermillisecondi1
Indirizzi airdropairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]lista di pubkeyvuoto
Importo airdropairdrop_sol(u64)airdropSol?: numberlamport10_000_000_000
Salta blockhashskip_blockhash_check(bool)n/aboolfalse
Payer personalizzatopayer(Keypair)payerSecretKey?: Uint8Array | number[]keypair / bytegenerato
Abilita featureenable_feature(Pubkey)enableFeatures?: string[]ID featurenessuno
Disabilita featuredisable_feature(Pubkey)disableFeatures?: string[]ID featurenessuno
Tutte le featuren/aallFeatures?: booleanboolfalse
Configurazione featurefeature_config(SvmFeatureConfig)n/aconfigurazione completamainnet predefinito

Fallback RPC Remoto

Impostare remoteRpcUrl (o remote_rpc_url in Rust) disattiva la modalità offline di Surfnet. Gli account non presenti localmente vengono recuperati su richiesta dall'RPC upstream, che è il meccanismo con cui funzionano i test mainnet-fork.

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

Usa un RPC upstream di alta qualità

Utilizza un endpoint a pagamento (Helius, Triton, QuickNode) per i test che coinvolgono molti account in fork. Il mainnet-beta pubblico è soggetto a forti limitazioni di frequenza e risulterà instabile sotto carichi di test paralleli.

Modalità di Produzione dei Blocchi

ModalitàQuando avanzano i blocchi
Transaction (predefinita)Dopo ogni transazione. Ideale per i test che inviano e verificano immediatamente.
ClockA intervalli fissi impostati da slot_time_ms. Ideale per i test che richiedono il passaggio di più slot senza transazioni esplicite.
ManualSolo quando viene inviato un SimnetCommand::AdvanceClock. Ideale per i test time-sensitive in cui il test gestisce l'orologio.

Pagatore Personalizzato

Per impostazione predefinita, il pagatore è un keypair generato al momento. Fornisci il tuo quando i test richiedono un indirizzo noto, ad esempio per pre-costruire istruzioni che fanno riferimento alla chiave pubblica del pagatore.

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());

Feature Gate

Attiva o disattiva singole feature gate SVM tramite ID, oppure abilita tutte le feature conosciute con allFeatures: true (solo JS — il builder Rust accetta feature_config per il set completo).

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

Ignora il Controllo del Blockhash

skip_blockhash_check(true) (solo Rust) disabilita la validazione del blockhash su tutte le transazioni. Utile per i test che firmano le transazioni molto prima dell'invio o che non si preoccupano della scadenza.

Errori

Un builder mal configurato fallisce su start(). L'SDK Rust restituisce SurfnetError:

VarianteQuando
PortAllocation(String)Impossibile eseguire il binding su una porta RPC o WebSocket libera.
Startup(String)Il runtime non è riuscito a inizializzarsi (configurazione errata, URL remoto non valido, ecc.).
Runtime(String)Il runtime si è arrestato in modo anomalo durante l'avvio prima di diventare pronto.
Aborted(String)L'avvio è stato annullato (ad es., segnale di arresto durante il boot).
Cheatcode(String)Una chiamata cheatcode all'interno del builder non è riuscita.

L'SDK JS genera un Error il cui messaggio racchiude la stessa variante sottostante.

Is this page helpful?

Indice dei contenuti

Modifica pagina
© 2026 Solana Foundation. Tutti i diritti riservati.