主页 > imtoken换手机怎么登录 > web3j教程:以太坊过滤器(filter)筛选和智能合约事件(event)监控

web3j教程:以太坊过滤器(filter)筛选和智能合约事件(event)监控

imtoken换手机怎么登录 2023-02-27 07:10:17

web3j 过滤器提供以太坊网络上发生的某些事件的通知,对 java 和 android 程序员很有用。 以太坊支持三种类型的过滤器:

块过滤器和待处理交易过滤器提供有关在网络上创建的新交易或块的通知。

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

不幸的是,除非你使用 WebSocket 连接到 Geth,否则通过 JSON-RPC API 处理过滤器是一个乏味的过程,需要轮询以太坊客户端以了解 HTTP 和 IPC 请求的实时同步特性,是否有您的过滤器是否有任何新的更新。 此外,区块和交易过滤器仅提供交易或区块链哈希值,因此需要进一步请求才能获得哈希对应的实际交易或区块。

web3j 的过滤器解决了这些问题,所以你有一个完全异步的基于事件的 API 来处理过滤器。 它使用 RXJava 的 Observables,它提供了一个与事件一起工作的一致 API,这有助于通过功能组合将 JSON-RPC 调用链接在一起。

注意:Infura 不支持过滤器。

区块和交易过滤器

接收所有新区块并将它们添加到区块链(false 参数指定我们只希望区块正常,而不是嵌入交易):

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

接收所有新交易并将它们添加到区块链:

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

以太坊智能合约安全性_siteqq.com 以太坊智能合约_两千块可以玩以太坊合约吗

接收所有未决交易并提交给网络(即在它们组合在一起之前):

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

不再需要时退订退订:

subscription.unsubscribe();

还提供了其他回调,仅提供块或交易哈希,这些细节参考 Web3JRX 接口。

复制过滤器

webjs 还提供了用于重现块和交易历史记录的过滤器。

从区块链中再现一系列区块:

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

两千块可以玩以太坊合约吗_siteqq.com 以太坊智能合约_以太坊智能合约安全性

... });

重现块范围内包含的单个事务:

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

也可以让 Web3J 重现最新的块并在您看到它时提供通知(通过提交 Observable):

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

以太坊智能合约安全性_两千块可以玩以太坊合约吗_siteqq.com 以太坊智能合约

});

或者,您也可以在复制最新块后通知新创建的后续块:

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

交易如上,并包含在区块中:

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

siteqq.com 以太坊智能合约_两千块可以玩以太坊合约吗_以太坊智能合约安全性

以上所有过滤器都是通过 Web3JRX 接口导出的。

主题过滤器和 EVM 事件

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

很好地概述了 EVM 事件。

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

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

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

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

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

以太坊智能合约安全性_siteqq.com 以太坊智能合约_两千块可以玩以太坊合约吗

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

操作组合标注

除了 send() 和 sendAsync 之外,web3j 中实现的所有 JSON-RPC 方法都支持 observable() 方法来创建异步执行的可观察请求。 这使得将 JSON-RPC 调用组合到新函数中变得非常容易和直接。

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

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

在这里两千块可以玩以太坊合约吗,我们首先创建一个可观察对象,它提供每个新创建块的块哈希的通知。 然后我们使用 flatMap 调用 ethGetBlockByHash 来获取完整的块详细信息,这些详细信息将传递给可观察对象的订阅者。

进一步的例子

有关更多示例,请参见 ObservableIT。

有关使用手动过滤器 API 的演示两千块可以玩以太坊合约吗,请查看 EventFilterIT。

原文出处:web3j教程:过滤器(Filters)和事件(Events)