Aika & Sysvarit

Menetelmiä ajan manipulointiin ja järjestelmämuuttujien käyttämiseen. Jokaisella sysvar-getterillä on vastaava setter; rakenteet ovat tavallisia Go-peilejä Solana-lähteestä.

Kellon manipulointi

WarpToSlot

func (s *LiteSVM) WarpToSlot(slot uint64) error

Siirtää sisäisen kellon tiettyyn slot-arvoon.

before, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
t.Logf("current slot: %d", before.Slot)
if err := svm.WarpToSlot(10_000_000); err != nil {
t.Fatal(err)
}
after, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
t.Logf("new slot: %d", after.Slot)

Clock

type Clock struct {
Slot uint64
EpochStartTimestamp int64
Epoch uint64
LeaderScheduleEpoch uint64
UnixTimestamp int64
}
func (s *LiteSVM) Clock() (Clock, error)

Lukee Clock-syvarin.

c, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
t.Logf("slot=%d epoch=%d unix=%d", c.Slot, c.Epoch, c.UnixTimestamp)

SetClock

func (s *LiteSVM) SetClock(c Clock) error

Ylikirjoittaa Clock-sysvarin. Lue se, muuta kenttiä ja kirjoita takaisin, kun tarvitset hallintaa Epoch- tai UnixTimestamp-arvoihin (joita WarpToSlot ei päivitä).

c, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
c.Slot = 1_000
c.Epoch = 10
c.UnixTimestamp = 1_735_689_600
if err := svm.SetClock(c); err != nil {
t.Fatal(err)
}

WarpToSlot päivittää vain Slot-arvon. Käytä SetClock-funktiota, kun ohjelmasi lukee Epoch- tai UnixTimestamp-arvoa Clock-sysvarista.

rent

rent / SetRent

type Rent struct {
LamportsPerByteYear uint64
ExemptionThreshold float64
BurnPercent uint8
}
func (s *LiteSVM) Rent() (Rent, error)
func (s *LiteSVM) SetRent(r Rent) error
r, err := svm.Rent()
if err != nil {
t.Fatal(err)
}
t.Logf("lamports/byte-year: %d", r.LamportsPerByteYear)
t.Logf("exemption threshold: %.2f", r.ExemptionThreshold)
t.Logf("burn percent: %d", r.BurnPercent)

MinimumBalanceForRentExemption

func (s *LiteSVM) MinimumBalanceForRentExemption(dataLen int) (uint64, error)
for _, size := range []int{0, 100, 1024} {
min, err := svm.MinimumBalanceForRentExemption(size)
if err != nil {
t.Fatal(err)
}
t.Logf("%4d bytes -> %d lamports", size, min)
}

Epoch Schedule

type EpochSchedule struct {
SlotsPerEpoch uint64
LeaderScheduleSlotOffset uint64
Warmup bool
FirstNormalEpoch uint64
FirstNormalSlot uint64
}
func (s *LiteSVM) EpochSchedule() (EpochSchedule, error)
func (s *LiteSVM) SetEpochSchedule(e EpochSchedule) error
es, err := svm.EpochSchedule()
if err != nil {
t.Fatal(err)
}
t.Logf("slots per epoch: %d", es.SlotsPerEpoch)
t.Logf("first normal epoch: %d", es.FirstNormalEpoch)
t.Logf("first normal slot: %d", es.FirstNormalSlot)

Epoch Rewards

type EpochRewards struct {
DistributionStartingBlockHeight uint64
NumPartitions uint64
ParentBlockhash solana.Hash
TotalPointsLo uint64 // low 64 bits of the u128 total_points
TotalPointsHi uint64 // high 64 bits
TotalRewards uint64
DistributedRewards uint64
Active bool
}
func (s *LiteSVM) EpochRewards() (EpochRewards, error)
func (s *LiteSVM) SetEpochRewards(e EpochRewards) error

total_points on u128-tyyppinen Solana-puolella; litesvm-go paljastaa molemmat puoliskot explisiittisesti, jotta Go-kutsujat eivät tarvitse u128-kirjastoa. Arvoille, jotka mahtuvat 64 bittiin, TotalPointsHi on 0 ja TotalPointsLo on arvo.

slot-tiedot

LastRestartSlot / SetLastRestartSlot

func (s *LiteSVM) LastRestartSlot() (uint64, error)
func (s *LiteSVM) SetLastRestartSlot(slot uint64) error
last, err := svm.LastRestartSlot()
if err != nil {
t.Fatal(err)
}
if err := svm.SetLastRestartSlot(last + 1); err != nil {
t.Fatal(err)
}

SlotHashes / SetSlotHashes

type SlotHash struct {
Slot uint64
Hash solana.Hash
}
func (s *LiteSVM) SlotHashes() ([]SlotHash, error)
func (s *LiteSVM) SetSlotHashes(items []SlotHash) error

SlotHistory

SlotHistory on noin 128 kt:n bitvektori; litesvm-go tarjoaa sen kahvana eikä siivuna.

sh, err := litesvm.NewSlotHistory()
if err != nil {
t.Fatal(err)
}
defer sh.Close()
sh.Add(42)
switch sh.Check(42) {
case litesvm.SlotHistoryFound:
// ...
case litesvm.SlotHistoryNotFound:
// ...
case litesvm.SlotHistoryTooOld:
// ...
case litesvm.SlotHistoryFuture:
// ...
}
if err := svm.SetSlotHistory(sh); err != nil {
t.Fatal(err)
}
MetodiKuvaus
litesvm.NewSlotHistory() (*SlotHistory, error)Tyhjä kahva
sh.Add(slot uint64)Tallenna slot
sh.Check(slot uint64) SlotHistoryCheckFuture / TooOld / Found / NotFound
sh.Oldest() uint64Vanhin seurattu slot
sh.Newest() uint64Uusin seurattu slot
sh.NextSlot() uint64Seuraava tallennettava slot
sh.SetNextSlot(slot uint64) errorYlikirjoita seuraavan slot-merkinnän arvo
sh.Close()Vapauta kahva
svm.SlotHistory() (*SlotHistory, error)Lue uuteen kahvaan
svm.SetSlotHistory(*SlotHistory) errorAsenna SVM:lle

Stake History

type StakeHistoryItem struct {
Epoch uint64
Effective uint64
Activating uint64
Deactivating uint64
}
func (s *LiteSVM) StakeHistory() ([]StakeHistoryItem, error)
func (s *LiteSVM) SetStakeHistory(items []StakeHistoryItem) error

Aikariippuvaisen logiikan testaaminen

Käytä WarpToSlot-funktiota tavalliseen slot-pohjaiseen etenemiseen ja SetClock-funktiota täyteen hallintaan:

func TestTimeLockedVault(t *testing.T) {
svm, err := litesvm.New()
if err != nil {
t.Fatal(err)
}
defer svm.Close()
const unlockSlot = uint64(10_000)
// Setup: create the time-locked account ...
// Test 1: Try to withdraw before unlock (should fail)
before, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
t.Logf("current slot: %d", before.Slot)
// ... attempt withdrawal, expect failure ...
// Warp time forward past unlock slot
if err := svm.WarpToSlot(unlockSlot + 1); err != nil {
t.Fatal(err)
}
// Test 2: Try to withdraw after unlock (should succeed)
after, err := svm.Clock()
if err != nil {
t.Fatal(err)
}
t.Logf("new slot: %d", after.Slot)
// ... attempt withdrawal, expect success ...
}

Is this page helpful?

Sisällysluettelo

Muokkaa sivua
© 2026 Solana Foundation. Kaikki oikeudet pidätetään.