完全搞懂事件

來源:互聯網
上載者:User

標籤:沒有   test   實戰   語言   returns   組成   function   int   關聯   

詳解 Solidity 事件Event - 完全搞懂事件的使用
很多同學對Solidity 中的Event有疑問,這篇文章就來詳細的看看Solidity 中Event到底有什麼用?

寫在前面
Solidity 是以太坊智能合約程式設計語言,閱讀本文前,你應該對以太坊、智能合約有所瞭解,如果你還不瞭解,建議你先看以太坊是什麼,另外
本文在監聽合約事件是對上一篇Web3與智能合約互動實戰進行補充,如果閱讀了上一篇可以更好的理解本文。

什麼是事件Evnet
事件是以太坊虛擬機器(EVM)日誌基礎設施提供的一個便利介面。當被發送事件(調用)時,會觸發參數儲存到交易的日誌中(一種區塊鏈上的特殊資料結構)。這些日誌與合約的地址關聯,並記錄到區塊鏈中.
來捋這個關係:區塊鏈是打包一系列交易的區塊組成的鏈條,每一個交易“收據”會包含0到多個日誌記錄,日誌代表著智能合約所觸發的事件。

在DAPP的應用中,如果監聽了某事件,當事件發生時,會進行回調。
不過要注意:日誌和事件在合約內是無法被訪問的,即使是建立日誌的合約。

在Solidity 代碼中,使用event 關鍵字來定義一個事件,如:

event EventName(address bidder, uint amount);
這個用法和定義函數式一樣的,並且事件在合約中同樣可以被繼承。觸發一個事件使用emit(說明,之前的版本裡並不需要使用emit),如:

emit EventName(msg.sender, msg.value);
觸發事件可以在任何函數中調用,如:

function testEvent() public {

// 觸發一個事件 emit EventName(msg.sender, msg.value); 

}
監聽事件
通過上面的介紹,可能大家還是不清楚事件有什麼作用,如果你跟過Web3與智能合約互動實戰這篇文章,你會發現點擊”Updata Info”按鈕之後,雖然調用智能合約成功,但是當前的介面並沒有得到更新。
使用事件監聽,就可以很好的解決這個問題,讓看看如何?。

修改合約,定義事件及觸發事件
先回顧一下合約代碼:

pragma solidity ^0.4.21;

contract InfoContract {

string fName;
uint age;

function setInfo(string _fName, uint _age) public {
fName = _fName;
age = _age;
}

function getInfo() public constant returns (string, uint) {
return (fName, age);
}
}
首先,需要定義一個事件:

event Instructor(
string name,
uint age
);
這個事件中,會接受兩個參數:name 和 age , 也就是需要跟蹤的兩個資訊。

然後,需要在setInfo函數中,觸發Instructor事件,如:

function setInfo(string _fName, uint _age) public {
fName = _fName;
age = _age;
emit Instructor(_fName, _age);
}
在Web3與智能合約互動實戰, 點擊”Updata Info”按鈕之後,會調用setInfo函數,函數時觸發Instructor事件。

使用Web3監聽事件,重新整理UI
現在需要使用Web3監聽事件,重新整理UI。
先回顧下之前的使用Web3和智能合約互動的代碼:

現在可以不需要 info.getInfo()來擷取資訊,而改用監聽事件擷取資訊,先定義一個變數引用事件:

var instructorEvent = info.Instructor();
然後使用.watch()方法來添加一個回呼函數:

instructorEvent.watch(function(error, result) {
if (!error)
{
$("#info").html(result.args.name + ‘ (‘ + result.args.age + ‘ years old)‘);
} else {
console.log(error);
}
});
代碼更新之後,可以在瀏覽器查看效果,這是點擊”Updata Info”按鈕之後,會及時更新介面,

完整的代碼請訂閱小專欄區塊鏈技術查看。

事件進階用法-過濾器
有時我們會有這樣的需求:擷取當前所有姓名及年齡記錄,或者是,要過濾出年齡28歲的記錄,應該如何做呢?
以及另外一個常見的情境:想要擷取到代幣合約中所有的轉賬記錄,也同樣需要使用事件過濾器功能,這部分內容請大家訂閱小專欄區塊鏈技術閱讀。

如果你想學習以太坊DApp開發,這門視頻課程以太坊DAPP開發實戰是你不錯的選擇。

參考文章
https://coursetro.com/posts/code/100/Solidity-Events-Tutorial---Using-Web3.js-to-Listen-for-Smart-Contract-Events
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events

深入淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術部落格。
如果你想和我有密切的聯絡,歡迎加入知識星球深入淺出區塊鏈,我會在星球為大家解答技術問題,作為星友福利,星友可加入我建立的區塊鏈技術群,群內已經聚集了300多位區塊鏈技術牛人和愛好者。

完全搞懂事件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.