Solidity语法随笔(二)

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属性的是数组类型(包括stringbytes),那么只会在Topic存储对应的数据的web3.sha3哈希值,将不会再存原始数据。因为Topic是用于快速查找的,不能存任意长度的数据,所以通过Topic实际存的是数组这种非固定长度数据哈希结果。要查找时,是将要查找内容哈希后与Topic内容进行匹配,但我们不能反推哈希结果,从而得不到原始值

其它过滤参数

事件还支持传入其它参数对象来限定可检索的范围,支持fromBlocktoBlock等过滤条件,详见https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events,链接的第二个参数[^filter]。

var event = myContract.transfer({value: "100"}, {fromBlock: 0, toBlock: 'latest'});

上面的代码实现了从第一块开始搜索日志。

你可能感兴趣的:(Solidity语法随笔(二))