引言
在合约中,有不少地方需要用到时间,sui move framework clock提供了获取时间的函数。本文通过实践获取链上时间,以便更好在开发中进行运用。
clock
struct Clock has key {
id: UID,
timestamp_ms: u64,
}
sui系统创建了Clock obj,他是share_obj,地址为0x6,任何人都可以使用它作为交易的输入。
public fun timestamp_ms(clock: &Clock): u64 {
clock.timestamp_ms
}
该函数传入Clock的不可变借用,返回其中的时间戳,所以任何人都可以传入clock获取链上时间。
示例:
- 准备以下合约
module get_time::get_time{
use sui::clock::{Self, Clock};
use sui::event;
use sui::tx_context::{Self, TxContext};
struct BlockTimeStampEvent has copy,drop,store{
block_timestamp: u64,
}
public entry fun block_timestamp(clock: &Clock): u64{
let block_timestamp = clock::timestamp_ms(clock);
event::emit(BlockTimeStampEvent {
block_timestamp: block_timestamp,
});
block_timestamp
}
}
合约定义了一个BlockTimeStampEvent事件
block_timestamp函数中调用了timestamp_ms获取链上时间,触发BlockTimeStampEvent,然后返回链上时间
- 部署合约
sui client publish --gas-budget 10000000 --skip-fetch-latest-git-deps --skip-dependency-verification
- 调用block_timestamp
sui client call --function block_timestamp --args 0x6 --gas-budget 10000000 --package 0x0e411cb5110d5d0b87e25a545928aad5aea52af67ccf508c41fa284f810cafa7 --module get_time
触发事件:
{
"id": {
"txDigest": "43HMu4g7oV3EjjUVanfAKsyukdGFkwQg6PZVX52v7482",
"eventSeq": "0"
},
"packageId": "0x0e411cb5110d5d0b87e25a545928aad5aea52af67ccf508c41fa284f810cafa7",
"transactionModule": "get_time",
"sender": "0x2fcdfe7c92fe670d267474fbd7aa89baef55c5f93b1953a9e82614c9abb7abc6",
"type": "0x0e411cb5110d5d0b87e25a545928aad5aea52af67ccf508c41fa284f810cafa7::get_time::BlockTimeStampEvent",
"parsedJson": {
"block_timestamp": "1709878808021"
},
"bcs": "cdtRtpUTkcf",
"timestampMs": "1709878808021"
}
Move语言学习交流QQ群: 79489587
Sui官方中文开发者电报群: https://t.me/sui_dev_cn