在 合约监听 的基础上,我们拓展一下,在监听的过程中增加过滤器,监听指定地址的转入转出。
过滤器
当合约创建日志(释放事件)时,它最多可以包含[4]条数据作为索引(indexed
)。索引数据经过哈希处理并包含在布隆过滤器中,这是一种允许有效过滤的数据结构。因此,一个事件过滤器最多包含4
个主题集,每个主题集是个条件,用于筛选目标事件。规则:
- 如果一个主题集为
null
,则该位置的日志主题不会被过滤,任何值都匹配。 - 如果主题集是单个值,则该位置的日志主题必须与该值匹配。
- 如果主题集是数组,则该位置的日志主题至少与数组中其中一个匹配。
构建过滤器
ethers.js
中的合约类提供了contract.filters
来简化过滤器的创建:
const filter = contract.filters.EVENT_NAME( ...args )
其中EVENT_NAME
为要过滤的事件名,..args
为主题集/条件。前面的规则有一点抽象,下面举几个例子。
-
过滤来自
myAddress
地址的Transfer
事件contract.filters.Transfer(myAddress)
-
过滤所有发给
myAddress
地址的Transfer
事件contract.filters.Transfer(null, myAddress)
-
过滤所有从
myAddress
发给otherAddress
的Transfer
事件contract.filters.Transfer(myAddress, otherAddress)
-
过滤所有发给
myAddress
或otherAddress
的Transfer
事件contract.filters.Transfer(null, [ myAddress, otherAddress ])