(注)変更点: 2018.10.18
- 
記事内容が古かったため、イベント発火の記法について現在のバージョン(solidity v0.4.16)に対応しました。 
 イベント発火にはemit EventName(...)のようにemitを明示的につけることが推奨されているようです。
- 
本文中で使用しているCosmo Editorは、現在では使われてないようですので、 Remixなどを使うことをオススメします。 
Solidityによるスマートコントラクトの監視
今回はSolidityのコードを書いてメソッドを実行、そして実行の監視をしてみます。
- 
Solidityの詳細解説ページ 
 http://solidity.readthedocs.org/en/latest/contracts.html#events
- 
Ethereum JavaScript API document(eventメソッド) 
 https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events
試すコントラクトはこちら↓
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は与えた値
イベント監視
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などのメソッドで同様の機能があるようです。


