Подорож у часі

Рантайм Surfpool надає три допоміжні засоби для подорожей у часі. Кожен із них переміщує локальний годинник до абсолютної цілі (а не відносного зміщення) і повертає оновлений EpochInfo, щоб тести могли перевірити, що рантайм справді досяг запитаного часу.

ПомічникЦільПовертає
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

Передайте мітку часу в мілісекундах, а не в секундах. Рантайм обчислює найближчий slot для цієї мітки часу.

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

Поширені шаблони

Тестування блокування або вікна вестингу

Наведений нижче приклад є схематичним — assertWithdrawFails та assertWithdrawSucceeds є заповнювачами для будь-яких допоміжних засобів на стороні клієнта, які ваш набір тестів використовує для перевірки поведінки 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
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?