Suiには、現在の時間にアクセスする2つの方法があります:エポック(Epoch)時間(Time)です。前者はシステムの運用期間を表し、おおよそ24時間ごとに変更されます。後者はUnixエポックからの経過時間をミリ秒単位で表します。どちらもプログラム内で自由にアクセスできます。

エポック(Epoch)

エポックは、システムを運用期間に分けるために使用されます。エポック中は検証者セットは固定されていますが、エポックの境界では検証者セットを変更できます。エポックはコンセンサスアルゴリズムで重要な役割を果たし、現在の検証者セットを決定するために使用されます。また、ステーキングメカニズムの測定にも使用されます。

エポックはトランザクションコンテキストから読み取ることができます:

public fun current_epoch(ctx: &TxContext) {
    let epoch = ctx.epoch();
    // ...
}

エポック開始時のUnixタイムスタンプを取得することも可能です:

public fun current_epoch_start(ctx: &TxContext) {
    let epoch_start = ctx.epoch_timestamp_ms();
    // ...
}

通常、エポックはステーキングやシステム操作に使用されますが、カスタムシナリオでは24時間の期間をエミュレートするために使用できます。アプリケーションがステーキングロジックに依存している場合や、現在の検証者セットを知る必要がある場合、エポックは重要です。

時間(Time)

より正確な時間測定のために、SuiはClockオブジェクトを提供しています。これはシステムオブジェクトで、チェックポイント時にシステムによって更新され、Unixエポックからの経過時間をミリ秒単位で保存します。Clockオブジェクトはsui::clockモジュールで定義されており、予約アドレス0x6を持っています。

Clockは共有オブジェクトですが、可変的にアクセスしようとするトランザクションは失敗します。この制限により、Clockオブジェクトへの並列アクセスが可能になり、パフォーマンスの維持に重要です。

// ファイル: sui-framework/clock.move
/// Moveコールに時間を公開するシングルトンの共有オブジェクト。
/// このオブジェクトはアドレス0x6にあり、エントリ関数によって
/// 不変参照を介してのみ読み取ることができます。
///
/// `Clock`を可変参照または値で受け取ろうとするエントリ関数は
/// 検証に失敗し、正直な検証者は`Clock`を入力パラメータとして
/// 使用するトランザクションに署名したり実行したりしません。
/// ただし、不変参照で渡される場合は除きます。
struct Clock has key {
    id: UID,
    /// クロックのタイムスタンプ。コンセンサスがスケジュールを
    /// コミットするたびに、またはテスト中に
    /// `sui::clock::increment_for_testing`によって、
    /// システムトランザクションによって自動的に設定されます。
    timestamp_ms: u64,
}

Clockモジュールで利用可能な公開関数は1つだけです - timestamp_ms。これはUnixエポックからの経過時間をミリ秒単位で返します。

use sui::clock::Clock;

/// Clockは不変参照として渡す必要があります。
public fun current_time(clock: &Clock) {
    let time = clock.timestamp_ms();
    // ...
}

The Move Book へ戻る