我们的模块快完成了!现在让我们添加事件。等等,什么是事件?事件是一种让模块向应用程序前端传达区块链上发生的事情的方式,前端可以“监听”某些事件并在事件发生时采取行动。如果没有事件,“链下”组件(智能合约被视为“链上”)很难监控票是否被创建、延期或兑换。它们需要查询每笔交易的结果,并手动检查结果以查看哪些对象发生了变化以及具体如何变化。这非常不容易,而事件可以帮助解决这个问题!示例:
module modules::ticket_module_13 {
use sui::clock::{Self, Clock};
use sui::event;
use sui::object::{Self, ID, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
public struct Ticket has key {
id: UID,
expiration_time: u64,
}
public struct CreateTicketEvent has copy, drop {
id: ID,
}
public struct ClipTicketEvent has copy, drop {
id: ID,
}
public fun create_ticket(ctx: &mut TxContext, clock: &Clock) {
let uid = object::new(ctx);
let id = object::uid_to_inner(&uid);
let ticket = Ticket {
id: uid,
expiration_time: clock::timestamp_ms(clock),
};
transfer::transfer(ticket, tx_context::sender(ctx));
event::emit(CreateTicketEvent {
id,
});
}
public fun clip_ticket(ticket: Ticket) {
let Ticket { id, expiration_time: _ } = ticket;
event::emit(ClipTicketEvent {
id: object::uid_to_inner(&id),
});
object::delete(id);
}
}
为了在Sui上发出事件,你只需做两件事:
- 定义事件结构体,例如ClipTicketEvent。
- 调用event::emit来发出在步骤(1)中定义的事件。
注意,如果我们想在事件中包含对象ID(本质上是一个地址),我们需要使用 object::uid_to_inner
将原始的UID类型转换为ID类型。UID不能被复制或存储。