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 的应用场景
- 质押逻辑:Epoch 是质押机制的核心,用于确定奖励分发周期和验证器集。
- 周期性操作:开发者可以基于 Epoch 模拟固定的时间间隔(如 24 小时)。
- 验证器集更新:Epoch 边界是更新验证器集的重要节点。
Time
Time 提供了更精确的时间测量功能,适用于需要精确到毫秒的场景。通过系统对象 Clock
提供时间信息,它在系统检查点期间自动更新。
Clock 对象的特点
- 系统对象:
Clock
是一个共享的系统对象,地址为0x6
。 - 只读限制:
Clock
只能以不可变方式访问,避免了潜在的并发冲突。 - 高性能并行:由于
Clock
的只读性质,允许多个交易同时访问它,从而提高了系统性能。
获取时间信息
通过 Clock
模块的 timestamp_ms
函数获取当前时间(自 Unix 纪元以来的毫秒数):
move
use sui::clock;
/// 获取当前时间(毫秒)
public fun get_current_time(): u64 {
clock::timestamp_ms()
}
Time 的应用场景
- 实时计时:适用于需要高精度时间的功能,例如事件触发或时间戳验证。
- 去中心化应用:通过统一的时间参考,确保多用户系统的一致性。
Epoch 和 Time 的对比
特性 | Epoch | Time |
---|---|---|
用途 | 操作周期、验证器集更新 | 精确时间测量 |
时间单位 | 操作周期编号 | 毫秒 |
访问方式 | ctx.epoch 和 ctx.epoch_timestamp_ms | clock::timestamp_ms |
典型用例 | 质押逻辑、周期性任务 | 实时计时、事件触发 |
总结
- Epoch 用于系统操作周期的管理,例如质押机制和验证器集更新。
- Time 提供精确到毫秒的时间测量,用于实时事件和时间戳操作。
开发者可以根据应用需求灵活选择 Epoch 或 Time,以实现最佳实践。
扩展阅读
- Sui Move Book 中关于 Epoch 和时间的章节