Διαμόρφωση

Surfnet::start() (Rust) και Surfnet.start() (JS) εκκινούν ένα εκτός σύνδεσης Surfnet με παραγωγή μπλοκ σε λειτουργία συναλλαγής και έναν πληρωτή προχρηματοδοτημένο με 10 SOL. Όταν χρειάζεστε οτιδήποτε άλλο — ένα Surfnet με fork από το mainnet, πιο αργό ρολόι, ντετερμινιστική χρηματοδότηση, ένα συγκεκριμένο keypair πληρωτή — χρησιμοποιήστε τον builder (Rust) ή startWithConfig (JS).

Προεπιλογές

Αν καλέσετε το start() χωρίς ορίσματα, λαμβάνετε:

ΡύθμισηΤιμή
ΛειτουργίαΕκτός σύνδεσης (χωρίς upstream RPC)
Παραγωγή μπλοκΣυναλλαγή (τα μπλοκ προχωρούν με κάθε tx)
Χρόνος slot1 ms
ΠληρωτήςΤυχαίο keypair χρηματοδοτημένο με 10 SOL (10.000.000.000 lamports)
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

Ο builder της Rust και το αντικείμενο διαμόρφωσης JS εκθέτουν τις ίδιες λογικές επιλογές με ονοματολογία camelCase / snake_case.

ΕπιλογήSetter RustΠεδίο JSΤύποςΠροεπιλογή
Λειτουργία εκτός σύνδεσηςoffline(bool)offline?: booleanbooltrue
Upstream RPCremote_rpc_url(impl Into<String>)remoteRpcUrl?: stringURL stringnone
Παραγωγή μπλοκblock_production_mode(BlockProductionMode)blockProductionMode?: stringenum / "manual" | "clock" | "transaction"Transaction
Χρόνος slotslot_time_ms(u64)slotTimeMs?: numbermilliseconds1
Διευθύνσεις airdropairdrop_addresses(Vec<Pubkey>)airdropAddresses?: string[]list of pubkeysempty
Ποσό airdropairdrop_sol(u64)airdropSol?: numberlamports10_000_000_000
Παράλειψη blockhashskip_blockhash_check(bool)n/aboolfalse
Προσαρμοσμένος πληρωτήςpayer(Keypair)payerSecretKey?: Uint8Array | number[]Keypair / bytesgenerated
Ενεργοποίηση χαρ/κούenable_feature(Pubkey)enableFeatures?: string[]feature ID(s)none
Απενεργοποίηση χαρ/κούdisable_feature(Pubkey)disableFeatures?: string[]feature ID(s)none
Όλα τα χαρ/κάn/aallFeatures?: booleanboolfalse
Διαμόρφωση χαρ/κώνfeature_config(SvmFeatureConfig)n/afull configdefault mainnet

Εναλλακτικό Απομακρυσμένο RPC

Η ρύθμιση remoteRpcUrlremote_rpc_url σε Rust) βγάζει το Surfnet από τη λειτουργία εκτός σύνδεσης. Λογαριασμοί που δεν υπάρχουν τοπικά ανακτώνται κατ' απαίτηση από το ανάντη RPC, που είναι ο τρόπος λειτουργίας των δοκιμών mainnet-fork.

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

Χρησιμοποιήστε ένα RPC ανάντη υψηλής ποιότητας

Χρησιμοποιήστε ένα επί πληρωμή endpoint (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?;

Παράλειψη Ελέγχου Blockhash

Το skip_blockhash_check(true) (μόνο Rust) απενεργοποιεί την επικύρωση blockhash σε όλες τις συναλλαγές. Χρήσιμο για δοκιμές που υπογράφουν συναλλαγές πολύ νωρίτερα από την υποβολή ή που δεν ενδιαφέρονται για τη λήξη.

Σφάλματα

Ένας λανθασμένα διαμορφωμένος builder αποτυγχάνει στο start(). Το Rust SDK επιστρέφει SurfnetError:

ΠαραλλαγήΠότε
PortAllocation(String)Δεν ήταν δυνατή η δέσμευση σε ελεύθερη θύρα RPC ή WebSocket.
Startup(String)Το runtime απέτυχε να αρχικοποιηθεί (κακή διαμόρφωση, κακό απομακρυσμένο URL κ.λπ.).
Runtime(String)Το runtime κατέρρευσε κατά την εκκίνηση πριν γίνει έτοιμο.
Aborted(String)Η εκκίνηση ακυρώθηκε (π.χ., σήμα τερματισμού κατά την εκκίνηση).
Cheatcode(String)Μια κλήση cheatcode μέσα στον builder απέτυχε.

Το JS SDK εκτοξεύει ένα Error του οποίου το μήνυμα περιτυλίγει την ίδια υποκείμενη παραλλαγή.

Is this page helpful?

© 2026 Ίδρυμα Solana. Με επιφύλαξη παντός δικαιώματος.