Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

(注)変更点: 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などのメソッドで同様の機能があるようです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away