一次性见证者
一次性见证者(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);