sui-move进阶:时间与纪元在Sui框架中,时间是智能合约中常用的元素,用于管理操作期(纪元)和获取精确的时间戳。Sui提供了两种主要的时间机制:纪元(Epoch)和时间(Time),它们在质押、验证人集合管理和其他操作中起着重要作用。纪元(Epoch)什么是纪元?纪元表示
在 Sui 框架中,时间是智能合约中常用的元素,用于管理操作期(纪元)和获取精确的时间戳。Sui 提供了两种主要的时间机制:纪元(Epoch) 和 时间(Time),它们在质押、验证人集合管理和其他操作中起着重要作用。
纪元表示 Sui 系统中的一个操作期,通常大约每 24 小时更改一次。在一个纪元期间:
纪元在 Sui 的共识算法和质押逻辑中至关重要。
可以通过事务上下文(TxContext
)读取当前纪元:
public fun current_epoch(ctx: &TxContext) {
let epoch = ctx.epoch();
// 使用 epoch 执行逻辑
}
纪元开始的 Unix 时间戳(毫秒)也可以通过上下文获取:
public fun current_epoch_start(ctx: &TxContext) {
let epoch_start = ctx.epoch_timestamp_ms();
// 使用 epoch_start 执行逻辑
}
为了精确测量时间,Sui 提供了 Clock 对象,它记录自 Unix 纪元以来的时间(以毫秒为单位)。Clock 是 Sui 的一个系统对象,在共识提交计划期间由系统更新。
Clock 的结构
struct Clock has key {
id: UID,
/// 自 Unix 纪元以来的时间戳(以毫秒为单位)
timestamp_ms: u64,
}
通过 sui::clock::timestamp_ms 获取当前时间:
use sui::clock::Clock;
public fun current_time(clock: &Clock) {
let time = clock.timestamp_ms();
// 使用 time 执行逻辑
}
示例
use sui::clock::Clock;
public fun log_current_time(clock: &Clock) {
let time = clock.timestamp_ms();
debug::print(&time);
}
限制说明
Clock 是一个共享对象,试图以可变方式访问它的事务将失败。 只能通过不可变引用访问 Clock,以确保并行访问的性能。 验证人约束
如果试图以值的形式或可变引用方式传递 Clock:
特性 | 纪元(Epoch) | 时间(Time) |
---|---|---|
定义 | 表示系统的操作期,每 24 小时更改 | 自 Unix 纪元以来的时间戳(毫秒) |
主要用途 | 管理验证人集合、质押周期 | 精确时间测量 |
数据来源 | TxContext | Clock 对象 |
访问方式 | 上下文直接提供 | 通过共享对象访问 |
以下是使用纪元和时间的典型场景。
通过纪元检查某些操作是否已过 24 小时周期:
public fun is_next_epoch(ctx: &TxContext, last_epoch: u64): bool {
let current = ctx.epoch();
current > last_epoch
}
通过 Clock 对象记录某操作的精确时间:
use sui::clock::Clock;
public fun record_time(clock: &Clock) {
let time = clock.timestamp_ms();
debug::print(&time);
}
利用纪元和时间戳实现简单的周期性操作:
public fun perform_task_if_due(ctx: &TxContext, last_epoch: u64, clock: &Clock) {
let current_epoch = ctx.epoch();
if (current_epoch > last_epoch) {
let current_time = clock.timestamp_ms();
debug::print(¤t_time);
// 执行周期任务
}
}
共享对象的访问限制:
纪元的固定性:
时间精度:
Sui Move 的时间机制通过 纪元(Epoch) 和 Clock 对象(Time) 提供灵活的时间管理方式:
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!