区块链之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这样的。
大概的监听就是这样的啦。
上一篇:
JS实现多线程数据分片下载
下一篇:
创建智能合约有哪些方法