初始化函数

在模块发布期间,Sui 为开发人员提供了使用模块初始化器初始化模块状态的支持,也称为“init 函数”。此函数将仅在发布过程中调用一次。

“init 函数”遵循以下约定:

  • 命名为 init
  • 最后一个参数类型为 &mut TxContext
  • 没有返回值
  • 可见性为 private

例如:

module move_castle::core {
    fun init(ctx: &mut TxContext) {
    
    }
}

“init 函数”的典型用法是能力设计模式(Capability Design Pattern)

能力设计模式允许通过“能力”对象授权操作。通过在模块初始化时将能力对象转移到授权地址,可以将需要授权的交互(函数)限制为只能由能力对象的所有者调用。

在我们的 Move Castle 游戏中,我们可以设计一些游戏设置,这些设置在游戏发布后可以调整。更新设置的功能必须只能由游戏管理员调用。

我们可以在 core.move 模块中添加一个 AdminCap 结构体,然后在 init 函数中将一个 AdminCap 对象转移给发布者。

module move_castle::core {
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};
    
    /// 修改游戏设置的能力
    struct AdminCap has key {
        id: UID
    }

    /// 模块初始化器创建唯一的一个 AdminCap 并将其发送给发布者
    fun init(ctx: &mut TxContext) {
        transfer::transfer(
            AdminCap{id: object::new(ctx)},
            tx_context::sender(ctx)
        );
    }
}