Zeitreise

Die Surfpool-Laufzeitumgebung stellt drei Zeitreise-Hilfsfunktionen bereit. Jede bewegt die lokale Uhr zu einem absoluten Zielwert (kein relativer Offset) und gibt den aktualisierten EpochInfo zurück, damit Tests bestätigen können, dass die Laufzeitumgebung die angeforderte Zeit tatsächlich erreicht hat.

HelperZielRückgabe
time_travel_to_slot / timeTravelToSlotAbsolute slot-NummerEpochInfo mit dem neuen absolute_slot
time_travel_to_epoch / timeTravelToEpochAbsolute epoch-NummerEpochInfo mit dem neuen epoch
time_travel_to_timestamp / timeTravelToTimestampUnix-Zeitstempel in MillisekundenEpochInfo mit dem entsprechenden slot

Nur vorwärts

Die Zeitreise kann die Uhr nur vorwärts bewegen. Das Aufrufen dieser Methoden mit einem Zielwert in der Vergangenheit ist ein No-op — die Hilfsfunktion gibt den aktuellen EpochInfo unverändert zurück.

Zu einem Slot springen

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

Zu einer Epoch springen

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

Zu einem Unix-Zeitstempel springen

Übergebe den Zeitstempel in Millisekunden, nicht in Sekunden. Die Laufzeitumgebung berechnet den nächstgelegenen slot zu diesem Zeitstempel.

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

Häufige Muster

Sperrzeit oder Vesting-Fenster testen

Das folgende Beispiel ist eine Skizze — assertWithdrawFails und assertWithdrawSucceeds sind Platzhalter für beliebige clientseitige Hilfsfunktionen, die deine Test-Suite verwendet, um das RPC-Verhalten zu prüfen.

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();

Ein Multi-Epoch-Szenario steuern

Zwischenliegende slots werden übersprungen

Zeitreisen springen direkt zum Ziel — ein Sprung von epoch 1 zu epoch 5 überspringt die dazwischenliegenden slots. Wenn Ihr Programm jede zwischenliegende epoch-Grenze auslösen muss (zum Beispiel, um epochenbasierte Belohnungen gutzuschreiben), rufen Sie time_travel_to_epoch einmal pro epoch auf und fügen Sie die erforderlichen Transaktionen dazwischen ein.

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

EpochInfo-Struktur

Beide SDKs geben ein EpochInfo-Objekt mit folgenden Feldern zurück:

FeldRustJS
Absoluter slotabsolute_slot: u64absoluteSlot: number
slot innerhalb der epochslot_index: u64slotIndex: number
slots pro epochslots_in_epoch: u64slotsInEpoch: number
epoch-Nummerepoch: u64epoch: number
Blockhöheblock_height: u64blockHeight: number
Transaktionsanzahltransaction_count: Option<u64>transactionCount?: number

Is this page helpful?

Inhaltsverzeichnis

Seite bearbeiten
© 2026 Solana Foundation. Alle Rechte vorbehalten.