Solidityのイベントとは?
執筆者 Alchemy
Solidityのイベントは、スマートコントラクト開発者にとって重要な機能です。変数をインデックス化してストレージの状態を再構築したり、ユーザーインターフェースを自動的に更新したり、特定の変数のテストを可能にしたりするためです。この記事では、Solidityイベントについての理解を深め、Solidityプログラミング言語への理解をさらに深める手助けをします。
まずSolidityイベントについて紹介し、その分類をいくつか示した上で、例を挙げていきます。この記事を読み終える頃には、次のプロジェクトのためにSolidityイベントを作成できるようになっているでしょう。
Solidityにおけるイベントとは何か
Solidityにおいて、イベントとはスマートコントラクトが発行できる、発信されるシグナルのことです。 イベントを呼び出すと、その引数がトランザクションのログ(ブロックチェーン上の特殊なデータ構造)に保存されます。イベントは、リスニングしているフロントエンドのウェブサイトやクライアントアプリケーションなど、外部のユーザーに対して、ブロックチェーン上で何かが起きたことを通知します。
Solidityにおけるイベントと関数の違いは何か
関数とイベントはどちらも引数を受け取り、呼び出すことができますが、関数はスマートコントラクトを直接変更するのに対し、イベントはブロックチェーンの外部にあるサービスに何かが起きたことを知らせる役割を持ちます。
Solidityにおける関数は、開発者がスマートコントラクト内のデータを読み取り、書き込み、変更、保存することを可能にします。関数には引数やパラメータを渡すことができます。また、コード内で必要なときにいつでも関数を呼び出すことができます。
イベントも引数を受け取りますが、これらはトランザクションのログに保存され、スマートコントラクトからはアクセスできません。コントラクトのデータはStates trieに保存されますが、イベントデータはTransaction Receipts trieに保存されるため、コントラクトはイベントデータを読み取ることができません。
関数と同様に、イベントも呼び出すことができます。ただし、イベントの呼び出し(発行)には emit キーワードが使用されます。これにより、開発者はイベントや関数がいつ呼び出されているかを把握できます。
イベントとログの関係は何か
Ethereumのログデータ構造は、イベントによって発行されたデータを保存します。
Ethereum Virtual Machine(EVM)には、Solidityイベントを含むデータをスマートコントラクトの外部にある構造に書き込むためのロギング機能があります。
ログとイベントはしばしば同義語として扱われます。イベントを使うと、より多くのガスを消費するストレージ変数に情報を保存する代わりに、ロギング構造に情報を「出力」できるため、よりガス効率の良い方法となります。イベント(ログ)はTransaction Receipts trieに存在し、スマートコントラクトからはアクセスできません。
Solidityにおいてイベントはどのようにインデックス化されるのか
Solidityのイベントは、EVMのロギング機能とのインターフェースです。 最大3つのパラメータにindexed属性を付与できます。これにより、それらはログのdata部分ではなく、topics構造に格納されます。indexed属性を持たないパラメータは、ログのdata部分にABIエンコードされます。
Solidityイベントの種類
Solidityイベントには2種類あります。indexedのものと、そうでないものです。
パラメータにindexed属性がない場合、それらはログのdata部分にABIエンコードされます。これらのパラメータはイベントのバイト配列を構成します。データはその型に従ってエンコードされ、スキーマに従ってデコードすることができます。
indexedパラメータは「topics」とも呼ばれ、イベントの中で検索可能なパラメータです。indexedパラメータを使うことで、それらをフィルタとしてイベントを検索できるようになります。イベントが匿名かどうかに応じて、最大4つまたは3つのパラメータにindexed属性を付与できます。
Solidityにおいてイベントはどのように動作するのか
Solidityのイベントは、宣言され、発行され、登録されます。
- まず、Solidityにおいて event キーワードでイベントの型を宣言する必要があります。
- 次に、emitキーワードを使ってイベントを発行する必要があります。
- ブロックチェーン上で何かが変化するたびに、プログラムは自動的にこの変化を登録し、イベントをトリガーします。
注: 宣言後にイベントを発行することで、Web3.jsやEthers.jsなどのライブラリを使い、アプリケーションからそのイベントを「リッスン」できるようになります。
Solidityにおいてイベントはどのように宣言するのか
イベントの宣言には、イベントの名前と、イベントがトリガーされたときに保存したいパラメータが含まれます。
まず、Solidityでイベントを宣言する必要があります。その後、emit キーワードを使ってイベントを発行します。
以下は、イベントを宣言する方法の例です。
このイベントは、トリガーされると、ブロックチェーン上で何かが変化したことを外部アプリケーションに知らせます。
Solidityにおいてイベントはどのように発行するのか
イベントを定義した後は、emit キーワードを使ってイベントをトリガーできます。イベントが発行されると、渡された引数はトランザクションログに保存されます。
以下の構文は、Solidityでemitを使う方法を示しています。
Solidityでイベントをリッスンする方法
イベントが発行された後は、ethers.jsを使ってこれらのイベントを購読し、リッスンできます。そうすることで、アプリや、Ethereum JSON-RPC APIに接続されたあらゆるものが、これらのイベントをリッスンし、それに応じた処理を行うことができます。
Solidityイベントの例
以下のサンプルコードは、送金用のイベントを定義し、発行します。このコードはEthereumの送金アプリケーションに応用できるもので、送金が行われるとイベントがトリガーされます。イベントがトリガーされた際に、送金が行われたことを示すようユーザーインターフェースを更新するコードを追加することもできます。

次の例はSolidity by Exampleからのもので、送信者のアドレスと文字列メッセージという2つのパラメータを持つイベントを作成しています。トリガーされると、このイベントは「Hello World」と「Hello EVM」をログに記録します。

Solidityについてさらに学ぶ
この記事では、Solidityイベントについて紹介し、次のプロジェクトで活用できる説明とリソースを提供しました。Solidityイベントを使うことで、効率的なスマートコントラクトをより簡単に作成できるようになります。
Solidity言語を初めて学ぶ方で、最初のスマートコントラクトを構築したいと考えている場合は、Alchemy Universityが提供する無料の7週間のオンラインSolidityプログラミングコースに、ぜひ参加登録してください。
関連する概要

ブロックチェーンで魔法を生み出す
Alchemyは、最も強力なweb3開発者向けプロダクトとツールを、豊富なリソース、コミュニティ、そして卓越したサポートと組み合わせて提供します。


