Ταξίδι στο Χρόνο

Το runtime του Surfpool παρέχει τρία βοηθήματα ταξιδιού στο χρόνο. Το καθένα μετακινεί το τοπικό ρολόι σε έναν απόλυτο στόχο (όχι σχετική μετατόπιση) και επιστρέφει το ενημερωμένο EpochInfo ώστε οι δοκιμές να μπορούν να επαληθεύσουν ότι το runtime έφτασε πράγματι στον ζητούμενο χρόνο.

HelperΣτόχοςΕπιστρέφει
time_travel_to_slot / timeTravelToSlotΑπόλυτος αριθμός slotEpochInfo με το νέο absolute_slot
time_travel_to_epoch / timeTravelToEpochΑπόλυτος αριθμός epochEpochInfo με το νέο epoch
time_travel_to_timestamp / timeTravelToTimestampΧρονική σήμανση Unix σε χιλιοστά του δευτερολέπτουEpochInfo που αντικατοπτρίζει το εννοούμενο slot

Μόνο προς τα εμπρός

Το ταξίδι στο χρόνο μπορεί να μετακινήσει το ρολόι μόνο μπροστά. Η κλήση αυτών των μεθόδων με στόχο στο παρελθόν δεν έχει αποτέλεσμα — το βοήθημα επιστρέφει το τρέχον EpochInfo αμετάβλητο.

Μετάβαση σε Slot

use surfpool_sdk::Surfnet;
let surfnet = Surfnet::start().await?;
let cheats = surfnet.cheatcodes();
let info = cheats.time_travel_to_slot(1_000_000)?;
assert!(info.absolute_slot >= 1_000_000);

Μετάβαση σε Epoch

let info = cheats.time_travel_to_epoch(420)?;
assert_eq!(info.epoch, 420);

Μετάβαση σε Χρονική Σήμανση Unix

Δώστε τη χρονική σήμανση σε χιλιοστά του δευτερολέπτου, όχι σε δευτερόλεπτα. Το runtime υπολογίζει το πλησιέστερο slot σε αυτή τη χρονική σήμανση.

// 2030-01-01T00:00:00Z
let info = cheats.time_travel_to_timestamp(1_893_456_000_000)?;

Συνήθη Μοτίβα

Δοκιμή Κλειδώματος ή Παραθύρου Αποδέσμευσης

Το παρακάτω παράδειγμα είναι σκίτσο — το assertWithdrawFails και το assertWithdrawSucceeds είναι placeholders για τα βοηθήματα στην πλευρά του client που χρησιμοποιεί η σουίτα δοκιμών σας για επαλήθευση συμπεριφοράς RPC.

import { Surfnet } from "@solana/surfpool";
const surfnet = Surfnet.start();
const beneficiary = Surfnet.newKeypair();
// 1. Set up a vesting account that unlocks at slot 1,000,000.
surfnet.setAccount(/* ...lockup program state... */);
// 2. Verify withdrawal fails before unlock.
await assertWithdrawFails(surfnet.rpcUrl, beneficiary);
// 3. Travel past the unlock slot.
surfnet.timeTravelToSlot(1_000_001);
// 4. Verify withdrawal succeeds.
await assertWithdrawSucceeds(surfnet.rpcUrl, beneficiary);
surfnet.stop();

Οδήγηση Σεναρίου Πολλαπλών Epoch

Τα ενδιάμεσα slot παραλείπονται

Η χρονική μετάβαση γίνεται απευθείας στον στόχο — η μετακίνηση από epoch 1 σε epoch 5 παραλείπει τα slot ενδιάμεσα. Αν το πρόγραμμά σας χρειάζεται να ενεργοποιείται κάθε ενδιάμεσο όριο epoch (για παράδειγμα, για να πιστωθούν ανταμοιβές ανά epoch), καλέστε time_travel_to_epoch μία φορά ανά epoch με τις απαραίτητες συναλλαγές ενδιάμεσα.

for epoch in 2..=5 {
cheats.time_travel_to_epoch(epoch)?;
surfnet.rpc_client().send_transaction(&claim_rewards_tx)?;
}

Δομή EpochInfo

Και τα δύο SDK επιστρέφουν ένα αντικείμενο τύπου EpochInfo με τα εξής πεδία:

FieldRustJS
Απόλυτο slotabsolute_slot: u64absoluteSlot: number
Slot εντός epochslot_index: u64slotIndex: number
Slot ανά epochslots_in_epoch: u64slotsInEpoch: number
Αριθμός epochepoch: u64epoch: number
Ύψος μπλοκblock_height: u64blockHeight: number
Αριθμός συναλλαγώνtransaction_count: Option<u64>transactionCount?: number

Is this page helpful?

Πίνακας Περιεχομένων

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