8.2 什麼是事件主題

xiaohuanglv發表於2018-09-15

主題是用來把事件索引化(index)的數值。沒有主題,就不能搜尋事件。只要呼叫一個事件,就生成一個預設主題(被視為事件的第一個主題)。一個事件最多可以有四個主題。主題總是按照相同順序生成。可以使用一個或者多個主題檢索事件。

第一個主題是事件簽名。剩下三個主題是索引化的引數數值。如果引數是字串、位元組或者陣列,則主題是它的keccak-256雜湊。

下面通過一個例子來幫助讀者理解主題的含義。假設有一個事件採用這個形式:

image.png

這裡共生成如下四個主題:

·0xb62a11697c0f56e93f3957c088d492b505b9edd7fb6e7872a93b41cdb2020644。 這是第一個主題,它用web3.sha3("ping(string,int256,uint256,string,int256)")生成。可以看到所 有型別都採用規範格式。

·0x30ee7c926ebaf578d95b278d78bc0cde445887b0638870a26dcab901ba21d3f2。這是第二個主題,它用web3.sha3("RandomString")生成。

·第三個和第四個主題分別是 0x000000000000000000000000000000000000000000000000000000000000000c和 0x0000000000000000000000000000000000000000000000000000000000000017,即以十六進 製表示的數值。它們分別用EthJS.Util.bufferToHex(EthJS.Util.setLengthLeft(12,32))和 EthJS.Util.bufferToHex(EthJS.Util.setLengthLeft(23,32))計算。

以太坊節點將在內部使用主題建立索引,這樣很容易基於簽名和索引化的數值找到事件。

假設想獲取前面事件的事件呼叫,其中第一個實參是Random String,第三個實參是23或者78,則可以用web3.eth.getFilter找到它們:

image.png

所以這裡讓節點從區塊鏈返回0x853cdcb4af7a6995808308b08bb78a74de1ef899 合約地址發出的全部事件,其第一個主題是 0xb62a11697c0f56e93f3957c088d492b505b9edd7fb6e7872a93b41cdb2020644,第二個主題 是0x30ee7c926ebaf578d95b278d78bc0cde445887b0638870a26dcab901ba21d3f2,第三個主 題是0x0000000000000000000000000000000000000000000000000000000000000017或者 0x000000000000000000000000000000000000000000000000000000000000004e。

spacer.gif在程式程式碼中,注意主題陣列數值的順序。順序很重要。


來源:我是碼農,轉載請保留出處和連結!

本文連結:http://www.54manong.com/?id=542

'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();

相關文章