アプリケーションの設計と開発において、パブリッシャー権限を証明する必要がしばしばあります。これは特にデジタル資産の文脈において重要で、パブリッシャーが自身の資産に対して特定の機能を有効または無効にする可能性があるためです。パブリッシャーオブジェクトは、Sui フレームワークで定義されたオブジェクトで、パブリッシャーが_型に対する権限_を証明することを可能にします。

定義

パブリッシャーオブジェクトは、Sui フレームワークのSui::packageモジュールで定義されています。これは非常にシンプルな非ジェネリックオブジェクトで、モジュールごとに1回(パッケージごとに複数回)初期化でき、型に対するパブリッシャーの権限を証明するために使用されます。パブリッシャーオブジェクトを要求するには、パブリッシャーはOne Time Witnesspackage::claim関数に提示する必要があります。

// ファイル: [sui-framework/sources/package.move](<https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/package.move>)
public struct Publisher has key, store {
    id: UID,
    package: String,
    module_name: String,
}

One Time Witnessに馴染みがない場合は、ここでさらに詳しく読むことができます。

以下は、モジュールでPublisherオブジェクトを要求する簡単な例です:

module book::publisher {
    /// モジュールで定義されたある型。
    public struct Book {}

    /// モジュールのOTW。
    public struct PUBLISHER has drop {}

    /// One Time Witnessを使用してPublisherオブジェクトを要求します。
    fun init(otw: PUBLISHER, ctx: &mut TxContext) {
        // Publisherオブジェクトを要求します。
        let publisher = sui::package::claim(otw, ctx);

        // 通常、送信者に転送されます。
        // 他のオブジェクトに保存することもできます。
        transfer::public_transfer(publisher, ctx.sender())
    }
}

使用法

Publisherオブジェクトには、型に対するパブリッシャーの権限を証明するために使用される2つの関連する関数があります:

// 型が同じモジュールからのものであるかをチェックし、したがって`Publisher`がその型に対する
// 権限を持っているかを確認します。
assert!(publisher.from_module<Book>(), 0);

// 型が同じパッケージからのものであるかをチェックし、したがって`Publisher`がその型に対する
// 権限を持っているかを確認します。
assert!(publisher.from_package<Book>(), 0);

管理者ロールとしてのPublisher

小規模なアプリケーションや単純なユースケースでは、Publisherオブジェクトを管理者能力として使用できます。より広い文脈では、Publisherオブジェクトはシステム構成を制御しますが、アプリケーションの状態を管理するためにも使用できます。

/// Publisherオブジェクトによって制御されるアプリケーションの一部のアクション。
public fun admin_action(cap: &Publisher, /* アプリオブジェクト... */ param: u64) {
    assert!(cap.from_module<Book>(), ENotAuthorized);

    // アプリケーション固有のアクションを実行
}

しかし、Publisherには型安全性や表現力などの能力(Capabilities)の一部のネイティブな特性が欠けています。admin_actionのシグネチャはあまり明示的ではなく、他の誰でも呼び出すことができます。また、Publisherオブジェクトが標準であるため、from_moduleチェックが実行されない場合、不正アクセスのリスクが生じます。したがって、Publisherオブジェクトを管理者ロールとして使用する際は注意が必要です。

Suiにおける役割

PublisherはSui上の特定の機能に必要です。オブジェクトディスプレイはPublisherによってのみ作成でき、Kioskシステムの重要なコンポーネントであるTransferPolicyも、型の所有権を証明するためにPublisherオブジェクトを必要とします。

次のステップ

次の章では、Publisherオブジェクトを必要とする最初の機能であるオブジェクトディスプレイについて説明します。これは、クライアントのためにオブジェクトを記述し、メタデータを標準化する方法です。ユーザーフレンドリーなアプリケーションには必須の機能です。