Surfpool çalışma zamanı üç zaman yolculuğu yardımcısı sunar. Her biri yerel
saati mutlak bir hedefe (göreli bir ofset değil) taşır ve testlerin çalışma
zamanının gerçekten istenen zamana ulaştığını doğrulayabilmesi için güncellenmiş
EpochInfo değerini döndürür.
| Yardımcı | Hedef | Döndürür |
|---|---|---|
time_travel_to_slot / timeTravelToSlot | Mutlak slot numarası | Yeni absolute_slot ile EpochInfo |
time_travel_to_epoch / timeTravelToEpoch | Mutlak epoch numarası | Yeni epoch ile EpochInfo |
time_travel_to_timestamp / timeTravelToTimestamp | Milisaniye cinsinden Unix zaman damgası | Tahmini slot'u yansıtan EpochInfo |
Yalnızca ileri
Zaman yolculuğu saati yalnızca ileri taşıyabilir. Geçmişteki bir hedef yoksayılmak yerine reddedilir — Rust yardımcıları Err döndürür, JS yardımcıları ise hata fırlatır. Hata mesajı hangi birimin geriye gittiğini belirtir; örneğin Cannot travel to past slot: target=1000, current=2000.
Bir Slot'a Atla
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);
Bir Epoch'a Atla
let info = cheats.time_travel_to_epoch(420)?;assert_eq!(info.epoch, 420);
Bir Unix Zaman Damgasına Atla
Unix epoch'undan bu yana geçen süreyi JavaScript'in Date.now() işleviyle aynı birim olan milisaniye cinsinden geçirin; saniye değil. Çalışma zamanı, o zaman damgasına en yakın slotu hesaplar.
// 2030-01-01T00:00:00Zlet info = cheats.time_travel_to_timestamp(1_893_456_000_000)?;
Saat milisaniye değil saniye raporlar
Çalışma zamanından geri okuduğunuz her zaman damgası saniye cinsindendir — zincir üstü Clock sysvar'ının unix_timestamp değeri ve systemClockUpdated olayının taşıdığı ClockValue dahil. Bu değerlerden birini doğrudan bir zaman yolculuğu yardımcısına beslemek 1970'lerin başındaki bir ana çözümlenir ve çağrı geçmiş hedef olarak reddedilir. Önce 1000 ile çarpın.
// WRONG — `unixTimestamp` is in seconds, so this is a past target.surfnet.timeTravelToTimestamp(clock.unixTimestamp + 3600);// RIGHT — convert to milliseconds.surfnet.timeTravelToTimestamp((clock.unixTimestamp + 3600) * 1000);
Saati Durdur ve Devam Ettir
Zaman yolculuğu belirli bir hedefe atlar; duraklatma ise saatin tamamen ilerlemesini durdurur.
surfnet_pauseClock, surfnet_resumeClock çalışana kadar slot üretimini ve zamanın ilerleyişini durdurur — birkaç doğrulama boyunca slot ve zaman damgasının sabit kalması gereken testlerde bu işleve başvurun.
Ne Rust SDK'sı ne de @solana/surfpool içindeki Surfnet sınıfı bu iki hile kodunu sarmalar. Bunları Kit eklentisi aracılığıyla veya doğrudan JSON-RPC üzerinden çağırın.
const paused = await client.cheatcodes.pauseClock().send();// Nothing advances until the clock is resumed, so this is the only thing that// moves the slot.await client.cheatcodes.timeTravel({ absoluteSlot: paused.absoluteSlot + 1_000n }).send();await client.cheatcodes.resumeClock().send();
Her iki hile kodu da EpochInfo döndürür — duraklatma anındaki ve devam ettirme sonrasındaki saat durumu. Bu yapının taşımadığı iki hususa dikkat edin:
- Zaman damgası yok.
EpochInfo'nun zaman alanı yoktur. Simüle edilen Unix zamanını bunun yerineClocksysvar'ından okuyun:jsonParsedkodlamasıylaSysvarC1ock11111111111111111111111111111111üzerindegetAccountInfo— yine saniye cinsinden. - Duraklatma bayrağı yok. Hiçbir RPC yöntemi saatin şu anda duraklatılıp duraklatılmadığını bildirmez. SDK'lardan, bir duraklatma, devam ettirme veya aralık değişikliği çalıştığında
clockCommandile tetiklenenclockUpdateolayını izleyin. Aksi takdirde durumu testinizde kendiniz takip edin.
Yaygın Kalıplar
Kilitleme veya Hakediş Penceresini Test Etme
Aşağıdaki örnek bir taslaktır — assertWithdrawFails ve
assertWithdrawSucceeds, test paketinizin RPC davranışını doğrulamak için
kullandığı istemci tarafı yardımcılar için yer tutuculardır.
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();
Çok Epoch'lu Bir Senaryo Yürütün
Aradaki slot'lar atlanır
Zaman yolculuğu doğrudan hedefe atlar — epoch 1'den epoch 5'e geçmek aradaki
slot'ları atlar. Programınızın her ara epoch sınırının tetiklenmesine ihtiyacı
varsa (örneğin, epoch başına ödülleri kaydetmek için), time_travel_to_epoch
işlevini her epoch için aradaki gerekli işlemlerle birlikte bir kez çağırın.
for epoch in 2..=5 {cheats.time_travel_to_epoch(epoch)?;surfnet.rpc_client().send_transaction(&claim_rewards_tx)?;}
EpochInfo Yapısı
Her iki SDK de şu alanları içeren bir EpochInfo şekilli nesne döndürür:
| Alan | Rust | JS |
|---|---|---|
| Mutlak slot | absolute_slot: u64 | absoluteSlot: number |
| Epoch içindeki slot | slot_index: u64 | slotIndex: number |
| Epoch başına slot sayısı | slots_in_epoch: u64 | slotsInEpoch: number |
| Epoch numarası | epoch: u64 | epoch: number |
| Blok yüksekliği | block_height: u64 | blockHeight: number |
| İşlem sayısı | transaction_count: Option<u64> | transactionCount?: number |
Is this page helpful?