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'});
上面的代码实现了从第一块开始搜索日志。