Perjalanan Waktu

Runtime Surfpool menyediakan tiga helper perjalanan waktu. Masing-masing memindahkan jam lokal ke target absolut (bukan offset relatif) dan mengembalikan EpochInfo yang telah diperbarui sehingga pengujian dapat memverifikasi bahwa runtime benar-benar mencapai waktu yang diminta.

HelperTargetMengembalikan
time_travel_to_slot / timeTravelToSlotNomor slot absolutEpochInfo dengan absolute_slot baru
time_travel_to_epoch / timeTravelToEpochNomor epoch absolutEpochInfo dengan epoch baru
time_travel_to_timestamp / timeTravelToTimestampStempel waktu Unix dalam milidetikEpochInfo yang mencerminkan slot yang tersirat

Hanya maju

Perjalanan waktu hanya dapat memajukan jam. Memanggil metode ini dengan target di masa lalu tidak akan berpengaruh — helper mengembalikan EpochInfo saat ini tanpa perubahan.

Lompat Ke 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);

Lompat Ke Epoch

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

Lompat Ke Stempel Waktu Unix

Masukkan stempel waktu dalam milidetik, bukan detik. Runtime akan menghitung slot terdekat pada stempel waktu tersebut.

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

Pola Umum

Uji Lockup atau Jendela Vesting

Contoh di bawah ini hanyalah sketsa — assertWithdrawFails dan assertWithdrawSucceeds adalah placeholder untuk helper sisi klien apa pun yang digunakan layanan pengujian Anda untuk memverifikasi perilaku 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();

Jalankan Skenario Multi-Epoch

Slot perantara dilewati

Perjalanan waktu langsung melompat ke target — berpindah dari epoch 1 ke epoch 5 akan melewati slot-slot di antaranya. Jika program Anda membutuhkan setiap batas epoch perantara untuk dieksekusi (misalnya, untuk mengkredit hadiah per-epoch), panggil time_travel_to_epoch sekali per epoch dengan transaksi yang diperlukan di antaranya.

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

Bentuk EpochInfo

Kedua SDK mengembalikan objek berbentuk EpochInfo dengan field-field berikut:

FieldRustJS
Slot absolutabsolute_slot: u64absoluteSlot: number
Slot dalam epochslot_index: u64slotIndex: number
Slot per epochslots_in_epoch: u64slotsInEpoch: number
Nomor epochepoch: u64epoch: number
Tinggi blokblock_height: u64blockHeight: number
Jumlah transaksitransaction_count: Option<u64>transactionCount?: number

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.