---
title: "Solidityのイベントとは?"
description: "Solidityのイベントの仕組みを学ぶ"
---

# Solidityのイベントとは?

[Solidity](https://www.alchemy.com/overviews/solidity)のイベントは、スマートコントラクト開発者にとって重要な機能です。変数をインデックス化してストレージの状態を再構築したり、ユーザーインターフェースを自動的に更新したり、特定の変数のテストを可能にしたりするためです。この記事では、Solidityイベントについての理解を深め、[Solidityプログラミング言語への理解をさらに深める](https://www.alchemy.com/university/courses/solidity?a=d7f2788ae5)手助けをします。

まずSolidityイベントについて紹介し、その分類をいくつか示した上で、例を挙げていきます。この記事を読み終える頃には、次のプロジェクトのためにSolidityイベントを作成できるようになっているでしょう。

## **Solidityにおけるイベントとは何か**

**Solidityにおいて、イベントとはスマートコントラクトが発行できる、発信されるシグナルのことです。** イベントを呼び出すと、その引数がトランザクションのログ（ブロックチェーン上の特殊なデータ構造）に保存されます。イベントは、リスニングしているフロントエンドのウェブサイトやクライアントアプリケーションなど、外部のユーザーに対して、ブロックチェーン上で何かが起きたことを通知します。

### **Solidityにおけるイベントと関数の違いは何か**

**関数とイベントはどちらも引数を受け取り、呼び出すことができますが、関数はスマートコントラクトを直接変更するのに対し、イベントはブロックチェーンの外部にあるサービスに何かが起きたことを知らせる役割を持ちます。**

[Solidityにおける関数](https://www.alchemy.com/overviews/solidity-functions)は、開発者がスマートコントラクト内のデータを読み取り、書き込み、変更、保存することを可能にします。関数には引数やパラメータを渡すことができます。また、コード内で必要なときにいつでも関数を呼び出すことができます。

イベントも引数を受け取りますが、これらはトランザクションのログに保存され、スマートコントラクトからはアクセスできません。コントラクトのデータは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エンコード](https://www.alchemy.com/overviews/solidity-abi)されます。これらのパラメータはイベントのバイト配列を構成します。データはその型に従ってエンコードされ、スキーマに従ってデコードすることができます。

indexedパラメータは「topics」とも呼ばれ、イベントの中で検索可能なパラメータです。indexedパラメータを使うことで、それらをフィルタとしてイベントを検索できるようになります。イベントが匿名かどうかに応じて、最大4つまたは3つのパラメータにindexed属性を付与できます。

## **Solidityにおいてイベントはどのように動作するのか**

**Solidityのイベントは、宣言され、発行され、登録されます。**

1. まず、Solidityにおいて _event_ キーワードでイベントの型を宣言する必要があります。
1. 次に、emitキーワードを使ってイベントを発行する必要があります。
1. ブロックチェーン上で何かが変化するたびに、プログラムは自動的にこの変化を登録し、イベントをトリガーします。

**注：** 宣言後にイベントを発行することで、[Web3.js](https://www.alchemy.com/dapps/web3-js)やEthers.jsなどのライブラリを使い、アプリケーションからそのイベントを「リッスン」できるようになります。

### **Solidityにおいてイベントはどのように宣言するのか**

**イベントの宣言には、イベントの名前と、イベントがトリガーされたときに保存したいパラメータが含まれます。**

まず、Solidityでイベントを宣言する必要があります。その後、_emit_ キーワードを使ってイベントを発行します。

以下は、イベントを宣言する方法の例です。

このイベントは、トリガーされると、ブロックチェーン上で何かが変化したことを外部アプリケーションに知らせます。

### **Solidityにおいてイベントはどのように発行するのか**

イベントを定義した後は、_emit_ キーワードを使ってイベントをトリガーできます。イベントが発行されると、渡された引数はトランザクションログに保存されます。

以下の構文は、Solidityでemitを使う方法を示しています。

## **Solidityでイベントをリッスンする方法**

イベントが発行された後は、[ethers.js](https://www.alchemy.com/dapps/ethers-js)を使ってこれらのイベントを購読し、リッスンできます。そうすることで、[アプリ](https://www.alchemy.com/dapps/top/defi-dapps)や、Ethereum JSON-RPC APIに接続されたあらゆるものが、これらのイベントをリッスンし、それに応じた処理を行うことができます。

### **Solidityイベントの例**

以下のサンプルコードは、送金用のイベントを定義し、発行します。このコードはEthereumの送金アプリケーションに応用できるもので、送金が行われるとイベントがトリガーされます。イベントがトリガーされた際に、送金が行われたことを示すようユーザーインターフェースを更新するコードを追加することもできます。

<ImageBlock
  src="https://media.alchemy.com/1703866327-solidity-event-example.png"
  alt="スマートコントラクトでTransferイベントを定義しemitするSolidityコードサンプル"
  width={1600}
  height={743}
  caption="transferイベントを定義してemitする"
/>

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

<ImageBlock
  src="https://media.alchemy.com/1703866441-solidity-event-with-two-parameters.png"
  alt="2つのパラメータ(送信者アドレスとメッセージ文字列)を持つイベントのSolidityコードサンプル"
  width={1558}
  height={890}
  caption="2つのパラメータを持つイベント"
/>

## **Solidityについてさらに学ぶ**

この記事では、Solidityイベントについて紹介し、次のプロジェクトで活用できる説明とリソースを提供しました。Solidityイベントを使うことで、効率的なスマートコントラクトをより簡単に作成できるようになります。

Solidity言語を初めて学ぶ方で、最初のスマートコントラクトを構築したいと考えている場合は、Alchemy Universityが提供する無料の7週間の[オンラインSolidityプログラミングコース](https://www.alchemy.com/university/courses/solidity?a=d7f2788ae5)に、ぜひ参加登録してください。
