智能合約Solidity教程-事件和日誌(二)

  上節咱們介紹了事件的定義、做用,以及在和前端交互時的示例。那麼就會有一個疑問:事件保存的日誌如何查看,這就是本文須要講的內容前端

承接上篇文章,事件定義以下: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)
})



歡迎訂閱「K叔區塊鏈」 - 專一於區塊鏈技術學習

博客地址: http://www.jouypub.com
簡書主頁: https://www.jianshu.com/u/756c9c8ae984
segmentfault主頁: https://segmentfault.com/blog/jouypub
騰訊雲主頁: https://cloud.tencent.com/developer/column/72548
相關文章
相關標籤/搜索