Clock — це системна змінна (Sysvar) в Solana, яка зберігає поточний стан часу блокчейна: номер слота, епоху, приблизний Unix-час та мітку початку епохи. Програми звертаються до Clock, коли логіка залежить від часу — наприклад, розблокування токенів, закінчення аукціону, нарахування винагороди.
Визначення
Clock — доступна лише для читання обліковий запис Sysvar за адресою SysvarC1ock11111111111111111111111111111111, який автоматично оновлюється валідаторами на кожному слоті та містить актуальні часові параметри мережі.
Структура Clock включає такі поля:
- slot — поточний номер слота;
- epoch — поточний номер епохи;
- epoch_start_timestamp — Unix-час початку поточної епохи;
- leader_schedule_epoch — епоха, для якої обчислено розклад лідерів;
- unix_timestamp — приблизний поточний Unix-час.
Як працює
Кожен валідатор при створенні блоку оновлює обліковий запис Clock: інкрементує слот, за потреби переходить до нової епохи та перераховує часові мітки. Програма отримує ці дані без додаткових транзакцій — достатньо оголосити Clock серед облікових записів, і runtime Solana автоматично передасть актуальне значення.
У Anchor Clock підключається як:
pub clock: Sysvar<'info, Clock>
Або без явного оголошення — через виклик Clock::get(), який читає дані з контексту транзакції.
Важливий нюанс: unix_timestamp у Clock є наближеним. Він формується з консенсусу валідаторів і може відрізнятися від реального годинника на секунди. Для точного хронометражу це непридатне, але для логіки на рівні блокчейна — достатньо.
Приклад
Програма вестингу перевіряє, чи минув строк розблокування:
- При створенні контракту фіксується
release_slot— слот, після якого користувач може забрати токени. - Під час спроби зняття програма читає
clock.slotі порівнює його зrelease_slot. - Якщо
clock.slot >= release_slot— транзакція проходить, інакше відхиляється з помилкою.
Цей підхід надійніший, ніж порівняння з unix_timestamp, оскільки слот зростає монотонно і детерміновано.
Типова помилка
Використання unix_timestamp з Clock для точного хронометражу або прив'язки до реального часу. Оскільки ця мітка є консенсусною і наближеною, вона не підходить для завдань, де потрібна секундна точність. Інша поширена помилка — спроба записати щось у обліковий запис Clock. Це Sysvar, доступний виключно для читання; будь-яка спроба модифікації призведе до відхилення транзакції.
Пов'язані матеріали
Внутрішні переходи
- Sysvar — загальний огляд системних змінних Solana, їхнього призначення та механізму доступу. Clock є одним із найвживаніших представників цієї категорії.
- Stake account — обліковий запис стейкінгу, який також залежить від часових параметрів мережі, зокрема від епохи та розкладу лідерів.
Додаткові ресурси
- Офіційна документація Solana — розділ про Sysvar та структуру Clock (перевірте актуальність на сайті docs.solana.com, оскільки поля можуть оновлюватися).
- Репозиторій Anchor — приклади використання
Sysvar<'info, Clock>у програмах.