Du Hành Thời Gian

Runtime Surfpool cung cấp ba hàm trợ giúp du hành thời gian. Mỗi hàm di chuyển đồng hồ cục bộ đến một mục tiêu tuyệt đối (không phải độ lệch tương đối) và trả về EpochInfo đã được cập nhật để các bài kiểm thử có thể xác nhận rằng runtime đã thực sự đến thời điểm được yêu cầu.

Hàm trợ giúpMục tiêuTrả về
time_travel_to_slot / timeTravelToSlotSố slot tuyệt đốiEpochInfo với absolute_slot mới
time_travel_to_epoch / timeTravelToEpochSố epoch tuyệt đốiEpochInfo với epoch mới
time_travel_to_timestamp / timeTravelToTimestampUnix timestamp tính bằng mili giâyEpochInfo phản ánh slot tương ứng

Chỉ tiến về phía trước

Du hành thời gian chỉ có thể di chuyển đồng hồ về phía trước. Gọi các phương thức này với mục tiêu trong quá khứ sẽ không có tác dụng — hàm trợ giúp trả về EpochInfo hiện tại không thay đổi.

Nhảy Đến Một 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);

Nhảy Đến Một Epoch

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

Nhảy Đến Một Unix Timestamp

Truyền timestamp tính bằng mili giây, không phải giây. Runtime sẽ tính toán slot gần nhất tại thời điểm đó.

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

Các Mẫu Phổ Biến

Kiểm Thử Lockup Hoặc Cửa Sổ Vesting

Ví dụ dưới đây chỉ là phác thảo — assertWithdrawFailsassertWithdrawSucceeds là các placeholder cho bất kỳ hàm trợ giúp phía client nào mà bộ kiểm thử của bạn sử dụng để xác nhận hành vi 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();

Thực Hiện Kịch Bản Đa Epoch

Các slot trung gian bị bỏ qua

Dịch chuyển thời gian nhảy thẳng đến đích — di chuyển từ epoch 1 đến epoch 5 sẽ bỏ qua các slot ở giữa. Nếu chương trình của bạn cần mỗi ranh giới epoch trung gian phải kích hoạt (ví dụ: để ghi nhận phần thưởng theo epoch), hãy gọi time_travel_to_epoch mỗi epoch một lần với các giao dịch cần thiết ở giữa.

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

Cấu Trúc EpochInfo

Cả hai SDK đều trả về một đối tượng có dạng EpochInfo với các trường sau:

TrườngRustJS
Slot tuyệt đốiabsolute_slot: u64absoluteSlot: number
Slot trong epochslot_index: u64slotIndex: number
Số slot mỗi epochslots_in_epoch: u64slotsInEpoch: number
Số epochepoch: u64epoch: number
Chiều cao khốiblock_height: u64blockHeight: number
Số lượng giao dịchtransaction_count: Option<u64>transactionCount?: number

Is this page helpful?

Mục lục

Chỉnh sửa trang