想知道更多區塊鏈技術知識,請百度【鏈客區塊鏈技術問答社區】 鏈客,有問必答!!
什麼是事件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);
}
監聽事件
經過上面的介紹,可能你們仍是不清楚事件有什麼做用,點擊」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 {html
fName = _fName; age = _age; emit Instructor(_fName, _age);
}
在Web3與智能合約交互實戰, 點擊」Updata Info」按鈕以後,會調用setInfo函數,函數時觸發Instructor事件。
使用Web3監聽事件,刷新UI
如今須要使用Web3監聽事件,刷新UI。
先回顧下以前的使用Web3和智能合約交互的代碼:
<script>
if (typeof web3 !== 'undefined') {
web3 = new Web3(web3.currentProvider);
} else
{
web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
}
web3.eth.defaultAccount = web3.eth.accounts[0];
var infoContract = web3.eth.contract(ABI INFO);
var info = infoContract.at('CONTRACT ADDRESS');
info.getInfo(function(error, result){
if(!error)
{
$("#info").html(result[0]+' ('+result[1]+' years old)');
console.log(result);
}
else
console.error(error);
});
$("#button").click(function() {
info.setInfo($("#name").val(), $("#age").val());
});
</script>
如今能夠不須要 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);
}
});web