Indexed属性
可以在事件参数上增加indexed
属性,最多可以对三个参数增加这样的属性。加上这个属性,可以允许你在web3.js中通过对加了这个属性的参数进行值过滤,方式如下
var event = myContract.transfer({value: "100"});
上面实现的是对value
值为100
的日志,过滤后的返回。
如果你想同时匹配多个值,还可以传入一个要匹配的数组。
var event = myContract.transfer({value: ["99","100","101"]});
增加了indexed
的参数值会存到日志结构的Topic
部分,便于快速查找。而未加indexed
的参数值会存在data
部分,成为原始日志。需要注意的是,如果增加indexed
属性的是数组类型(包括string
和bytes
),那么只会在Topic
存储对应的数据的web3.sha3
哈希值,将不会再存原始数据。因为Topic是用于快速查找的,不能存任意长度的数据,所以通过Topic实际存的是数组这种非固定长度数据哈希结果。要查找时,是将要查找内容哈希后与Topic内容进行匹配,但我们不能反推哈希结果,从而得不到原始值
其它过滤参数
事件还支持传入其它参数对象来限定可检索的范围,支持fromBlock
,toBlock
等过滤条件,详见https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events,链接的第二个参数[^filter]。
var event = myContract.transfer({value: "100"}, {fromBlock: 0, toBlock: 'latest'});
上面的代码实现了从第一块开始搜索日志。