イベントは、オンチェーンのイベントについてオフチェーンのリスナーに通知する方法です。これらは、トランザクションに関する追加情報を発信するために使用されますが、その情報はオンチェーンに保存されず、したがってアクセスすることもできません。イベントは、Sui フレームワークにあるsui::event
モジュールによって発行されます。
copyとdropの能力を持つカスタムタイプは、イベントとして発行できます。Sui Verifierは、そのタイプがモジュール内部のものであることを要求します。*
// ファイル: [sui-framework/sources/event.move](<https://github.com/MystenLabs/sui/blob/main/crates/sui-framework/packages/sui-framework/sources/event.move>)
module sui::event {
/// カスタムMoveイベントを発行し、データをオフチェーンに送信します。
///
/// カスタムインデックスの作成や、特定のアプリケーションに最も適した方法で
/// オンチェーンアクティビティを追跡するために使用されます。
///
/// タイプ `T` はイベントをインデックス化する主な方法であり、
/// ファントムパラメータを含むことができます。例:`emit(MyEvent<phantom T>)`。
public native fun emit<T: copy + drop>(event: T);
}
イベントは、sui::event
モジュールのemit
関数を使用して発行されます。この関数は単一の引数(発行するイベント)を取ります。イベントデータは値渡しされます。
module book::events {
use sui::coin::Coin;
use sui::sui::SUI;
use sui::event;
/// 購入可能なアイテム。
public struct Item has key { id: UID }
/// アイテムが購入されたときに発行されるイベント。アイテムのIDと
/// 購入価格を含みます。
public struct ItemPurchased has copy, drop {
item: ID,
price: u64
}
/// アイテムの購入を実行するマーケットプレイス関数。
public fun purchase(coin: Coin<SUI>, ctx: &mut TxContext) {
let item = Item { id: object::new(ctx) };
// `ItemPurchased`のインスタンスを作成し、`event::emit`に渡します。
event::emit(ItemPurchased {
item: object::id(&item),
price: coin.value()
});
// 例を簡単にするため、実装の残りの部分は省略しています。
abort 0
}
}
Sui Verifierは、emit
関数に渡されるタイプがモジュール内部のものであることを要求します。したがって、別のモジュールからタイプをイベントとして発行しようとすると、コンパイルエラーが発生します。プリミティブタイプは、copyとdropの要件を満たしていますが、イベントとして発行することは許可されていません。
イベントはトランザクション結果の一部であり、トランザクション効果に保存されます。そのため、イベントにはネイティブにsender
フィールドがあり、これはトランザクションを送信したアドレスです。したがって、イベントに「sender」フィールドを追加する必要はありません。同様に、イベントのメタデータにはタイムスタンプが含まれています。ただし、このタイムスタンプはノードに相対的なものであり、ノードごとに少し異なる可能性があることに注意することが重要です。
The Move Book へ戻る