一次性见证者

一次性见证者(One-Time Witness,OTW)设计非常巧妙。 OTW对象是在模块发布时创建的唯一对象,并在使用时被消费(删除),以证明所有权并保证操作的唯一性。

典型的使用场景是在sui::coin模块中创建货币,当然,币只能被创建一次。

OTW类型定义有以下两个规则:

  • 名称与模块同名,但大写。
  • 具有drop能力。
  • 没有字段。

OTW对象在初始化时创建,并作为init函数的第一个参数接收。

module test::otw {

    /// 名称与模块名称匹配
    public struct OTW has drop {}

    /// 作为第一个参数接收
    fun init(witness: OTW, ctx: &mut TxContext) {
        ...
    }
}

要利用OTW对象来保证唯一性和一次性使用,可以使用sui::types::is_one_time_witness(&witness)来测试一个对象是否为OTW对象。

assert!(types::is_one_time_witness(&otw), ENotOneTimeWitness);