事件是與以太坊虛擬機日志工具的方便接口,我們先明確事件,日志這兩個概念。事件發(fā)生后被記錄到區(qū)塊鏈上成為了日志??偟膩碚f,事件強調(diào)功能,一種行為;日志強調(diào)存儲,內(nèi)容。
事件是以太坊EVM提供的一種日志基礎設施。事件可以用來做操作記錄,存儲為日志。也可以用來實現(xiàn)一些交互功能,比如通知UI,返回函數(shù)調(diào)用結(jié)果等
事件
當定義的事件觸發(fā)時,我們可以將事件存儲到EVM的交易日志中,日志是區(qū)塊鏈中的一種特殊數(shù)據(jù)結(jié)構。日志與合約關聯(lián),與合約的存儲合并存入?yún)^(qū)塊鏈中。只要某個區(qū)塊可以訪問,其相關的日志就可以訪問。但在合約中,我們不能直接訪問日志和事件數(shù)據(jù)(即便是創(chuàng)建日志的合約)。事件是合約和區(qū)塊鏈通訊的一種機制。你的前端應用“監(jiān)聽”某些事件,并做出反應。下面我們來看看,如何在Solidity中實現(xiàn)一個事件:
pragma solidity ^0.4.14;
contract Transfer{
// 這里建立事件
event IntegersAdded(uint x, uint y, uint result);
function add(uint _x, uint _y) public {
uint result = _x + _y;
//觸發(fā)事件,通知app
emit IntegersAdded(_x, _y, result);
return result;
}
}
你的 app 前端可以監(jiān)聽這個事件。JavaScript 實現(xiàn)如下:
YourContract.IntegersAdded(function(error, result) {
// 干些事
}