LoginSignup
44
37

More than 5 years have passed since last update.

Ethereumでコントラクトの監視 - Event -

Last updated at Posted at 2016-01-03

(注)変更点: 2018.10.18

  • 記事内容が古かったため、イベント発火の記法について現在のバージョン(solidity v0.4.16)に対応しました。
    イベント発火には emit EventName(...)のようにemitを明示的につけることが推奨されているようです。

  • 本文中で使用しているCosmo Editorは、現在では使われてないようですので、 Remixなどを使うことをオススメします。

Solidityによるスマートコントラクトの監視

今回はSolidityのコードを書いてメソッドを実行、そして実行の監視をしてみます。

試すコントラクトはこちら↓

SimpleStorage.sol
contract SimpleStorage {
    bytes32 storedData;
    //イベント設置
    event Set(address from,bytes32 stored);

    function set(bytes32 x) {
        storedData = x;

        //イベント発火
        Set(msg.sender,x);
    }
    function get() constant returns (bytes32 retVal) {
        return storedData;
    }
}    

イベント定義部分

 event Set(address from,bytes32 stored);

setメソッドに付随するイベントを定義

引数は任意の変数。ここに書いた変数の値がイベント発火時に渡される

イベント発火部分

    function set(bytes32 x) {
        storedData = x;

        //イベント発火
        emit Set(msg.sender,x);
    }

ここではSet()に値を渡す。第1引数msg.senderはメソッド呼び出し元のアドレス,xは与えた値

イベント監視

event-watch.js
var Web3 = require('web3');
var web3 = new Web3();

web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545");

//simplestorageのABI
var ABI = require('./simplestorage.json');

//デプロイしたアドレス
var address = '0xf9f0ce2e38fbe115d2500606ebd7750f8876c8cc
';

var simpleStorage = web3.eth.contract(ABI).at(address);
var event = simpleStorage.Set();
//イベント監視
event.watch(function (error, result) {
 console.log('watching "Set" event!');
  if (!error)
    console.log(result);
});

cosmo editorを使用したデプロイ

160103-0001.png

//ローカルのコマンドラインでイベント監視スクリプト実行
node event-watch.js

cosmoからsetメソッドで値をセットする。

"hello eth!"をsetする。(transactionの送信)

160103-0003.png

数十秒待つとターミナルでSetイベントが表示された!!

160103-0004.png

argsの中身が送信内容
fromが送信元アドレス ,storedが変数に保存した値。

args: 
   { from: '0x2a595f16eee4cb0c17d9a2d939b3c10f6c677243',
     stored: '0x68656c6c6f206574682100000000000000000000000000000000000000000000' }

このままだと16進数なので、ASCIIコードに変換してみると・・・・
160103-0006.png

"hello eth!"と表示されました。

トランザクションはこちらでも確認できます
https://www.etherchain.org/account/0xf9f0ce2e38fbe115d2500606ebd7750f8876c8cc#txreceived

以上がコントラクトのイベント監視の流れです。他にもAPIにはfilterなどのメソッドで同様の機能があるようです。

44
37
2

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
44
37