不管是充值,提款,以及創(chuàng)建合約,創(chuàng)建Token等,鏈上的一些行為需要通知璉下中心化服務(wù)的。都可以通過(guò)觸發(fā)事件來(lái)告知璉下調(diào)用者。是以日志的形式存在當(dāng)前區(qū)塊里,是永久存在的。
Events:允許在區(qū)塊鏈上輸出log日志。先自定義event,然后用emit來(lái)輸出。indexed是指有序的,按指數(shù)排列的。地址參數(shù)必須添加indexed,如果不添加會(huì)報(bào)gas需求是無(wú)限,無(wú)法運(yùn)行。
indexed屬性在solidity事件中非常重要【過(guò)濾當(dāng)前事件名中,設(shè)置了為indexed索引參數(shù)值,作為條件判斷篩選】,最多只有3個(gè)參數(shù)可以加這個(gè)關(guān)鍵字

1,響應(yīng):應(yīng)用程序(ether.js)可以通過(guò)RPC接口訂閱和監(jiān)聽(tīng)這些事件,并在前端做響應(yīng)。
2,經(jīng)濟(jì):事件是EVM上比較經(jīng)濟(jì)的存儲(chǔ)數(shù)據(jù)的方式,每個(gè)大概消耗2,000?gas;相比之下,鏈上存儲(chǔ)一個(gè)新變量至少需要20,000?gas。
規(guī)則:事件的聲明由event關(guān)鍵字開(kāi)頭,然后跟事件名稱,括號(hào)里面寫(xiě)好事件需要記錄的變量類型和變量名。以ERC20代幣合約的Transfer事件為例:event Transfer(address indexed from, address indexed to, uint256 value); 我們可以看到,Transfer事件共記錄了3個(gè)變量from,to和value,分別對(duì)應(yīng)代幣的轉(zhuǎn)賬地址,接收地址和轉(zhuǎn)賬數(shù)量。
????????同時(shí)from和to前面帶著indexed關(guān)鍵字,每個(gè)indexed標(biāo)記的變量可以理解為檢索事件的索引“鍵”,在以太坊上單獨(dú)作為一個(gè)topic進(jìn)行存儲(chǔ)和索引,程序可以輕松的篩選出特定轉(zhuǎn)賬地址和接收地址的轉(zhuǎn)賬事件。每個(gè)事件最多有3個(gè)帶indexed的變量。每個(gè)?indexed?變量的大小為固定的256比特。事件的哈希以及這三個(gè)帶indexed的變量在EVM日志中通常被存儲(chǔ)為topic。其中topic[0]是此事件的keccak256哈希,topic[1]到topic[3]存儲(chǔ)了帶indexed變量的keccak256哈希。

????????value?不帶?indexed?關(guān)鍵字,會(huì)存儲(chǔ)在事件的?data?部分中,可以理解為事件的“值”。data?部分的變量不能被直接檢索,但可以存儲(chǔ)任意大小的數(shù)據(jù)。因此一般?data?部分可以用來(lái)存儲(chǔ)復(fù)雜的數(shù)據(jù)結(jié)構(gòu),例如數(shù)組和字符串等等,因?yàn)檫@些數(shù)據(jù)超過(guò)了256比特,即使存儲(chǔ)在事件的?topic?部分中,也是以哈希的方式存儲(chǔ)。另外,data?部分的變量在存儲(chǔ)上消耗的gas相比于?topic?更少。
????????我們可以在函數(shù)里釋放事件。在下面的例子中,每次用_transfer()函數(shù)進(jìn)行轉(zhuǎn)賬操作的時(shí)候,都會(huì)釋放Transfer事件,并記錄相應(yīng)的變量。

????????在etherscan上查詢事件:我們嘗試用_transfer()函數(shù)在Rinkeby測(cè)試網(wǎng)絡(luò)上轉(zhuǎn)賬100代幣,可以在etherscan上查詢到相應(yīng)的tx:網(wǎng)址。
????????點(diǎn)擊Logs按鈕,就能看到事件明細(xì):

總結(jié):這一講,我們介紹了如何使用和查詢solidity中的事件。很多鏈上分析工具包括Nansen和Dune Analysis都是基于事件工作的。
我是溫馭臣,一個(gè)Solidity的開(kāi)發(fā)學(xué)習(xí)者,以上是我的簡(jiǎn)單總結(jié),如果有缺陷,希望在評(píng)論區(qū)看到您的補(bǔ)充。