我们的模块快完成了!现在让我们添加事件。等等,什么是事件?事件是一种让模块向应用程序前端传达区块链上发生的事情的方式,前端可以“监听”某些事件并在事件发生时采取行动。如果没有事件,“链下”组件(智能合约被视为“链上”)很难监控票是否被创建、延期或兑换。它们需要查询每笔交易的结果,并手动检查结果以查看哪些对象发生了变化以及具体如何变化。这非常不容易,而事件可以帮助解决这个问题!示例:

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上发出事件,你只需做两件事:

  1. 定义事件结构体,例如ClipTicketEvent。
  2. 调用event::emit来发出在步骤(1)中定义的事件。

注意,如果我们想在事件中包含对象ID(本质上是一个地址),我们需要使用 object::uid_to_inner 将原始的UID类型转换为ID类型。UID不能被复制或存储。