イベントを使用して、スマートコントラクトのデータをログに記録する
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;23contract Counter {45 event ValueChanged(uint oldValue, uint256 newValue);67 // Private variable of type unsigned int to keep the number of counts8 uint256 private count = 0;910 // Function that increments our counter11 function increment() public {12 count += 1;13 emit ValueChanged(count - 1, count);14 }1516 // Getter to get the count value17 function getCount() public view returns (uint256) {18 return count;19 }2021}すべて表示コピー
注意:
5行目:イベントを宣言し、イベントに含まれる古い値と新しい値を宣言します。
13行目:カウントの変数が1増えるごとに、イベントが発行されます。
このコントラクトをデプロイしてインクリメント関数を呼び出し、ログという名前の配列にある新しいトランザクションをクリックすると、Remixが自動的にこのイベントを表示します。
ログは、スマートコントラクトをデバッグするのにとても役立つだけでなく、様々な人々が利用するアプリケーションを開発する際も、あなたのスマートコントラクトがどのように使用されているかを追跡し、理解するためのアナリティクスを構築する上で非常に重要です。 トランザクションで生成されたログは一般的なブロックエクスプローラーに表示されるので、これを使って特定のイベントをリッスンするためのオフチェーン用スクリプトを作成し、イベント発生時にアクションを実行することができます。
最終編集者: @nhsz(opens in a new tab), 2023年8月15日