① 查询链上数据用的rpc(本示例是binance的,测试网可以使用:https://data-seed-prebsc-2-s2.binance.org:8545)
② 自己还要有一个测试链上部署好的合约,合约中要有一个方法emit了事件。
③ java依赖
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>4.9.7</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>codegen</artifactId>
<version>4.9.7</version>
</dependency>
一、通过自己合约的abi和bin生成一个java文件,abi和bin可以在remix的compiler模块中获取,代码如下(这一步懒得做的可以跳过,在第二步传合约地址的时候,直接传一个字符串也行。这里就是顺手存一下这个方法,其实实际使用也是直接传的字符串,具体可以看页面最下方的”三、“)
/**
* 通过合约abi和bin获得java文件
*/
public void getJavaFileBySolidity(){
// 生成的java类名,同ABI文件同名,自动首字母大写
String packageName = "";
String outDirPath = "/Users/maomo/Desktop/";
String binDirPath = "/Users/maomo/Desktop/xxxbin.txt";
String abiDirPath = "/Users/maomo/Desktop/xxxabi.txt";
String[] arr = Arrays.asList(
"-b", binDirPath,
"-a", abiDirPath,
"-p", packageName,
"-o", outDirPath
).toArray(new String[0]);
SolidityFunctionWrapperGenerator.main(arr);
}
二、通过web3j查询事件,通过event和ethFilter增加过滤条件
public void testSub() {
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s2.binance.org:8545"));
//第一步生成的合约实体
Contract contract;
Disposable subscribe = null;
try {
Web3ClientVersion web3ClientVersion = web3j.web3ClientVersion().send();
String clientVersion = web3ClientVersion.getWeb3ClientVersion();
log.info("wen3j subsc