시간 여행

Surfpool 런타임은 세 가지 시간 여행 헬퍼를 제공합니다. 각각은 로컬 클락을 절대 목표값(상대적 오프셋이 아님)으로 이동시키며, 런타임이 요청한 시간에 실제로 도달했는지 테스트에서 검증할 수 있도록 업데이트된 EpochInfo를 반환합니다.

헬퍼대상반환값
time_travel_to_slot / timeTravelToSlot절대 slot 번호absolute_slot가 포함된 EpochInfo
time_travel_to_epoch / timeTravelToEpoch절대 epoch 번호epoch가 포함된 EpochInfo
time_travel_to_timestamp / timeTravelToTimestamp밀리초 단위 Unix 타임스탬프해당 slot을 반영하는 EpochInfo

앞으로만 이동

시간 여행은 클락을 앞으로만 이동할 수 있습니다. 과거의 목표값으로 이 메서드를 호출하면 아무런 동작도 하지 않으며, 헬퍼는 현재 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 타임스탬프로 이동

타임스탬프는 초가 아닌 밀리초 단위로 전달하세요. 런타임이 해당 타임스탬프에서 가장 가까운 slot을 계산합니다.

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

일반적인 패턴

잠금 또는 베스팅 기간 테스트

아래 예제는 개략적인 예시이며, assertWithdrawFailsassertWithdrawSucceeds는 테스트 스위트에서 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 형태의 객체를 반환합니다:

필드RustJS
절대 slotabsolute_slot: u64absoluteSlot: number
Epoch 내 slotslot_index: u64slotIndex: number
Epoch당 slot 수slots_in_epoch: u64slotsInEpoch: number
Epoch 번호epoch: u64epoch: number
블록 높이block_height: u64blockHeight: number
트랜잭션 수transaction_count: Option<u64>transactionCount?: number

Is this page helpful?

목차

페이지 편집