Конфігурація

Surfnet::start() (Rust) та Surfnet.start() (JS) запускають офлайн Surfnet з виробництвом блоків у режимі транзакцій і платником, поповненим 10 SOL. Коли вам потрібне щось інше — Surfnet з форком mainnet, повільніший годинник, детерміноване фінансування, конкретний keypair платника — скористайтесь білдером (Rust) або startWithConfig (JS).

Значення за замовчуванням

Якщо ви викликаєте start() без аргументів, ви отримуєте:

НалаштуванняЗначення
РежимОфлайн (без upstream RPC)
Виробництво блоківТранзакційний (блоки просуваються з кожною транзакцією)
Час slot1 мс
ПлатникВипадковий keypair, поповнений 10 SOL (10 000 000 000 lamport)
RPC URLhttp://127.0.0.1:<random>
WS URLws://127.0.0.1:<random>
Конфігурація featuresНабір features mainnet за замовчуванням

Власна конфігурація

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
Upstream RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL-рядокнемає
Виробництво блоківblock_production_mode(BlockProductionMode)blockProductionMode?: stringenum / "manual" | "clock" | "transaction"Transaction
Час slotslot_time_ms(u64)slotTimeMs?: numberмілісекунди1
Адреси аірдропуairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]список pubkeyпорожньо
Сума аірдропуairdrop_sol(u64)airdropSol?: numberlamport10_000_000_000
Пропустити blockhashskip_blockhash_check(bool)н/дboolfalse
Власний платникpayer(Keypair)payerSecretKey?: Uint8Array | number[]Keypair / байтигенерується
Увімкнути featureenable_feature(Pubkey)enableFeatures?: string[]ID feature(s)немає
Вимкнути featuredisable_feature(Pubkey)disableFeatures?: string[]ID feature(s)немає
Усі featuresн/дallFeatures?: booleanboolfalse
Конфігурація featuresfeature_config(SvmFeatureConfig)н/дповна конфігураціяmainnet за замовчуванням

Резервний віддалений RPC

Встановлення remoteRpcUrl (або remote_rpc_url у Rust) вимикає режим офлайн для Surfnet. Акаунти, яких немає локально, завантажуються на вимогу з upstream RPC — саме так працюють тести на основі mainnet-fork.

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

Використовуйте якісний upstream RPC

Для тестів, що задіюють багато форкнутих акаунтів, використовуйте платний endpoint (Helius, Triton, QuickNode). Публічний mainnet-beta має жорсткі ліміти запитів і буде нестабільним під час паралельного навантаження.

Режим виробництва блоків

РежимКоли просуваються блоки
Transaction (за замовчуванням)Після кожної транзакції. Найкраще підходить для тестів, які надсилають запит і одразу перевіряють результат.
ClockЗ фіксованим інтервалом, заданим параметром slot_time_ms. Найкраще підходить для тестів, що залежать від проходження кількох slot без явних транзакцій.
ManualЛише коли надсилається SimnetCommand::AdvanceClock. Найкраще підходить для тестів, чутливих до часу, де тест керує годинником.

Власний платник

За замовчуванням платником є щойно згенерований keypair. Вкажіть власний, якщо тестам потрібна відома адреса — наприклад, для попередньої побудови інструкцій із посиланням на pubkey платника.

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

Перемикайте окремі feature gates SVM за ідентифікатором або активуйте всі відомі функції за допомогою allFeatures: true (лише JS — Rust builder приймає 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?