السفر عبر الزمن

يوفر وقت تشغيل Surfpool ثلاثة أدوات مساعدة للسفر عبر الزمن. كل واحدة منها تنقل الساعة المحلية إلى هدف مطلق (وليس إزاحة نسبية) وتُعيد EpochInfo المحدَّثة حتى تتمكن الاختبارات من التحقق من أن وقت التشغيل وصل فعلاً إلى الوقت المطلوب.

HelperTargetReturns
time_travel_to_slot / timeTravelToSlotرقم slot مطلقEpochInfo مع absolute_slot الجديدة
time_travel_to_epoch / timeTravelToEpochرقم epoch مطلقEpochInfo مع 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
الـ slot المطلقabsolute_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?

جدول المحتويات

تعديل الصفحة