Χειρισμός Χρόνου
warp_to_slot
pub fn warp_to_slot(&mut self, slot: u64)
Μετάβαση σε συγκεκριμένο slot. Υποστηρίζεται μόνο ταξίδι στο χρόνο προς τα εμπρός.
// Get current slotlet clock: Clock = svm.get_sysvar();let current_slot = clock.slot;// Jump forward 100 slotssvm.warp_to_slot(current_slot + 100);// Verifylet new_clock: Clock = svm.get_sysvar();assert_eq!(new_clock.slot, current_slot + 100);
Μη Αυτόματος Χειρισμός Ρολογιού
use solana_sdk::clock::Clock;// Read clocklet mut clock: Clock = svm.get_sysvar();// Modify fieldsclock.slot = 1000;clock.epoch = 10;clock.unix_timestamp = 1735689600;// Write backsvm.set_sysvar(&clock);
Χρησιμοποιήστε warp_to_slot() για τον κύριο χειρισμό χρόνου. Χρησιμοποιήστε
τη μη αυτόματη τροποποίηση ρολογιού μόνο όταν χρειάζεστε ακριβή έλεγχο πολλών
πεδίων.
Sysvars
get_sysvar
pub fn get_sysvar<T: Sysvar>(&self) -> T
Ανάγνωση τιμής sysvar.
use solana_sdk::clock::Clock;use solana_sdk::rent::Rent;use solana_sdk::epoch_schedule::EpochSchedule;let clock: Clock = svm.get_sysvar();let rent: Rent = svm.get_sysvar();let epoch_schedule: EpochSchedule = svm.get_sysvar();
set_sysvar
pub fn set_sysvar<T: Sysvar>(&mut self, sysvar: &T)
Εγγραφή τιμής sysvar.
use solana_sdk::rent::Rent;let rent = Rent {lamports_per_byte_year: 3480,exemption_threshold: 2.0,burn_percent: 50,};svm.set_sysvar(&rent);
Κοινά Sysvars
Ρολόι
use solana_sdk::clock::Clock;let clock: Clock = svm.get_sysvar();println!("Slot: {}", clock.slot);println!("Timestamp: {}", clock.unix_timestamp);println!("Epoch: {}", clock.epoch);
Rent
use solana_sdk::rent::Rent;let rent: Rent = svm.get_sysvar();let min_balance = rent.minimum_balance(data_len);
Epoch Schedule
use solana_sdk::epoch_schedule::EpochSchedule;let schedule: EpochSchedule = svm.get_sysvar();println!("Slots per epoch: {}", schedule.slots_per_epoch);
Ιστορικό Stake
use solana_sdk::stake_history::{StakeHistory, StakeHistoryEntry};let mut stake_history = StakeHistory::default();stake_history.add(0, // epochStakeHistoryEntry {effective: 1_000_000,activating: 0,deactivating: 0,},);svm.set_sysvar(&stake_history);
Μοτίβα Δοκιμών Βάσει Χρόνου
Δοκιμή Λειτουργιών Βάσει Slot
let mut svm = LiteSVM::new();// Get starting slotlet start_slot = svm.get_sysvar::<Clock>().slot;// Try action before unlock slot (should fail)let result = call_locked_program(&mut svm);assert!(result.is_err());// Warp to unlock slotsvm.warp_to_slot(start_slot + 1000);// Now it should succeedlet result = call_locked_program(&mut svm);assert!(result.is_ok());
Δοκιμή Λειτουργιών Βάσει Χρονικής Σήμανσης
let mut svm = LiteSVM::new();// Get current timestamplet clock: Clock = svm.get_sysvar();let current_time = clock.unix_timestamp;// Warp forward 1 hour (3600 seconds)// Slots roughly correspond to ~0.4 seconds on Solanalet target_slot = clock.slot + (3600.0 / 0.4) as u64;svm.warp_to_slot(target_slot);// Verify timestamp increasedlet new_clock: Clock = svm.get_sysvar();assert!(new_clock.unix_timestamp >= current_time + 3600);
Δοκιμή Χρονοδιαγραμμάτων Αποδέσμευσης
// Setup vesting with 100 slot periodlet vesting_period = 100;let start_slot = svm.get_sysvar::<Clock>().slot;// Test before vesting completeslet result = claim_vested_tokens(&mut svm);assert!(result.is_err()); // Too early// Warp past vesting periodsvm.warp_to_slot(start_slot + vesting_period + 1);// Now claim should succeedlet result = claim_vested_tokens(&mut svm);assert!(result.is_ok());
Συνηθισμένες Περιπτώσεις Χρήσης
- Χρονοδιαγράμματα αποδέσμευσης
- Αναλήψεις με χρονικό κλείδωμα
- Περίοδοι αναμονής για stake/unstake
- Χρόνοι λήξης δημοπρασίας
- Περίοδοι ενοικίασης
- Ανταμοιβές βάσει epoch
Σημαντικές Σημειώσεις
- Μόνο προς τα εμπρός - Μπορείτε να μεταβείτε μόνο μπροστά στον χρόνο, όχι πίσω
- Slot προς χρόνο - Τα slot αντιστοιχούν περίπου σε ~0.4 δευτερόλεπτα στο Solana mainnet
- Clock sysvar - Ενημερώνεται πάντα όταν χρησιμοποιείται το
warp_to_slot() - Χωρίς αυτόματες ενημερώσεις - Σε αντίθεση με τους πραγματικούς validator, ο χρόνος δεν προχωρά αυτόματα μεταξύ των συναλλαγών
Is this page helpful?