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