主题过滤器和EVM事件

优质
小牛编辑
117浏览
2023-12-01

主题过滤器和EVM事件

主题过滤器捕获在网络中发生的以太坊虚拟机(EVM)事件的细节。这些事件是由智能合约创建的,并存储在与智能合约相关联的交易日志中。

solidity文档提供了EVM事件的良好概述。

使用EthFilter类型指定希望应用于过滤器的主题。这可以包括希望应用过滤器的智能合约的地址。你还可以提供特定的主题进行筛选。其中单个主题表示智能合约上的索引参数:

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
        DefaultBlockParameterName.LATEST, <contract-address>)
             [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];

然后可以使用类似于上面的块和交易过滤器的语法创建该过滤器:

web3j.ethLogObservable(filter).subscribe(log -> {
    ...
});

过滤器主题只能引用索引的Solidity事件参数。不可能对非索引事件参数进行筛选。此外,对于可变长度数组类型(如字符串和字节)的任何索引事件参数,它们的值的Keccak-256 hash 存储在EVM日志上。不可能使用它们的全部值来存储或筛选。

如果创建一个没有与之相关联的主题的过滤器实例,则在网络中发生的所有EVM事件都将由过滤器捕获。