Skip to content

Epoch 和时间

在 Sui 区块链中,时间管理分为两种方式:Epoch 和 Time。它们分别适用于不同的场景,提供了灵活而精确的时间控制机制。

  • Epoch:表示系统的操作周期,通常每 24 小时更改一次。
  • Time:以毫秒为单位记录自 Unix 纪元以来的时间,用于精确的时间测量。

程序可以灵活地使用这两种时间信息,以满足各种需求。

Epoch

Epoch 是系统的操作周期,定义了验证器集的固定时间段。在 Epoch 期间,验证器集保持不变,但在 Epoch 边界可以更新。

获取 Epoch 信息

可以通过 TxContext(交易上下文)访问当前 Epoch 和 Epoch 开始时间戳:

move
/// 获取当前 Epoch
public fun current_epoch(ctx: &TxContext): u64 {
    ctx.epoch()
}

/// 获取当前 Epoch 的开始时间(Unix 时间戳,毫秒)
public fun current_epoch_start(ctx: &TxContext): u64 {
    ctx.epoch_timestamp_ms()
}

Epoch 的应用场景

  1. 质押逻辑:Epoch 是质押机制的核心,用于确定奖励分发周期和验证器集。
  2. 周期性操作:开发者可以基于 Epoch 模拟固定的时间间隔(如 24 小时)。
  3. 验证器集更新:Epoch 边界是更新验证器集的重要节点。

Time

Time 提供了更精确的时间测量功能,适用于需要精确到毫秒的场景。通过系统对象 Clock 提供时间信息,它在系统检查点期间自动更新。

Clock 对象的特点

  1. 系统对象Clock 是一个共享的系统对象,地址为 0x6
  2. 只读限制Clock 只能以不可变方式访问,避免了潜在的并发冲突。
  3. 高性能并行:由于 Clock 的只读性质,允许多个交易同时访问它,从而提高了系统性能。

获取时间信息

通过 Clock 模块的 timestamp_ms 函数获取当前时间(自 Unix 纪元以来的毫秒数):

move
use sui::clock;

/// 获取当前时间(毫秒)
public fun get_current_time(): u64 {
    clock::timestamp_ms()
}

Time 的应用场景

  1. 实时计时:适用于需要高精度时间的功能,例如事件触发或时间戳验证。
  2. 去中心化应用:通过统一的时间参考,确保多用户系统的一致性。

Epoch 和 Time 的对比

特性EpochTime
用途操作周期、验证器集更新精确时间测量
时间单位操作周期编号毫秒
访问方式ctx.epochctx.epoch_timestamp_msclock::timestamp_ms
典型用例质押逻辑、周期性任务实时计时、事件触发

总结

  1. Epoch 用于系统操作周期的管理,例如质押机制和验证器集更新。
  2. Time 提供精确到毫秒的时间测量,用于实时事件和时间戳操作。

开发者可以根据应用需求灵活选择 Epoch 或 Time,以实现最佳实践。

扩展阅读

  • Sui Move Book 中关于 Epoch 和时间的章节