【Solidity】第4章第9回:イベント(event)の定義と活用

本記事では、Solidityにおけるイベント(event)の基本的な使い方について解説します。イベントは、ブロックチェーン上のトランザクションに関する情報を記録し、効率的なデータモニタリングを可能にします。
0. 記事の概要
この記事を読むメリット
- イベントの基礎理解:イベントの定義と使用方法を学べます。
- データモニタリング力の向上:ブロックチェーン上でのデータ追跡が可能になります。
- 実践的な活用法:イベントを活用したコントラクト設計を習得します。
この記事で学べること
- イベントの基本構文と定義方法
- イベントを使ったデータ追跡の実例
- イベントの使用時の注意点
1. イベント(event)とは?

1.1 イベントの概要
イベントは、スマートコントラクト内で発生したアクションをEVM(Ethereum Virtual Machine)が記録し、外部アプリケーションがそのデータをモニタリングできる仕組みです。
1.2 イベントの基本構文
// イベントの基本例
contract EventExample {
event Transfer(address indexed from, address indexed to, uint256 value);
function transfer(address to, uint256 value) public {
emit Transfer(msg.sender, to, value);
}
}
動作解説
このコードでは、Transfer
というイベントを定義し、emit
キーワードを使ってイベントを発生させています。indexed
修飾子を使用することで、検索が効率的になります。
2. イベントの活用例

2.1 トークン送信の記録
// トークン送信を記録するイベント
contract TokenTransfer {
event Transfer(address indexed from, address indexed to, uint256 value);
mapping(address => uint256) public balances;
function transfer(address to, uint256 value) public {
require(balances[msg.sender] >= value, "残高不足です");
balances[msg.sender] -= value;
balances[to] += value;
emit Transfer(msg.sender, to, value);
}
}
動作解説
このコードでは、トークン送信時にTransfer
イベントを発生させ、送信元、送信先、送信額を記録します。
2.2 オークションの入札履歴
// オークションの入札履歴
contract Auction {
event BidPlaced(address indexed bidder, uint256 amount);
function placeBid(uint256 amount) public {
emit BidPlaced(msg.sender, amount);
}
}
動作解説
このコードでは、オークションでの入札ごとにBidPlaced
イベントを発生させ、入札者と入札額を記録します。
3. よくあるエラーとその解決策
3.1 インデックスの制限
イベントでは、indexed
を使用して効率的な検索を可能にできますが、最大で3つのパラメータしかインデックス化できません。これを超える場合は、他の方法でデータを記録する必要があります。
3.2 過剰なイベント使用
過剰にイベントを使用すると、トランザクションコストが増加します。本当に必要なデータのみ記録することが推奨されます。
4. 練習問題

以下の課題に挑戦してみましょう:
- 送金履歴を記録するイベントを実装してください。
- 商品の購入履歴をイベントで記録するスマートコントラクトを作成してください。
5. まとめ
本記事では、Solidityのイベントの定義と活用方法について学びました。イベントを適切に使用することで、ブロックチェーン上のデータを効率的に記録およびモニタリングできます。