More than 1 year has passed since last update.

イーサリアムのコントラクトのイベントについて、よく理解できてないので、調べてみました。


説明


  • イベントは、コントラクト上で発生したことをDAPPなどのクライアントに通知することができる

  • イベントが呼び出されると、実際渡された関数のパラメータをトランザクションのログに保持し、コントラクトのアドレスと関連を付けられる。


    • トランザクションがブロックに保持されるので、イベントも同じく、ブロックが存在している限り、イベントのログもずっと存在している

    • ただ、ログとイベントは、コントラクトから(コントラクトの作成者でも)直接にアクセスできない



  • イベントのパラメータは indexed で定義できる。indexed付けると、そのパラメータまたは特定の値に従ってフィルターできる


    • 配列の場合は、Keccak-256のハッシュ値で保持される


    • indexedついてないパラメータはログの一部として保持される




使ってみる

pragma solidity ^0.4.17;

contract MyToken {
event Deposit(
address indexed _from,
bytes32 indexed _id
);

function deposit(bytes32 _id) public {
// deposit pproc
// log
Deposit(msg.sender, _id);
}
}


  • Ganache起動してから、 Remix を 127.0.0.1:7545に接続しておく

  • 上記内容を Remix に貼り付けて、デプロイする

  • 上記内容ですと、deposit 関数を呼び出すと、添付画像のように、トランザクションのlogs項目に、ちゃんとイベント名とパラメータが保持されている

スクリーンショット 2017-12-22 23.37.41.png



  • Deposit(msg.sender, _id);をコメントアウトして、コントラクトを再度デプロイし、deposit 関数を呼び出すと、下記のように、logs項目が空になる

スクリーンショット 2017-12-22 23.37.53.png


まとめ


  • コントラクトの処理で、ちゃんとログを残したい場合は、イベントを活用しましょう。