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

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

Настройки по умолчанию

Если вызвать start() без аргументов, вы получите:

ПараметрЗначение
РежимОфлайн (без вышестоящего RPC)
Производство блоковТранзакционный (блоки продвигаются при каждой транзакции)
Время slot1 мс
ПлательщикСлучайный keypair, пополненный 10 SOL (10 000 000 000 lamport)
RPC URLhttp://127.0.0.1:<random>
WS URLws://127.0.0.1:<random>
Конфигурация функцийНабор функций 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
);
}

Справочник по builder

Rust builder и объект конфигурации JS предоставляют одни и те же логические параметры с именованием в стиле camelCase / snake_case.

ПараметрМетод RustПоле JSТипПо умолчанию
Офлайн-режимoffline(bool)offline?: booleanbooltrue
Вышестоящий RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL-строканет
Производство блоковblock_production_mode(BlockProductionMode)blockProductionMode?: stringперечисление / "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 / байтыгенерируется
Включить функциюenable_feature(Pubkey)enableFeatures?: string[]ID функции(й)нет
Отключить функциюdisable_feature(Pubkey)disableFeatures?: string[]ID функции(й)нет
Все функциин/дallFeatures?: booleanboolfalse
Конфигурация функцийfeature_config(SvmFeatureConfig)н/дполная конфигурацияmainnet по умолчанию

Удалённый RPC-фолбэк

Установка remoteRpcUrl (или remote_rpc_url в Rust) переводит Surfnet из автономного режима в онлайн. Аккаунты, отсутствующие локально, загружаются по запросу из вышестоящего RPC — именно так работают тесты на основе форка mainnet.

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

Используйте качественный вышестоящий RPC

Используйте платный эндпоинт (Helius, Triton, QuickNode) для тестов, задействующих большое количество форкнутых аккаунтов. Публичный mainnet-beta жёстко ограничен по частоте запросов и будет давать сбои при параллельных тестовых нагрузках.

Режим производства блоков

РежимКогда продвигаются блоки
Transaction (по умолчанию)После каждой транзакции. Оптимален для тестов, которые отправляют данные и сразу проверяют результат.
ClockС фиксированным интервалом, задаваемым параметром slot_time_ms. Оптимален для тестов, зависящих от прохождения нескольких slot без явных транзакций.
ManualТолько при отправке SimnetCommand::AdvanceClock. Оптимален для чувствительных ко времени тестов, в которых тест сам управляет часами.

Пользовательский плательщик

По умолчанию плательщиком является свежесгенерированный 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());

Функциональные шлюзы

Включайте и отключайте отдельные функциональные шлюзы SVM по ID или активируйте все известные функции с помощью 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?