Konfiguration

Surfnet::start() (Rust) und Surfnet.start() (JS) starten ein Offline-Surfnet mit transaktionsbasierter Block-Produktion und einem Zahler, der mit 10 SOL vorab finanziert ist. Wenn du etwas anderes benötigst – ein Mainnet-geforktes Surfnet, eine langsamere Uhr, deterministische Finanzierung, ein bestimmtes Zahler-keypair – verwende den Builder (Rust) oder startWithConfig (JS).

Standardwerte

Wenn du start() ohne Argumente aufrufst, erhältst du:

EinstellungWert
ModusOffline (kein Upstream-RPC)
Block-ProduktionTransaktion (Blöcke schreiten bei jeder Tx voran)
slot-Zeit1 ms
ZahlerZufälliges keypair, finanziert mit 10 SOL (10.000.000.000 lamports)
RPC-URLhttp://127.0.0.1:<random>
WS-URLws://127.0.0.1:<random>
Feature-KonfigurationStandard-Mainnet-Feature-Set

Benutzerdefinierte Konfiguration

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

Builder-Referenz

Der Rust-Builder und das JS-Konfigurationsobjekt bieten dieselben logischen Optionen unter camelCase- bzw. snake_case-Benennung an.

OptionRust-SetterJS-FeldTypStandard
Offline-Modusoffline(bool)offline?: booleanbooltrue
Upstream-RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL-Stringkeiner
Block-Produktionblock_production_mode(BlockProductionMode)blockProductionMode?: stringEnum / "manual" | "clock" | "transaction"Transaction
slot-Zeitslot_time_ms(u64)slotTimeMs?: numberMillisekunden1
Airdrop-Adressenairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]Liste von pubkeysleer
Airdrop-Betragairdrop_sol(u64)airdropSol?: numberlamports10_000_000_000
Blockhash überspringenskip_blockhash_check(bool)n/aboolfalse
Benutzerdefinierter Zahlerpayer(Keypair)payerSecretKey?: Uint8Array | number[]keypair / Bytesgeneriert
Feature aktivierenenable_feature(Pubkey)enableFeatures?: string[]Feature-ID(s)keine
Feature deaktivierendisable_feature(Pubkey)disableFeatures?: string[]Feature-ID(s)keine
Alle Featuresn/aallFeatures?: booleanboolfalse
Feature-Konfigurationfeature_config(SvmFeatureConfig)n/avollständige KonfigurationStandard-Mainnet

Remote RPC Fallback

Das Setzen von remoteRpcUrl (oder remote_rpc_url in Rust) schaltet das Surfnet aus dem Offline-Modus heraus. Konten, die lokal nicht vorhanden sind, werden bei Bedarf vom vorgelagerten RPC abgerufen – so funktionieren Mainnet-Fork-Tests.

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

Hochwertigen Upstream-RPC verwenden

Verwende einen kostenpflichtigen Endpunkt (Helius, Triton, QuickNode) für Tests, die viele geforkte Konten verwenden. Der öffentliche mainnet-beta ist stark ratenbegrenzt und wird unter parallelen Testlasten unzuverlässig.

Block-Produktionsmodus

ModusWann Blöcke voranschreiten
Transaction (Standard)Nach jeder Transaktion. Am besten für Tests geeignet, die sofort nach dem Senden prüfen.
ClockIn einem festen Intervall, das durch slot_time_ms festgelegt wird. Am besten für Tests geeignet, bei denen mehrere slot vergehen müssen, ohne explizite Transaktionen.
ManualNur wenn ein SimnetCommand::AdvanceClock gesendet wird. Am besten für zeitkritische Tests geeignet, bei denen der Test die Uhr steuert.

Benutzerdefinierter Zahler

Standardmäßig ist der Zahler ein frisch generiertes keypair. Gib dein eigenes an, wenn Tests eine bekannte Adresse benötigen, zum Beispiel um Anweisungen vorzubereiten, die auf den öffentlichen Schlüssel des Zahlers (pubkey) verweisen.

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 Gates

Schalte einzelne SVM Feature Gates per ID um, oder aktiviere alle bekannten Features mit allFeatures: true (nur JS — der Rust-Builder akzeptiert feature_config für den vollständigen Satz).

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

Blockhash-Prüfung überspringen

skip_blockhash_check(true) (nur Rust) deaktiviert die Blockhash-Validierung für alle Transaktionen. Nützlich für Tests, die Transaktionen weit im Voraus der Einreichung signieren oder sich nicht um den Ablauf kümmern.

Fehler

Ein falsch konfigurierter Builder schlägt bei start() fehl. Das Rust SDK gibt SurfnetError zurück:

VarianteWann
PortAllocation(String)Konnte keinen freien RPC- oder WebSocket-Port belegen.
Startup(String)Die Laufzeitumgebung konnte nicht initialisiert werden (fehlerhafte Konfiguration, ungültige Remote-URL usw.).
Runtime(String)Die Laufzeitumgebung ist beim Start abgestürzt, bevor sie bereit war.
Aborted(String)Der Start wurde abgebrochen (z. B. durch ein Shutdown-Signal während des Bootvorgangs).
Cheatcode(String)Ein Cheatcode-Aufruf innerhalb des Builders ist fehlgeschlagen.

Das JS SDK wirft einen Error, dessen Nachricht dieselbe zugrunde liegende Variante enthält.

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.