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> у програмах.

Джерела