上節咱們介紹了事件的定義、做用,以及在和前端交互時的示例。那麼就會有一個疑問:事件保存的日誌如何查看,這就是本文須要講的內容前端
承接上篇文章,事件定義以下:json
contract MetaCoin { // 定義事件 event Transfer(address indexed _from, address indexed _to, uint256 _value); function sendCoin(address receiver, uint amount) public returns(bool sufficient) { if (balances[msg.sender] < amount) return false; balances[msg.sender] -= amount; balances[receiver] += amount; // 觸發事件 emit Transfer(msg.sender, receiver, amount); return true; } }
因爲日誌不可被任何合約訪問,那麼咱們應該如何查找日誌了。儘管solidity沒有提供查詢日誌的api,可是監聽日誌時,提供了filter功能,經過filter咱們就能夠完成查詢日誌的需求。
在監聽事件時,有三個參數能夠指定。上一篇文章中,咱們只指定了一個call function參數,另外兩個參數分別是:須要過濾的參數值和額外的filter參數,以下所示:segmentfault
// 寫法一 var event = myContract.Transfer(object1, object2); event.watch(callfunction) // 寫法二 var event = myContract.Transfer(object1, object2, callfunction);
參數解釋:
一、object1
:json對象,添加indexed
屬性的參數值,這裏須要填具體的值,例如上面的例子,咱們能夠過濾由指定地址發出的交易{'_from': '0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E'}
二、object2
:json對象,額外的filter參數,由solidit提供,能夠指定的參數有:
fromBlock
:數字或字符串,默認爲latest,指定過濾的起始位置,值爲塊的編號
toBlock
:數字或字符串,默認爲latest,指定過濾的結束位置,值爲塊的編號
address
:字符串,接收指定帳戶地址發出的event
topics
:字符串數組,接收指定topic的event。若是是非匿名事件,其中一個topic就是事件簽名:Transfer(address,address,uint)
,匿名事件是沒法經過topic來過濾
三、callfunction
:回調函數function(error, result){...}
api
完整代碼以下:數組
MetaCoin.deployed().then(function (instance) { var obj1 = var event = instance.Transfer({}function (error, result) { // 只監聽向0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E地址轉帳的事件 var obj1 = { '_to': '0x84d939AD8034c3ce2A7D4D100b939d4523b9E46E', } // block過濾範圍0-latest var obj2 = { 'fromBlock': 0, 'toBlock': 'latest' } var event = instance.Transfer(obj1, obj2) event.watch(function (error, result) { console.log('transfer log begin') console.log(JSON.stringify(result)) console.log('transfer log end') }) }).then(function (value) { console.log(value) }).catch(function (e) { console.log(e) })