web3j 过滤器提供以太坊网络发生的某些事件的通知, 对 java 和安卓程序员来说很有用. 在 Ethereum 以太坊中支持三类过滤器:
块滤波器(Block filters)
未决交易过滤器(Pending transaction filters)
主题过滤器(Topic filters)
块过滤器和未决交易过滤器提供了在网络上创建新交易或块的通知.
主题过滤器更灵活. 允许根据提供的特定标准创建过滤器.
不幸的是, 除非你使用 WebSocket 连接到 Geth, 否则通过 JSON-RPC API 来处理过滤器是一个繁琐的过程, 这里需要轮询以太坊客户端, 以便了解 HTTP 和 IPC 所请求的实时同步特征, 是否有任何新的更新到你的过滤器. 此外, 块和交易过滤器只提供交易或区块链 hash 值, 因此需要进一步的请求来获得 hash 对应的实际交易或块.
web3j 的过滤器 https://github.com/web3j/web3j/blob/master/core/src/main/java/org/web3j/protocol/core/filters/Filter.java 解决了这些问题, 因此你有一个完全异步的基于事件的 API 来处理过滤器. 它使用 RXJava https://github.com/ReactiveX/RxJava 的可观测性 Observables http://reactivex.io/documentation/observable.html , 它提供了与事件协同工作的一致 API, 这有助于通过功能组合将 JSON-RPC 调用链接在一起.
注: Infura 不支持过滤器.
块和交易过滤器
接收所有新块把它们添加到区块链(false 参数指定我们只需要块就 ok, 而不需要嵌入交易):
- Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
- ...
- });
接收所有新交易, 把它们添加到块链:
- Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
- ...
- });
接收所有待提交交易并提交到网络(即在它们被分组在一起之前):
- Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
- ...
- });
不再需要的时候取消订阅 unsubscribe:
subscription.unsubscribe();
另外还提供了其他回调, 它们简单地提供了块或交易 hash, 这些细节涉及 Web3JRX https://github.com/web3j/web3j/blob/master/core/src/main/java/org/web3j/protocol/rx/Web3jRx.java 接口.
再现过滤器
webjs 还提供用于再现块和交易历史的过滤器.
从区块链再现一系列块:
- Subscription subscription = web3j.replayBlocksObservable(
- <startBlockNumber>, <endBlockNumber>, <fullTxObjects>)
- .subscribe(block -> {
- ...
- });
再现包含在一个块范围内的单个交易:
- Subscription subscription = web3j.replayTransactionsObservable(
- <startBlockNumber>, <endBlockNumber>)
- .subscribe(tx -> {
- ...
- });
也可以获得 Web3J 再现最新的块, 并在你看过后提供通知(通过提交 Observable):
- Subscription subscription = web3j.catchUpToLatestBlockObservable(
- <startBlockNumber>, <fullTxObjects>, <onCompleteObservable>)
- .subscribe(block -> {
- ...
- });
或者, 也可以在你再现最新的块后, 通知新创建的后续块:
- Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewBlocksObservable(
- <startBlockNumber>, <fullTxObjects>)
- .subscribe(block -> {
- ...
- });
如上所述, 并包含在块内的交易:
- Subscription subscription = web3j.catchUpToLatestAndSubscribeToNewTransactionsObservable(
- <startBlockNumber>)
- .subscribe(tx -> {
- ...
- });
所有上述过滤器都是通过 Web3JRX https://github.com/web3j/web3j/blob/master/core/src/main/java/org/web3j/protocol/rx/Web3jRx.java 接口导出的.
主题过滤器和 EVM 事件
主题过滤器捕获在网络中发生的以太坊虚拟机 (EVM) 事件的细节. 这些事件是由智能合约创建的, 并存储在与智能合约相关联的交易日志中.
solidity 文档 http://solidity.readthedocs.io/en/develop/contracts.html#events 提供了 EVM 事件的良好概述.
使用 https://github.com/web3j/web3j/blob/master/core/src/main/java/org/web3j/protocol/core/methods/request/EthFilter.java 类型指定希望应用于过滤器的主题. 这可以包括希望应用过滤器的智能合约的地址. 你还可以提供特定的主题进行筛选. 其中单个主题表示智能合约上的索引参数:
- EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
- DefaultBlockParameterName.LATEST, <contract-address>)
- [.addSingleTopic(...) | .addOptionalTopics(..., ...) | ...];
然后可以使用类似于上面的块和交易过滤器的语法创建该过滤器:
- web3j.ethLogObservable(filter).subscribe(log -> {
- ...
- });
过滤器主题只能引用索引的 Solidity 事件参数. 不可能对非索引事件参数进行筛选. 此外, 对于可变长度数组类型 (如字符串和字节) 的任何索引事件参数, 它们的值的 Keccak-256 hash 存储在 EVM 日志上. 不可能使用它们的全部值来存储或筛选.
如果创建一个没有与之相关联的主题的过滤器实例, 则在网络中发生的所有 EVM 事件都将由过滤器捕获.
操作组合标注
除了 send()和 sendAsync 之外, 所有 JSON-RPC 方法在 web3j 中都实现了支持 observable()方法来创建可观察的异步执行请求. 这使得将 JSON-RPC 调用组合成新的函数是非常容易和直接的.
例如, blockObservable https://github.com/web3j/web3j/blob/master/core/src/main/java/org/web3j/protocol/rx/JsonRpc2_0Rx.java 本身由许多单独的 JSON-RPC 调用组成:
- public Observable<EthBlock> blockObservable(
- boolean fullTransactionObjects, long pollingInterval) {
- return this.ethBlockHashObservable(pollingInterval)
- .flatMap(blockHash ->
- web3j.ethGetBlockByHash(blockHash, fullTransactionObjects).observable());
- }
在这里, 我们首先创建一个可观察的, 它提供每个新创建的块的块哈希的通知. 然后, 我们使用 flatMap 调用 ethGetBlockByHash, 以获得完整的块细节, 这是传递给可观察者的订阅服务器的细节.
进一步的例子
请参阅 https://github.com/web3j/web3j/blob/master/integration-tests/src/test/java/org/web3j/protocol/core/ObservableIT.java , 进一步举例说明.
对于使用手动筛选器 API 的演示, 可以查看 https://github.com/web3j/web3j/blob/master/integration-tests/src/test/java/org/web3j/protocol/scenarios/EventFilterIT.java .
web3j 教程 http://xc.hubwiz.com/course/5b2b6e82c02e6b6a59171de2?affid=73juejin , 主要是针对 java 和 android 程序员进行区块链以太坊开发的 web3j 开发详解.
以太坊教程 http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=73juejin , 主要介绍智能合约与 dapp 应用开发, 适合入门.
以太坊开发 http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6?affid=73juejin , 主要是介绍使用 node.js,mongodb, 区块链, ipfs 实现去中心化电商 DApp 实战, 适合进阶.
php 以太坊 http://xc.hubwiz.com/course/5b36629bc02e6b6a59171de3?affid=73juejin , 主要是介绍使用 php 进行智能合约开发交互, 进行账号创建, 交易, 转账, 代币开发以及过滤器和事件等内容.
来源: https://juejin.im/post/5b3b1292e51d45194908dc4a