メインコンテンツへスキップ

イベントを使用して、スマートコントラクトのデータをログに記録する

スマートコントラクト
Remix
Solidity
イベント
中級
jdourlens
2020年4月3日
4 分の読書

Solidityでは、イベントはスマートコントラクトが発行できるディスパッチされたシグナルです。 Dapps、またはイーサリアムのJSON-RPC APIに接続されたあらゆるものは、これらのイベントをリッスンして、それに応じて動作することができます。 イベントにインデックスを付けることで、後でイベント履歴を検索できるようになります。

イベント

この記事を書いている時点でイーサリアムブロックチェーンで最も一般的なイベントは、誰かがトークンを転送するときにERC20トークンによって発行されるTransferイベントです。

1event Transfer(address indexed from, address indexed to, uint256 value);

イベントの署名はコントラクトのコード内で宣言され、emitキーワードと共に発行されます。 例えば、転送イベントでは、この転送における送信元(from)、送信先(to)、および送信したトークン量(value)のログが記録されます。

Counterスマートコントラクトに戻り、値が変更されるたびにログを記録することにしたと仮定しましょう。 このコントラクトは、デプロイを目的とせず、別のコントラクトを拡張する土台の役割を担うため、抽象コントラクトと呼びます。 カウンターの例では、このようになります:

1pragma solidity 0.5.17;
2
3contract Counter {
4
5 event ValueChanged(uint oldValue, uint256 newValue);
6
7 // カウント数を保持するための符号なし整数のプライベート変数
8 uint256 private count = 0;
9
10 // カウンターをインクリメントする関数
11 function increment() public {
12 count += 1;
13 emit ValueChanged(count - 1, count);
14 }
15
16 // カウント値を取得するためのゲッター
17 function getCount() public view returns (uint256) {
18 return count;
19 }
20
21}
すべて表示

注意:

  • 5行目: イベントと、それに含まれる古い値および新しい値を宣言します。

  • 13行目: count変数をインクリメントするときに、イベントを発行します。

このコントラクトをデプロイしてインクリメント関数を呼び出し、ログという名前の配列にある新しいトランザクションをクリックすると、Remixが自動的にこのイベントを表示します。

Remixのスクリーンショット

ログは、スマートコントラクトをデバッグするのにとても役立つだけでなく、様々な人々が利用するアプリケーションを開発する際も、あなたのスマートコントラクトがどのように使用されているかを追跡し、理解するためのアナリティクスを構築する上で非常に重要です。 トランザクションで生成されたログは一般的なブロックエクスプローラーに表示されるので、これを使って特定のイベントをリッスンするためのオフチェーン用スクリプトを作成し、イベント発生時にアクションを実行することができます。

最終更新: 2025年2月12日

このチュートリアルは役に立ちましたか?