区块链之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这样的。

大概的监听就是这样的啦。