区块链之java(六) 合约监听
合约监听。
顾名思义,当合约发生交易的时候,我们想要得到交易的某些信息。
这个就是合约监听。
首先呢,我们需要知道,智能合约的编写。因为如果只提供部分代码的话,是完全看不懂意思的。
其中合约监听有几种方式。
观察者,发布订阅模式。
这个什么模式,现在没搞太懂
首先,上个合约代码看看。
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
/**
* @title Storage
* @dev Store & retrieve value in a variable
* @custom:dev-run-script ./scripts/deploy_with_ethers.ts
*/
contract Storage {
event storages(uint256 number);
uint256 number;
/**
* @dev Store value in variable
* @param num value to store
*/
function store(uint256 num) public {
number = num;
emit storages(num);
}
/**
* @dev Return value
* @return value of 'number'
*/
function retrieve() public view returns (uint256){
return number;
}
}
其中呢,event storages(xxx)就是定义事件监听的基础。其次,出发消息,是在emit storages(xxx);
目前合约这块整好了。那么接下来,我们看看java这块的代码
前面呢,基本变化不大,就是一些初始化web3j的工作。如链地址,链id。钱包地址等等
package org.saiwen.paul;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.request.EthFilter;
import org.web3j.protocol.http.HttpService;
/**
* @Author paul.peng
* @Date 2022/6/6
* @Version 1.0
*/
public class App
{
private static String netWorkUrl = "链地址";
private static String credentialsAddress = "钱包地址";
private static String contractAddress = "合约地址";
public static void main( String[] args )
{
try {
//连接对应的以太坊
Web3j web3 = Web3j.build(new HttpService(netWorkUrl));
//创建监听事件
EthFilter filter = new EthFilter(DefaultBlockParameterName.EARLIEST,
DefaultBlockParameterName.LATEST, contractAddress);
//执行监听
web3.ethLogFlowable(filter).subscribe(log -> {
System.out.println(log.getBlockNumber());
System.out.println(log.toString());
});
}catch (Exception e){
e.printStackTrace();
}
}
}
其中呢,web3.ethLogFlowable最初的版本,可能叫做(web3.ethLogObservable)
这个就是个版本的问题,因为我这边引入的maven包是5.0.0的。所以只有ethLogFlowable方法。
然后。我们看看执行结果
第一个log.getBlockNumber()显示的是一个交易id。或者叫区块id。就是相当于订单的唯一id。
第二个。log.toString()实际就是里面的一些参数。
log里面的data就是交易双方的一个值。
这次输入的,就是一个1.所以显示的是0x000000...1这样。如果输入的指是2,那么就会显示0x00000...2这样的。
大概的监听就是这样的啦。