发布者权限
在应用程序设计和开发中,证明发布者的权限往往是必要的。这在数字资产的上下文中特别重要,因为发布者可能会为其资产启用或禁用某些功能。发布者对象是一个对象,在Sui Framework中定义,允许发布者证明其对类型的_权威_。
定义
发布者对象在Sui框架的sui::package
模块中定义。它是一个非常简单的、非泛型对象,可以每个模块初始化一次(每个包多次),用于证明发布者对类型的权威。为了声明一个发布者对象,发布者必须向package::claim
函数提供一个一次性见证。
// File: sui-framework/sources/package.move
public struct Publisher has key, store {
id: UID,
package: String,
module_name: String,
}
如果您不熟悉一次性见证,可以在这里阅读更多信息。
下面是一个在模块中声明Publisher
对象的简单示例:
module book::publisher {
/// Some type defined in the module.
public struct Book {}
/// The OTW for the module.
public struct PUBLISHER has drop {}
/// Uses the One Time Witness to claim the Publisher object.
fun init(otw: PUBLISHER, ctx: &mut TxContext) {
// Claim the Publisher object.
let publisher = sui::package::claim(otw, ctx);
// Usually it is transferred to the sender.
// It can also be stored in another object.
transfer::public_transfer(publisher, ctx.sender())
}
}
使用
发布者对象有两个关联的函数,用于证明发布者对类型的权威:
// Checks if the type is from the same module, hence the `Publisher` has the
// authority over it.
assert!(publisher.from_module<Book>(), 0);
// Checks if the type is from the same package, hence the `Publisher` has the
// authority over it.
assert!(publisher.from_package<Book>(), 0);
发布者作为管理员角色
对于小型应用程序或简单的用例,发布者对象可以用作管理员能力。虽然在更广泛的上下文中,发布者对象对系统配置具有控制权,但它也可以用于管理应用程序的状态。
/// Some action in the application gated by the Publisher object.
public fun admin_action(cap: &Publisher, /* app objects... */ param: u64) {
assert!(cap.from_module<Book>(), ENotAuthorized);
// perform application-specific action
}
然而,发布者对象缺少一些能力的本地属性,如类型安全和表达性。admin_action
的签名不是很明确,可以被其他人调用。由于Publisher
对象是标准的,如果不执行from_module
检查,现在存在未经授权访问的风险。因此,在将Publisher
对象用作管理员角色时需要谨慎。
在Sui中的角色
在Sui上,发布者对于某些功能是必需的。对象展示只能由发布者创建,TransferPolicy——Kiosk系统的重要组成部分——也需要发布者对象来证明类型的所有权。
下一步
在下一章中,我们将介绍需要发布者对象的第一个功能——对象展示——一种描述客户端对象并标准化元数据的方法。这是用户友好应用程序的必备功能。