Sui.

Пост

Поделитесь своими знаниями.

Benjamin XDV.
Jul 14, 2025
Экспертные Вопросы и Ответы

Понимание модуля Sui Clock и использования временных меток

ВSui Moveя создаю логику, чувствительную ко времени (например, передача токенов, сроки проведения аукционов), но мне трудно обеспечить надежную обработку временных меток. Ключевые вопросы:

  1. Объект Clock: зачем Суи нужны общие часы вместо блочных временных меток?
  2. Точность: насколько точны эти временные метки по сравнению со временем блоков?
  3. Модели использования: лучшие практики в отношении временных ограничений, сроков и планирования?
  4. Тестирование: как имитировать время в модульных тестах?

Текущие проблемы:

  • Базовое использование sui: :clock работает, но кажется ограниченным
  • Не знаете, как распределить время на разных сегментах и валидаторах
  • Тестирование логики, зависящей от времени, некорректно
  • Sui
0
2
Поделиться
Комментарии
.

Ответы

2
Arnold.
Jul 14 2025, 14:47

####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);  
}  
0
Комментарии
.
24p30p.
Jul 14 2025, 13:53

Если вы работаете над логикой, зависящей от времени, например, над аукционами или графиком передачи прав собственности в 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 Clock

-1
Комментарии
.

Знаете ответ?

Пожалуйста, войдите в систему и поделитесь им.

Sui is a Layer 1 protocol blockchain designed as the first internet-scale programmable blockchain platform.

420Посты611Ответы
Sui.X.Peera.

Заработай свою долю из 1000 Sui

Зарабатывай очки репутации и получай награды за помощь в развитии сообщества Sui.

Кампания вознагражденийИюль