イベントは、プログラムの実行中に発行できる特別な値です。
イベントの種類は、eventキーワードで宣言できます。
event FooEvent(x: Int, y: Int)
イベント宣言の構文は、関数(function)宣言の構文と類似しています。イベントには名前付きパラメータが含まれ、それぞれにオプションの引数ラベルがあります。
イベントパラメータは、有効なイベントパラメータ型のみを持つことができます。有効な型は、boolean、string、integer、これらの型の配列およびディクショナリ、およびすべてのフィールドが有効なイベントパラメータ型である構造体です。リソース型は許可されていません。リソースが引数として使用されると移動されてしまうからです。
イベントは、スマートコントラクト本体の中でしか宣言できません。イベントはグローバルに、またはリソース型や構造体の中で宣言することはできません。
// Invalid: An event cannot be declared globally
//
event GlobalEvent(field: Int)
access(all)
contract Events {
// Event with explicit argument labels
//
event BarEvent(labelA fieldA: Int, labelB fieldB: Int)
// Invalid: A resource type is not allowed to be used
// because it would be moved and lost
//
event ResourceEvent(resourceField: @Vault)
}
Emitting events
プログラムからイベントを発信するには、emit ステートメントを使用します:
access(all)
contract Events {
event FooEvent(x: Int, y: Int)
// Event with argument labels
event BarEvent(labelA fieldA: Int, labelB fieldB: Int)
fun events() {
emit FooEvent(x: 1, y: 2)
// Emit event with explicit argument labels
// Note that the emitted event will only contain the field names,
// not the argument labels used at the invocation site.
emit BarEvent(labelA: 1, labelB: 2)
}
}
イベントの発信には、以下の制限があります。
- イベントはemitステートメントの中でのみ呼び出すことができます。つまり、イベントを変数に割り当てたり、関数のパラメータとして使用することはできません。
- イベントは、宣言された場所(スマートコントラクト)からしか発信できません。
翻訳元->https://cadence-lang.org/docs/language/events