栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

web3j的基础用法-6合约的监听器事件Event和过滤器EthFilter,以及NullPointed,调用失败导致的bug解决

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

web3j的基础用法-6合约的监听器事件Event和过滤器EthFilter,以及NullPointed,调用失败导致的bug解决

简单的监听一下某个合约的Transfer事件 本篇以Uniswap为例(https://uniswap.org/)

合约地址 :0x1f9840a85d5af5bf1d1762f925bdaddc4201f984 (Uni)

监听合约Tranfer事件

  1. 调用代码
   private void run1() throws Exception {
        log.info("hello eth,hello web3j");

        Web3j web3j = Web3jInfo.connect();
//        BigInteger total = TokenClient.getTokenTotalSupply(web3j, "0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7");
//        System.out.println("loot(0xff9c1b15b16263c61d017ee9f65c50e4ae0113d7) total:" + total);

        TransMonitor.getInstance().setWeb3j(web3j);
        TransMonitor.getInstance().subscribeContract("0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", new Action1() {
            @Override
            public void call(Log log) {
                System.out.println("transBlockNo:" + log.getBlockNumber());
                System.out.println("transHash:" + log.getTransactionHash());
                List topics = log.getTopics();
                for (String topic : topics) {
                    System.out.println("transTopic:" + topic);
                }
            }
        });
    }
  1. 核心代码实现在这里
  
    public Subscription subscribeContract(String contractAddress, final Action1 onNext) {
        if (this.web3j == null) return null;

        // 要监听的合约事件 交易
        EthFilter filter = new EthFilter(
                DefaultBlockParameter.valueOf(BigInteger.valueOf(13763721L)),
                DefaultBlockParameterName.LATEST,
                contractAddress);
        Event event = new Event("Transfer",
                Arrays.>asList(
                        new TypeReference
(true) { }, new TypeReference
(true) { }, new TypeReference(false) { })); filter.addSingleTopic(EventEncoder.encode(event)); return web3j.ethLogObservable(filter).subscribe(onNext); } public void unsubscribeContract(Subscription subscription) { if (this.web3j == null) return; subscription.unsubscribe(); }

之前实验全量区块,导致请求多次失败,是由于个人RPC节点的请求和数据有限,为了测试出结果,从13763721L block到当前,结果毫秒级返回成功。

  1. Transfer包含的3个参数

  2. 所以由此扩展,所有合约的Event 都可以按照此方法进行构造和监听。

项目github地址

https://github.com/jambestwick/we3jdemo

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/644098.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号