Пост
Поделитесь своими знаниями.
Понимание модуля Sui Clock и использования временных меток
ВSui Moveя создаю логику, чувствительную ко времени (например, передача токенов, сроки проведения аукционов), но мне трудно обеспечить надежную обработку временных меток. Ключевые вопросы:
- Объект Clock: зачем Суи нужны общие часы вместо блочных временных меток?
- Точность: насколько точны эти временные метки по сравнению со временем блоков?
- Модели использования: лучшие практики в отношении временных ограничений, сроков и планирования?
- Тестирование: как имитировать время в модульных тестах?
Текущие проблемы:
- Базовое использование sui: :clock работает, но кажется ограниченным
- Не знаете, как распределить время на разных сегментах и валидаторах
- Тестирование логики, зависящей от времени, некорректно
- Sui
Ответы
2####1. Основные принципы работы с часами
Почему общие часы? Модель параллельного исполнения Sui означает:
- Нет гарантированного порядка блоков → нельзя использовать номера блоков/временные метки
Clock
этообщий объект, предоставляющий время, подтвержденное консенсусом
Основная структура:
module sui::clock {
struct Clock has key {
id: UID,
timestamp_ms: u64,
}
}
Ключевые свойства:
- Обновляется каждые2 секунды(настраивается валидаторами)
- Точность в миллисекундах (по сравнению с блоками Ethereum примерно 12 с)
- Неизменный — не может быть изменен контрактами
####2. Практические схемы использования
#####Базовая проверка времени
use sui::clock;
public entry fn execute_if_ready(
clock: &Clock,
lock: &mut LockedAsset
) {
assert!(clock.timestamp_ms >= lock.unlock_time, ELocked);
// Release assets
}
#####Соблюдение крайнего срока
struct Auction has key {
id: UID,
end_time: u64, // Stored as Clock timestamp
highest_bid: u64
}
public entry fn bid(
auction: &mut Auction,
clock: &Clock,
bid_amount: u64
) {
assert!(clock.timestamp_ms < auction.end_time, EAuctionEnded);
// Process bid
}
#####Действия, заблокированные по времени
struct VestingSchedule has key {
id: UID,
start_time: u64,
cliff_duration: u64 // In milliseconds
}
public fun claimable_amount(
vesting: &VestingSchedule,
clock: &Clock
): u64 {
let elapsed = clock.timestamp_ms - vesting.start_time;
// Linear vesting math
}
####3. Дополнительные соображения
######Консистенция сегментов
- Во всех сегментах транзакции отображается одна и та же метка часов**
&Clock
- Для операций с несколькими сегментами используйте их в качестве ссылки на общий объект
######Оптимизация газов
duration_ms: u64
- По возможности хранитеотносительное время(например) вместо абсолютного
- Используйте одну и ту же
Clock
ссылку в разных функциях
#####Обработка ошибок
const MAX_CLOCK_DRIFT_MS: u64 = 3000; // 3s tolerance
public fun validate_clock(clock: &Clock) {
assert!(tx_context::epoch(ctx) == clock.epoch(), EStaleClock);
assert!(clock.timestamp_ms <= tx_context::now_ms(ctx) + MAX_CLOCK_DRIFT_MS, EInvalidTime);
}
####4. Стратегии тестирования
#####Имитация часов в тестах
#[test_only]
fun mock_clock(timestamp_ms: u64): Clock {
Clock { id: test_scenario::new_object(ctx), timestamp_ms }
}
#[test]
fun test_vesting() {
let clock = mock_clock(1000);
let vesting = VestingSchedule { start_time: 0, ... };
// Test claimable amount at t=1000
}
#####Тесты на смену эпох
#[test]
fun test_clock_epoch_change() {
let mut scenario = test_scenario::begin(...);
// Advance epoch
test_scenario::next_epoch(&mut scenario);
let clock = test_scenario::take_shared<Clock>(scenario);
assert!(clock.epoch() == 1, EEpochError);
}
Если вы работаете над логикой, зависящей от времени, например, над аукционами или графиком передачи прав собственности в Sui Move, этот sui::clock
модуль — ваш лучший способ отслеживать время. Sui не полагается на временные метки блоков, такие как Ethereum или Solana, потому что он нацелен на детерминированное исполнение и параллелизм. Вот почему используется объектshared Clock, который обновляется один раз за каждую контрольную точку и предоставляет вам канонический источник времени.
clock.timestamp
Вы взаимодействуете со временем, читая данные из этого общего объекта Clock (обычно передаваемого в функции ввода) с помощью. Это значение обновляется примерно каждую секунду и дает текущую метку времени UNIX в секундах. Хотя оно и не привязано к каждому блоку, как в EVM, оно достаточно точно для практического использования, например, для разблокировки токенов или истечения срока действия ставок, но не до микросекундной точности.
При построении логики, основанной на времени, всегда указывайте объект Clock явно**, чтобы функция Move могла прочитать его и сравнить временные метки с сохраненными сроками. Чтобы избежать жестких правил поведения, используйте льготные периоды или свободу действий при сравнении (if current_time > unlock_time + buffer
) и не полагайтесь на точные секунды.
Для тестирования Sui позволяетсмоделировать часы в модульных тестах, создав собственный экземпляр общего объекта с настраиваемой отметкой времени. Таким образом, вы сможете смоделировать будущие условия, не тратя время на прохождение времени в реальном времени. Просто создайте часы вручную, используя заданное значение в своих #[test]
функциях.
Если вы чувствуете себя ограниченными, скорее всего, это связано с тем, что Sui защищает часы от мутаций за пределами контрольных точек. При проектировании модулей необходимо использовать временные метки в качестве входных данных и считывать их из официального общедоступного объекта. Не создавайте собственный источник времени, так как это нарушает детерминизм.
Знаете ответ?
Пожалуйста, войдите в систему и поделитесь им.
Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.
Заработай свою долю из 1000 Sui
Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.
- Почему BCS требует точного порядка полей для десериализации, когда структуры Move содержат именованные поля?53
- «Ошибки проверки нескольких источников» в публикациях модуля Sui Move — автоматическое устранение ошибок43
- Сбой транзакции Sui: объекты, зарезервированные для другой транзакции25
- Как ограничения возможностей взаимодействуют с динамическими полями в гетерогенных коллекциях?05