9
5

More than 5 years have 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

まとめ

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5