Edited at

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


(注)変更点: 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を使用したデプロイ

//ローカルのコマンドラインでイベント監視スクリプト実行

node event-watch.js


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

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


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

argsの中身が送信内容

fromが送信元アドレス ,storedが変数に保存した値。

args: 

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

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

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

トランザクションはこちらでも確認できます

https://www.etherchain.org/account/0xf9f0ce2e38fbe115d2500606ebd7750f8876c8cc#txreceived

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