在我之前的幾篇關(guān)于智能合約的文章中,都有提到事件的用法,比如:
event HighestBidIncreased(address bidder, uint amount);
event AuctionEnded(address winner, uint amount);
這里定義了兩個(gè)事件,分別表示最高競(jìng)價(jià)更新了和拍賣結(jié)束了。
然后在需要的位置,調(diào)用事件,比如:
function bid() external payable {
//省略其它邏輯
...
highestBidder = msg.sender;
highestBid = msg.value;
emit HighestBidIncreased(msg.sender, msg.value);
}
我們可以通過emit調(diào)用事件方法,然后這個(gè)事件就作為日志記錄到了以太坊區(qū)塊鏈中。日志是以太坊區(qū)塊鏈中一種特殊的數(shù)據(jù)結(jié)構(gòu),你可以把它當(dāng)作區(qū)塊鏈的一部分,只要區(qū)塊鏈在,日志就在。日志和產(chǎn)生它的智能合約的地址事綁定的。
寫了日志有啥用呢?它的作用就是可以被訂閱。很多智能合約項(xiàng)目都是傳統(tǒng)的web項(xiàng)目+智能合約的這種架構(gòu),業(yè)務(wù)系統(tǒng)有些在鏈外,那么鏈上發(fā)生的事情就可以基于這種發(fā)布訂閱機(jī)制進(jìn)行通知,從而打通鏈上和鏈下。
舉個(gè)例子,
contract ClientReceipt {
event Deposit(
address indexed from,
bytes32 indexed id,
uint value
);
function deposit(bytes32 id) public payable {
emit Deposit(msg.sender, id, msg.value);
}
}
上面定義了一個(gè)存錢的合約,存完錢發(fā)布一個(gè)事件。
然后我們可以通過javascript(web3.js)訂閱這個(gè)事件,
var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at("0x1234...ab67" /* address */);
var depositEvent = clientReceipt.Deposit();
// watch for changes
depositEvent.watch(function(error, result){
// result contains non-indexed arguments and topics
// given to the `Deposit` call.
if (!error)
console.log(result);
});
我們?cè)偕晕⑸钊胍稽c(diǎn)到虛擬機(jī)層面。我們知道以太坊的虛擬機(jī)是EVM,EVM的指令有幾種和日志相關(guān)的操作碼,分別是:LOG0,LOG1 , LOG2 , LOG3 和 LOG4。
日志的數(shù)據(jù)結(jié)構(gòu)包含主題和數(shù)據(jù)兩個(gè)部分,這里的1234代表的事日志包含的主題(topic)數(shù)量。如果你用過類似kafka,rocketmq等消息中間價(jià)一定對(duì)主題這個(gè)概念不陌生。主題是用來(lái)簡(jiǎn)單描述事件(日志)的,也可以用來(lái)過濾或者搜索日志。
比如我們有這樣一個(gè)事件定義:
event Transfer(address indexed _from, address indexed _to, uint256 _value);
用indexed修飾的參數(shù)會(huì)被作為主題,而沒有修飾的參數(shù)會(huì)作為日志的數(shù)據(jù)部分。在這個(gè)例子里面,意味著轉(zhuǎn)賬的發(fā)送方和接收方可以被搜索,而轉(zhuǎn)賬金額不能被搜索。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-787773.html
微信公眾號(hào):犀牛的技術(shù)筆記文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-787773.html
- https://learnblockchain.cn/2018/05/09/solidity-event/
- https://docs.soliditylang.org/en/develop/contracts.html?highlight=event#events
到了這里,關(guān)于徹底理解solidity中的事件的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!