web3j——Filters and Events:拦截器和事件

官方API地址:https://docs.web3j.io/filters.html#block-and-transaction-filters
web3j是一种高度模块化、灵活、安全的Java类库和Android类库,用于处理智能合同,并与以太网络中的客户端(节点)集成。

过滤器提供了在以太坊网络中发生的某些事件的通知。以太坊支持三种类型的过滤器:

  • 块过滤器
  • 待处理的交易过滤器
  • 主题过滤器

块过滤器和待处理的事务过滤器提供在网络上创建新事务或块的通知。

主题过滤器更加灵活。这些允许您根据您提供的特定条件创建过滤器。

不幸的是,除非您使用WebSocket连接到Geth,否则通过JSON-RPC API处理过滤器是一个单调乏味的过程,您需要轮询Ethereum客户端才能确定过滤器是否有任何更新,因为HTTP和IPC请求的同步性质。此外,块和事务过滤器仅提供事务或块散列,因此需要进一步的请求来获取由散列引用的实际事务或块。

web3j的托管过滤器实现解决了这些问题,因此您有一个完全异步的基于事件的API来处理过滤器。它使用RxJava的Observable,它提供了一个一致的API来处理事件,这有助于通过功能组合将JSON-RPC调用链接在一起。

注意:Infura不支持过滤器。

块和事务过滤器

在添加到区块链时接收所有新区块(false参数指定我们只需要区块,而不是嵌入式交易):

Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
    ...
});

在添加到区块链时接收所有新交易:

Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
    ...
});

在提交给网络时接收所有未决事务(即在将它们一起分组为一个块之前):

Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
    ...
});

通过取消订阅不再需要时,应始终取消订阅:

subscription.unsubscribe();

还提供了其他回调函数,它们仅提供块或事务哈希值,这些回调函数的细节涉及Web3jRx接口。

重播过滤器

web3j还提供了用于重播块和交易历史的过滤器。

要重播区块链中的一系列区块,请执行以下操作:

Subscription subscription = web3j.replayBlocksObservable(
        , , )
        .subscribe(block -> {
            ...
});

To replay the individual transactions contained within a range of blocks:
要重放单个交易中包含一系列的区块,请执行以下操作:

Subscription subscription = web3j.replayTransactionsObservable(
        , )
        .subscribe(tx -> {
            ...
});

You can also get web3j to replay all blocks up to the most current, and provide notification (via the submitted Observable) once you’ve caught up:
您也可以让web3j以最新的方式重播所有模块,并在您追上时提供通知(通过提交的Observable):

Subscription subscription = web3j.catchUpToLatestBlockObservable(
        , , )
        .subscribe(block -> {
            ...
});

Or, if you’d rather replay all blocks to the most current, then be notified of new subsequent blocks being created:
或者,如果您希望将所有块重播至最新的块,则会通知正在创建的新的后续块:

Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewBlocksObservable(
        , )
        .subscribe(block -> {
            ...
});

As above, but with transactions contained within blocks:
如上所述,但是块中包含的交易:

Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable(
        )
        .subscribe(tx -> {
            ...
});

All of the above filters are exported via the Web3jRx interface.
所有上述过滤器都通过Web3jRx接口导出。

Topic filters and EVM events:主题过滤器和EVM事件

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

Solidity文档提供了有关EVM事件的良好概述。

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

EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
        DefaultBlockParameterName.LATEST, )
             [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];

然后可以使用与上面的块和事务过滤器类似的语法创建此过滤器:

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

过滤器主题只能引用索引的Solidity事件参数。 无法对非索引事件参数进行过滤。 此外,对于任何可变长度数组类型(如字符串和字节)的索引事件参数,其值的Keccak-256哈希值将存储在EVM日志中。 无法使用其全部值进行存储或过滤。

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

A note on functional composition:关于功能组成的说明

除send()和sendAsync之外,web3j中的所有JSON-RPC方法实现都支持observable()方法,以创建一个Observable异步执行请求。 这使得将JSON-RPC调用组合成新函数变得非常简单。

例如,blockObservable本身由多个独立的JSON-RPC调用组成:

public Observable blockObservable(
        boolean fullTransactionObjects, long pollingInterval) {
    return this.ethBlockHashObservable(pollingInterval)
            .flatMap(blockHash ->
                    web3j.ethGetBlockByHash(blockHash, fullTransactionObjects).observable());
}

在这里,我们首先创建一个observable,提供每个新创建块的块散列的通知。 然后,我们使用flatMap调用ethGetBlockByHash的调用来获取完整的块详细信息,这是传递给observable的订户的内容。

Further examples:其他例子

Please refer to the integration test ObservableIT for further examples.
有关更多示例,请参阅集成测试ObservableIT。
For a demonstration of using the manual filter API, you can take a look at the test EventFilterIT..
有关使用手动过滤器API的演示,可以查看测试EventFilterIT ..

你可能感兴趣的:(blockchain)