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

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

スマートコントラクトRemixSolidityイベント
中級
jdourlens
EthereumDev(opens in a new tab)
2020年4月3日
3 分の読書 minute read
comp-tutorial-metadata-tip-author 0x19dE91Af973F404EDF5B4c093983a7c6E3EC8ccE

Solidityでは、スマートコントラクトがトリガーすることで送信される信号をイベントと呼びます。 Dappだけでなく、イーサリアムの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 // Private variable of type unsigned int to keep the number of counts
8 uint256 private count = 0;
9
10 // Function that increments our counter
11 function increment() public {
12 count += 1;
13 emit ValueChanged(count - 1, count);
14 }
15
16 // Getter to get the count value
17 function getCount() public view returns (uint256) {
18 return count;
19 }
20
21}
すべて表示
コピー

注意:

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

  • 13行目:カウントの変数が1増えるごとに、イベントが発行されます。

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

Remixのスクリーンショット

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

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