8.2 什么是事件主题

主题是用来把事件索引化(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 }); })();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值