設定

Surfnet::start()(Rust)とSurfnet.start()(JS)は、トランザクションモードのブロック生成と10 SOLがあらかじめ入金された支払者でオフラインのSurfnetを起動します。それ以外が必要な場合 — メインネットをフォークしたSurfnet、低速クロック、決定論的な資金調達、特定の支払者keypair — ビルダー(Rust)またはstartWithConfig(JS)を使用してください。

デフォルト値

引数なしでstart()を呼び出した場合、以下の設定が適用されます:

設定
モードオフライン(上流RPCなし)
ブロック生成トランザクション(トランザクションごとにブロックが進む)
slot 時間1 ms
支払者ランダムなkeypair(10 SOL / 10,000,000,000 lamports入金済み)
RPC URLhttp://127.0.0.1:<random>
WS URLws://127.0.0.1:<random>
フィーチャー設定デフォルトのメインネットフィーチャーセット

カスタム設定

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

ビルダーリファレンス

RustビルダーとJSの設定オブジェクトは、camelCase / snake_case の命名規則のもとで同じ論理オプションを公開しています。

オプションRustセッターJSフィールドデフォルト
オフラインモードoffline(bool)offline?: booleanbooltrue
上流RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL文字列なし
ブロック生成block_production_mode(BlockProductionMode)blockProductionMode?: stringenum / "manual" | "clock" | "transaction"Transaction
slot 時間slot_time_ms(u64)slotTimeMs?: numberミリ秒1
エアドロップアドレスairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]pubkeyのリスト
エアドロップ量airdrop_sol(u64)airdropSol?: numberlamports10_000_000_000
ブロックハッシュをスキップskip_blockhash_check(bool)n/aboolfalse
カスタム支払者payer(Keypair)payerSecretKey?: Uint8Array | number[]Keypair / バイト列自動生成
フィーチャーを有効化enable_feature(Pubkey)enableFeatures?: string[]フィーチャーID(複数可)なし
フィーチャーを無効化disable_feature(Pubkey)disableFeatures?: string[]フィーチャーID(複数可)なし
全フィーチャーn/aallFeatures?: booleanboolfalse
フィーチャー設定feature_config(SvmFeatureConfig)n/aフル設定デフォルトメインネット

リモートRPCフォールバック

remoteRpcUrl(Rustではremote_rpc_url)を設定すると、SurfnetがオフラインモードからオンラインモードになりますremoteRpcUrl。ローカルに存在しないアカウントは、上流のRPCからオンデマンドで取得されます。これがmainnet-forkテストの仕組みです。

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

高品質な上流RPCを使用する

多数のフォークされたアカウントを扱うテストには、有料エンドポイント(Helius、Triton、QuickNode)を使用してください。公開のmainnet-betaはレート制限が厳しく、並列テスト負荷下では不安定になります。

ブロック生成モード

モードブロックが進むタイミング
Transaction(デフォルト)トランザクションごと。送信直後にアサートするテストに最適。
Clockslot_time_msで設定した固定間隔。明示的なトランザクションなしに複数のslotが経過することに依存するテストに最適。
ManualSimnetCommand::AdvanceClockが送信されたときのみ。テストがクロックを制御する時間に敏感なテストに最適。

カスタムペイヤー

デフォルトでは、ペイヤーは新たに生成されたkeypairです。テストでペイヤーの公開鍵を参照するinstructionsを事前に構築する場合など、既知のアドレスが必要な場合は独自のものを指定してください。

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

フィーチャーゲート

IDで個々のSVMフィーチャーゲートを切り替えるか、allFeatures: true(JSのみ — Rustビルダーは全セットにfeature_configを使用)ですべての既知のフィーチャーをアクティブにします。

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

ブロックハッシュチェックのスキップ

skip_blockhash_check(true)(Rustのみ)は、すべてのトランザクションのブロックハッシュ検証を無効にします。送信よりもかなり前にトランザクションに署名するテストや、有効期限を気にしないテストに役立ちます。

エラー

設定が誤ったビルダーは start() で失敗します。Rust SDK は SurfnetError を返します:

バリアント発生条件
PortAllocation(String)空きの RPC または WebSocket ポートにバインドできなかった。
Startup(String)ランタイムの初期化に失敗した(設定が不正、リモート URL が無効など)。
Runtime(String)ランタイムが起動中にクラッシュし、準備完了状態に達しなかった。
Aborted(String)起動がキャンセルされた(例:起動中のシャットダウンシグナル)。
Cheatcode(String)ビルダー内のチートコード呼び出しが失敗した。

JS SDK は、同じ基盤となるバリアントをメッセージでラップした Error をスローします。

Is this page helpful?

目次

ページを編集
© 2026 Solana Foundation. 無断転載を禁じます。