web3j的响应式函数可以使观察者通过事件去通知消息订阅者变得很简单,并能够记录在区块链中。接收所有新的区块并把它们添加到区块链中:
Subscription subscription = web3j.blockObservable(false).subscribe(block -> {
...
});
接收所有新的交易并把它们添加到区块链中:
Subscription subscription = web3j.transactionObservable().subscribe(tx -> {
...
});
接收所有已经提交到网络中等待处理的交易。(他们被统一的分配到一个区块之前。)
Subscription subscription = web3j.pendingTransactionObservable().subscribe(tx -> {
...
});
或者你重置所有的区块到最新的位置,那么当有新建区块的时候会通知你。
Subscription subscription = catchUpToLatestAndSubscribeToNewBlocksObservable(
<startBlockNumber>, <fullTxObjects>)
.subscribe(block -> {
...
});
主题过滤也被支持:
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
DefaultBlockParameterName.LATEST, <contract-address>)
.addSingleTopic(...)|.addOptionalTopics(..., ...)|...;
web3j.ethLogObservable(filter).subscribe(log -> {
...
});
当不再需要时,订阅也应该被取消:
subscription.unsubscribe();
注意:Infura中不支持filters。
需要了解更多有关过滤器和事件的信息可以查看Filters and Events和Web3jRx的接口。
其他的细节
java8 bulid:
- Web3j提供对所有响应类型的安全访问。可选的或null响应java 8都支持。
- 异步请求包在一个java 8的CompletableFutures。Web3j提供了围绕所有异步请求的打包工具,以确保在执行期间可以捕获任何异常,而不只是丢弃。由于在完全检查中会有很多缺少支持的异常情况,这些异常通常被确定为未检测到的异常,导致检测过程出现问题。有关详细信息,请参见 Async.run()及其关联 test。
在java 8的Android版本:
- 包数量作为 BigIntegers返回。对于简单的结果,可以通过
Response.getResult()
获取字符串类型的数量结果。 - 还可以通过在 HttpService和IpcService类中存在的
includeRawResponse
参数将原生的JSON包放置在响应中。