イベントとログ
動いた証拠を残す「ガコン」=イベント
自動販売機はジュースが売れると「ガコン」と音がします。あの音のおかげで、買った人は「ちゃんと動いた」とわかります。今回はコントラクトに、その「ガコン」——イベントを付けます。
イベント = コントラクトが出すお知らせ
イベントは、コントラクトが「こういうことが起きました」と外の世界へ知らせる仕組みです。
- お知らせはブロックチェーンのログ(記録帳)に残ります。あとから「いつ・何が起きたか」を調べられます
- 記録帳に書くだけなので、コントラクトの動きそのものは変えません
使い方は 2 段階です。
- 宣言:
event お知らせの名前(一緒に知らせたい値);— どんなお知らせを出せるか、先に決めておく - 発行:
emit お知らせの名前(実際の値);— 手順の中で、実際にお知らせを出す
売れたら知らせる自動販売機
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
contract VendingMachine {
uint256 public sold;
event Sold(uint256 total);
function buy() public {
sold += 1;
emit Sold(sold);
}
}
event Sold(uint256 total);= 「Sold(売れたよ)というお知らせを、累計本数と一緒に出します」という宣言sold += 1;=sold = sold + 1;の省略形。累計を 1 増やしますemit Sold(sold);= ここで実際にお知らせを発行。buyが呼ばれるたび、その時点の累計が記録帳に残ります
Lab でイベントを見る
Lab の実行画面で buy を実行すると、書き込みが確定した直後、ログ欄にこう出ます。
[send] ✅ buy: block=... gas=...
[event] Sold(total=1)
この [event] の行が、あなたのコントラクトが出した「ガコン」です。もう一度 buy を押せば Sold(total=2)。押した回数がブロックチェーンの記録帳に、消えない形で刻まれていきます。
:::note なぜイベントを使うの? アプリの画面(フロントエンド)は、このログを読んで「購入完了!」の表示を出したり、履歴一覧を作ったりします。「記録帳に残す専用の、軽くて安いお知らせ」として、実際の開発でも必ず使う道具です。この講座の総仕上げ(第9回)で読む PulseCheck も、イベントが主役です。 :::
今回覚えたこと
- イベント = コントラクトが外に出すお知らせ。ブロックチェーンのログ(記録帳)に残る
- event 名前(値); で宣言し、emit 名前(値); で発行する
- Lab では
[event]行として実行ログに表示される
次回は、記録をもっと便利にするデータ構造(mapping・struct・配列)です。「誰が何回買ったか」を人別に記録できるようになります。
:::tip Lab でやってみる
上のコードをデプロイして buy を 3 回実行。ログの [event] Sold(total=...) が 1→2→3 と増えること、sold() の読み取り結果と一致することを確かめましょう。操作方法: コントラクトを動かす の「イベントを確認する」
:::