Surfnet::start() (Rust) và Surfnet.start() (JS) khởi động một Surfnet ngoại
tuyến với chế độ sản xuất khối theo giao dịch và người thanh toán được nạp sẵn
10 SOL. Khi bạn cần bất kỳ điều gì khác — một Surfnet được fork từ mainnet, đồng
hồ chậm hơn, tài trợ xác định, một keypair người thanh toán cụ thể — hãy dùng
builder (Rust) hoặc startWithConfig (JS).
Mặc định
Nếu bạn gọi start() mà không có đối số, bạn sẽ nhận được:
| Cài đặt | Giá trị |
|---|---|
| Chế độ | Ngoại tuyến (không có RPC thượng nguồn) |
| Sản xuất khối | Giao dịch (các khối tiến lên theo từng tx) |
| Thời gian slot | 1 ms |
| Người thanh toán | keypair ngẫu nhiên được nạp 10 SOL (10.000.000.000 lamport) |
| URL RPC | http://127.0.0.1:<random> |
| URL WS | ws://127.0.0.1:<random> |
| Cấu hình tính năng | Bộ tính năng mainnet mặc định |
Cấu hình tùy chỉnh
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);}
Tham chiếu Builder
Rust builder và đối tượng cấu hình JS cung cấp các tùy chọn logic giống nhau theo cách đặt tên camelCase / snake_case.
| Tùy chọn | Setter Rust | Trường JS | Kiểu | Mặc định |
|---|---|---|---|---|
| Chế độ ngoại tuyến | offline(bool) | offline?: boolean | bool | true |
| RPC thượng nguồn | remote_rpc_url(impl Into<String>) | remoteRpcUrl?: string | Chuỗi URL | không có |
| Sản xuất khối | block_production_mode(BlockProductionMode) | blockProductionMode?: string | enum / "manual" | "clock" | "transaction" | Transaction |
| Thời gian slot | slot_time_ms(u64) | slotTimeMs?: number | mili giây | 1 |
| Địa chỉ airdrop | airdrop_addresses(Vec<Pubkey>) | airdropAddresses?: string[] | danh sách pubkey | trống |
| Số lượng airdrop | airdrop_sol(u64) | airdropSol?: number | lamport | 10_000_000_000 |
| Bỏ qua blockhash | skip_blockhash_check(bool) | n/a | bool | false |
| Người thanh toán tùy chỉnh | payer(Keypair) | payerSecretKey?: Uint8Array | number[] | Keypair / bytes | tự tạo |
| Bật tính năng | enable_feature(Pubkey) | enableFeatures?: string[] | ID tính năng | không có |
| Tắt tính năng | disable_feature(Pubkey) | disableFeatures?: string[] | ID tính năng | không có |
| Tất cả tính năng | n/a | allFeatures?: boolean | bool | false |
| Cấu hình tính năng | feature_config(SvmFeatureConfig) | n/a | cấu hình đầy đủ | mainnet mặc định |
Dự phòng RPC từ xa
Thiết lập remoteRpcUrl (hoặc remote_rpc_url trong Rust) sẽ chuyển Surfnet ra
khỏi chế độ ngoại tuyến. Các tài khoản không có sẵn ở local sẽ được tải theo yêu
cầu từ RPC upstream, đây là cách các bài kiểm thử mainnet-fork hoạt động.
let surfnet = Surfnet::builder().remote_rpc_url("https://api.mainnet-beta.solana.com").start().await?;
Sử dụng RPC upstream chất lượng cao
Sử dụng endpoint trả phí (Helius, Triton, QuickNode) cho các bài kiểm thử liên
quan đến nhiều tài khoản forked. mainnet-beta công khai bị giới hạn tốc độ
nghiêm ngặt và sẽ gặp lỗi khi chạy kiểm thử song song.
Chế độ sản xuất khối
| Chế độ | Khi nào khối được tiến lên |
|---|---|
Transaction (mặc định) | Sau mỗi giao dịch. Phù hợp nhất cho các bài kiểm thử gửi và xác nhận ngay lập tức. |
Clock | Theo chu kỳ cố định được đặt bởi slot_time_ms. Phù hợp nhất cho các bài kiểm thử phụ thuộc vào nhiều slot trôi qua mà không có giao dịch rõ ràng. |
Manual | Chỉ khi có SimnetCommand::AdvanceClock được gửi. Phù hợp nhất cho các bài kiểm thử nhạy cảm về thời gian khi bài kiểm thử điều khiển đồng hồ. |
Người thanh toán tùy chỉnh
Theo mặc định, người thanh toán là một keypair được tạo mới. Hãy cung cấp keypair của riêng bạn khi các bài kiểm thử cần một địa chỉ đã biết, ví dụ để xây dựng trước các lệnh tham chiếu đến khóa công khai của người thanh toán.
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());
Cổng tính năng
Bật/tắt từng cổng tính năng SVM theo ID, hoặc kích hoạt tất cả các tính năng đã
biết với allFeatures: true (chỉ JS — Rust builder chấp nhận feature_config
cho bộ đầy đủ).
use surfpool_sdk::{Pubkey, Surfnet};let feature_id: Pubkey = "9bn2vTJUsUcnpiZWbu2woSKtTGW3ErZC9ERv88SDqQjK".parse().unwrap();let surfnet = Surfnet::builder().enable_feature(feature_id).start().await?;
Bỏ qua kiểm tra Blockhash
skip_blockhash_check(true) (chỉ Rust) vô hiệu hóa xác thực blockhash trên tất
cả các giao dịch. Hữu ích cho các bài kiểm thử ký giao dịch từ trước khi nộp
hoặc không quan tâm đến thời hạn hết hạn.
Lỗi
Một builder bị cấu hình sai sẽ thất bại tại start(). Rust SDK trả về
SurfnetError:
| Biến thể | Khi nào |
|---|---|
PortAllocation(String) | Không thể liên kết với cổng RPC hoặc WebSocket trống. |
Startup(String) | Runtime khởi tạo thất bại (cấu hình sai, URL từ xa không hợp lệ, v.v.). |
Runtime(String) | Runtime bị crash trong quá trình khởi động trước khi sẵn sàng. |
Aborted(String) | Quá trình khởi động bị hủy (ví dụ: tín hiệu tắt máy trong quá trình boot). |
Cheatcode(String) | Một lệnh gọi cheatcode bên trong builder đã thất bại. |
JS SDK ném ra một Error có thông báo bao gồm cùng biến thể lỗi bên dưới.
Is this page helpful?