{"author":{"address":null,"user":"https://learnblockchain.cn/people/13838"},"content":{"body":"# sui-move进阶：时间与纪元\r\n\r\n在 Sui 框架中，时间是智能合约中常用的元素，用于管理操作期（纪元）和获取精确的时间戳。Sui 提供了两种主要的时间机制：**纪元（Epoch）** 和 **时间（Time）**，它们在质押、验证人集合管理和其他操作中起着重要作用。\r\n\r\n---\r\n\r\n## 纪元（Epoch)\r\n\r\n###  什么是纪元？\r\n纪元表示 Sui 系统中的一个操作期，通常大约每 24 小时更改一次。在一个纪元期间：\r\n- 验证人集合是固定的。\r\n- 纪元边界可能会发生验证人集合的变化。\r\n\r\n纪元在 Sui 的共识算法和质押逻辑中至关重要。\r\n\r\n###  获取当前纪元\r\n\r\n可以通过事务上下文（`TxContext`）读取当前纪元：\r\n```move\r\npublic fun current_epoch(ctx: \u0026TxContext) {\r\n    let epoch = ctx.epoch();\r\n    // 使用 epoch 执行逻辑\r\n}\r\n```\r\n### 获取纪元开始时间\r\n纪元开始的 Unix 时间戳（毫秒）也可以通过上下文获取：\r\n\r\n```move\r\npublic fun current_epoch_start(ctx: \u0026TxContext) {\r\n    let epoch_start = ctx.epoch_timestamp_ms();\r\n    // 使用 epoch_start 执行逻辑\r\n}\r\n```\r\n### 使用场景\r\n - 质押逻辑：纪元用于管理验证人集合和质押解锁时间。\r\n - 周期管理：在某些场景中，可以利用纪元模拟固定的 24 小时周期。\r\n## 时间（Time）\r\n\r\n### Clock 对象\r\n\r\n为了精确测量时间，Sui 提供了 Clock 对象，它记录自 Unix 纪元以来的时间（以毫秒为单位）。Clock 是 Sui 的一个系统对象，在共识提交计划期间由系统更新。\r\n\r\nClock 的结构\r\n```move\r\nstruct Clock has key {\r\n    id: UID,\r\n    /// 自 Unix 纪元以来的时间戳（以毫秒为单位）\r\n    timestamp_ms: u64,\r\n}\r\n```\r\n- Clock 对象的地址是固定的，为 0x6。\r\n- Clock 是一个 共享对象，只能通过 不可变引用 访问。\r\n\r\n### 获取当前时间\r\n通过 sui::clock::timestamp_ms 获取当前时间：\r\n\r\n```move\r\nuse sui::clock::Clock;\r\n\r\npublic fun current_time(clock: \u0026Clock) {\r\n    let time = clock.timestamp_ms();\r\n    // 使用 time 执行逻辑\r\n}\r\n```\r\n示例\r\n```move\r\n\r\nuse sui::clock::Clock;\r\n\r\npublic fun log_current_time(clock: \u0026Clock) {\r\n    let time = clock.timestamp_ms();\r\n    debug::print(\u0026time);\r\n}\r\n```\r\n### 访问限制\r\n\r\n限制说明\r\n\r\nClock 是一个共享对象，试图以可变方式访问它的事务将失败。\r\n只能通过不可变引用访问 Clock，以确保并行访问的性能。\r\n验证人约束\r\n\r\n如果试图以值的形式或可变引用方式传递 Clock：\r\n\r\n- 验证人将拒绝签署或执行该事务。\r\n\r\n## 纪元与时间的区别\r\n| 特性       | 纪元（Epoch）                   | 时间（Time）                       |\r\n|------------|---------------------------------|------------------------------------|\r\n| 定义       | 表示系统的操作期，每 24 小时更改 | 自 Unix 纪元以来的时间戳（毫秒）   |\r\n| 主要用途   | 管理验证人集合、质押周期         | 精确时间测量                       |\r\n| 数据来源   | TxContext                       | Clock 对象                         |\r\n| 访问方式   | 上下文直接提供                   | 通过共享对象访问                   |\r\n\r\n## 使用场景示例\r\n\r\n以下是使用纪元和时间的典型场景。\r\n\r\n#### 质押周期管理\r\n\r\n通过纪元检查某些操作是否已过 24 小时周期：\r\n\r\n```move\r\n\r\npublic fun is_next_epoch(ctx: \u0026TxContext, last_epoch: u64): bool {\r\n    let current = ctx.epoch();\r\n    current \u003e last_epoch\r\n}\r\n```\r\n\r\n#### 记录当前时间\r\n\r\n通过 Clock 对象记录某操作的精确时间：\r\n\r\n```move\r\n\r\nuse sui::clock::Clock;\r\n\r\npublic fun record_time(clock: \u0026Clock) {\r\n    let time = clock.timestamp_ms();\r\n    debug::print(\u0026time);\r\n}\r\n```\r\n\r\n#### 模拟周期任务\r\n\r\n利用纪元和时间戳实现简单的周期性操作：\r\n\r\n```move\r\n\r\npublic fun perform_task_if_due(ctx: \u0026TxContext, last_epoch: u64, clock: \u0026Clock) {\r\n    let current_epoch = ctx.epoch();\r\n    if (current_epoch \u003e last_epoch) {\r\n        let current_time = clock.timestamp_ms();\r\n        debug::print(\u0026current_time);\r\n        // 执行周期任务\r\n    }\r\n}\r\n```\r\n\r\n## 注意事项\r\n\r\n- 共享对象的访问限制：\r\n\r\n    - Clock 对象只能通过不可变引用访问。\r\n    - 避免尝试对 Clock 执行修改操作。\r\n\r\n- 纪元的固定性：\r\n\r\n    - 在单个纪元内，验证人集合保持固定。\r\n    - 使用纪元边界来管理重要的状态转换，例如更新质押信息。\r\n\r\n- 时间精度：\r\n\r\n    - Clock 提供毫秒级别的时间精度，非常适合需要精确时间控制的应用场景。\r\n\r\n## 总结\r\nSui Move 的时间机制通过 纪元（Epoch） 和 Clock 对象（Time） 提供灵活的时间管理方式：\r\n\r\n- 纪元适用于周期性任务和验证人集合的管理。\r\n- Clock 提供精确的毫秒级时间戳，用于精细时间操作。","title":"sui-move进阶：时间与纪元"},"history":null,"timestamp":1734018087,"version":1}