配置

Surfnet::start()(Rust)和 Surfnet.start()(JS)以离线模式启动 Surfnet,使用交易模式区块生产,并为付款方预存 10 SOL。当你需要其他配置时——例如主网分叉的 Surfnet、更慢的时钟、确定性资金分配、指定的付款方 keypair——请使用构建器(Rust)或 startWithConfig(JS)。

默认值

如果你调用 start() 时不传任何参数,将得到以下配置:

设置
模式离线(无上游 RPC)
区块生产交易模式(每笔交易推进一个区块)
Slot 时间1 毫秒
付款方随机 keypair,预存 10 SOL(10,000,000,000 lamport)
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 setterJS 字段类型默认值
离线模式offline(bool)offline?: booleanbooltrue
上游 RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL 字符串
区块生产block_production_mode(BlockProductionMode)blockProductionMode?: string枚举 / "manual" | "clock" | "transaction"Transaction
Slot 时间slot_time_ms(u64)slotTimeMs?: number毫秒1
空投地址airdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]pubkey 列表
空投金额airdrop_sol(u64)airdropSol?: numberlamport10_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 从离线模式切换出来。本地不存在的账户将按需从上游 RPC 获取,这也是 mainnet-fork 测试的工作方式。

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

使用高质量的上游 RPC

对于涉及大量 fork 账户的测试,请使用付费端点(Helius、Triton、QuickNode)。公共 mainnet-beta 有严格的速率限制,在并行测试负载下容易出现不稳定情况。

区块生产模式

模式区块推进时机
Transaction(默认)每笔交易后推进。最适合发送后立即断言的测试。
Clockslot_time_ms 设定的固定间隔推进。最适合依赖多个 slot 经过而无需显式交易的测试。
Manual仅在发送 SimnetCommand::AdvanceClock 时推进。最适合由测试驱动时钟的时间敏感型测试。

自定义付款方

默认情况下,付款方为一个新生成的 keypair。当测试需要已知地址时(例如预先构建引用付款方公钥的指令),请提供您自己的 keypair。

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?;

跳过 Blockhash 检查

skip_blockhash_check(true)(仅限 Rust)禁用所有交易的 blockhash 验证。适用于提前签署交易或不关心过期问题的测试。

错误

配置错误的构建器在 start() 处失败。Rust SDK 返回 SurfnetError

变体触发时机
PortAllocation(String)无法绑定到可用的 RPC 或 WebSocket 端口。
Startup(String)运行时初始化失败(配置错误、远程 URL 无效等)。
Runtime(String)运行时在就绪前于启动阶段崩溃。
Aborted(String)启动被取消(例如,启动过程中收到关闭信号)。
Cheatcode(String)构建器内部的作弊码调用失败。

JS SDK 会抛出一个 Error,其消息中封装了相同的底层变体。

Is this page helpful?

Table of Contents

Edit Page
©️ 2026 Solana 基金会版权所有