發佈者權限 (Publisher Authority)
在應用程式設計與開發中,通常需要證明發佈者權限。這在數位資產的背景下尤為重要,發佈者可能需要為其資產啟用或停用某些功能。發佈者物件 (Publisher Object) 是在 Sui 框架 中定義的一種物件,它允許發佈者證明其對於 某種類型的權限 (authority over a type)。
定義
發佈者物件定義在 Sui 框架的 sui::package 模組中。它是一個非常簡單、非泛型的物件,每個模組只能初始化一次(每個套件可以有多個),用於證明發佈者對某種類型的權限。要領取發佈者物件,發佈者必須向 package::claim 函式提供 一次性見證 (One Time Witness, OTW)。
module sui::package;
public struct Publisher has key, store {
id: UID,
package: String,
module_name: String,
}
如果您不熟悉一次性見證,可以在 這裡 閱讀更多相關資訊。
以下是在模組中領取 Publisher 物件的簡單範例:
module book::publisher;
use sui::package::{Self, Publisher};
/// 在模組中定義的某種類型。
public struct Book {}
/// 模組的 OTW (One Time Witness)。
public struct PUBLISHER has drop {}
/// 使用 One Time Witness 來宣告 Publisher 物件。
fun init(otw: PUBLISHER, ctx: &mut TxContext) {
// 宣告 Publisher 物件。
let publisher: Publisher = sui::package::claim(otw, ctx);
// 通常會轉移給發送者。
// 它也可以存儲在另一個物件中。
transfer::public_transfer(publisher, ctx.sender())
}
用法
發佈者物件有兩個相關聯的函式,用於證明發佈者對某種類型的權限:
// 檢查該類型是否來自同一模組,因此 `Publisher` 對它有權限。
assert!(publisher.from_module<Book>());
// 檢查該類型是否來自同一套件,因此 `Publisher` 對它有權限。
assert!(publisher.from_package<Book>());
發佈者作為管理員角色 (Publisher as Admin Role)
對於小型應用程式或簡單的使用案例,發佈者物件可以用作管理員 能力 (Capability)。雖然在更廣泛的背景下,發佈者物件控制著系統配置,但它也可以用來管理應用程式的狀態。
/// 應用程式中由 Publisher 物件控制的某個操作。
public fun admin_action(cap: &Publisher, /* app objects... */ param: u64) {
assert!(cap.from_module<Book>(), ENotAuthorized);
// 執行應用程式特定的操作
}
然而,發佈者缺少 能力 (Capability) 的某些原生特性,例如類型安全和表現力。admin_action 的簽名並非十分明確,任何人都可以呼叫。而且由於 Publisher 物件是標準化的,如果不執行 from_module 檢查,就會存在未經授權存取的風險。因此,將 Publisher 物件用作管理員角色時必須謹慎。
在 Sui 上的角色
Sui 上的某些功能需要發佈者物件。物件顯示 (Object Display) 只能由發佈者建立,而 TransferPolicy —— Kiosk 系統中的一個重要組件 —— 也需要發佈者物件來證明類型的所有權。
下一步
在下一章中,我們將介紹第一個需要發佈者物件的功能:物件顯示 (Object Display) —— 一種為客戶端描述物件並標準化元資料的方法。這是構建使用者友善應用程式的必備功能。