最近在用java调用solidity智能合约方法的时候,遇到了方法Log解析的问题。

正常在调用合约后,如果该合约有event时间,那么执行结果会返回对应的log日志,但是返回的log日志是0x开头的16进制字符串,不是我们需要的string、bool等类型的数据。因此我们需要把hex转换成合约对应返回的数据类型。

如下,合约log返回的data信息;

0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001344442d3230323032393330303030303030303100000000000000000000000000

而我们想要的信息是这样的(如下),可以用Hex字符串工具转换成对应的ASCII码(直接转码,有我们想要的结果,但是也会出现大量乱码)。

DD-2020293000000001

而现实中我们得到的数据是这样的

如何得到正确的解析结果呢?下面直接上代码。

解析方法

第一步,需要引入web3j库

        <dependency><groupId>org.web3j</groupId><artifactId>core</artifactId><version>4.5.18</version></dependency>

第二步,根据合约代码定义Event对象

合约event事件

  event LogOnlyCode(string result);

根据event事件构造对应的java对象

  Event evet = new Event("LogOnlyCode",Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));

将返回结果从合约调用的log中解析出来

  TransactionReceipt transaction = hzwqContract.onlyCode(year, type).send();List<Log> logs = transaction.getLogs();Log log = logs.get(0);Event evet = new Event("LogOnlyCode",Arrays.<TypeReference<?>>asList(new TypeReference<Utf8String>() {}));List<Type> result = FunctionReturnDecoder.decode(log.getData(),evet.getNonIndexedParameters());onlyCode = String.valueOf(result.get(0));System.out.println(onlyCode);

最终打印我们想要的结果。

solidity合约对返回的log日志做了特殊的编码处理,所以在解释的时候,需要把Hex的源数据dataevent事件对应的参数类型列表,都传入web3j中FunctionReturnDecoder.decode(rawData,List<TypeReference<Type>>),解析器会根据事件参数去解析源数据,并得到预期的结果。

solidity采坑日记之智能合约返回事件内容解析相关推荐

  1. [区块链笔记1] 入坑区块链 智能合约solidity基础

    以太坊是一个分布式计算网络,提供了运行智能合约的分布式平台. 智能合约是在以太坊虚拟机上运行的应用程序. 以太坊拥有多种高级语言可以用来编写智能合约,最流行的是solidity,基于javascrip ...

  2. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

    有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...

  3. 用solidity语言开发代币智能合约

    智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...

  4. Solidity入门级别|用智能合约实现房屋贷款系统

    Home Loans Based on Smart Contract for Banks 代码目的: 创造一个自运行的房屋贷款系统,减轻银行许多传统金融合约操作流程的负担 执行摘要: 贷款申请人在线登 ...

  5. 用Solidity写一个网上购物智能合约

    学校期末web作业,要实现一个简单的网上购书平台,写到一半的时候发现支付这一块可以借助智能合约来完成.虽然接触过一点区块链的知识,但还没有动手写过智能合约,于是匆忙学习了一下Solidity和Smar ...

  6. 使用ethers.js直接读取智能合约中插槽内容

    我在上一篇<代理/实现模式下合约插槽索引计算>中的最后,提到了一个合约示例,(BSC 区块链,地址为:0x4BfE9489937d6C0d7cD6911F1102c25c7CBc1B5A) ...

  7. solidity modifier函数修改器 智能合约开发知识浅学(三)

    环境说明: Ide:在线remix Solidity IDE 语言:solidity solidity 版本号:0.4.20 Tip:如果一点都不懂的建议从头开始看 运行结果截图我不赘述,所有合约代码 ...

  8. 熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞

    前言 最近几天在给协会的学弟讲代码审计入门相关内容,便找了这个熊海CMS_V1.0来教学,结果在这个过程中遇到蛮多问题的,于是这篇文章详细记录了对熊海CMS_V1.0从搭建到审计与漏洞分析的过程,其中 ...

  9. solidity不同sol文件的智能合约调用 A调用B

    直接进入正题 上代码 DemoSimple.sol 这是B合约 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0 ...

最新文章

  1. SHELL字符串使用总结
  2. OpenStack点滴01-概览
  3. navigationcontroller和navigationbar和navigationitem之间的区别以及不用nib实现点击屏幕关闭虚拟键盘20130911...
  4. linux命令(日常更新)
  5. C语言实例第8期:模拟银行账户登陆
  6. 微信小程序官方开发文档
  7. 众元教育H3CSE20200603班-云计算基础知识讲解
  8. sqlserver 误删除数据恢复
  9. linux 微信安装
  10. ArduCopter——ArduPilot——航点导航WPNav(一)
  11. docker安装nfs文件服务所需镜像,centos7安装nfs所需的安装包
  12. java面试基础题整理(二)
  13. Java 开发中常用的 4 种加密方法。MD5加密工具类测试 base64加密工具类测试 SHA加密工具类测试 BCrypt加密工具类测试
  14. 大数据学习路线图(知识体系整理)
  15. SX1278传输距离测试
  16. 怎么用python做战斗机_少儿编程分享:手把手教你用Python编写战斗机游戏(四)
  17. AutoSAR系列讲解(实践篇)8.5-C/S原理进阶
  18. (转)从17家顶级基金退出情况中反思投资机构退出之道
  19. 通过speedtest-cli来测试网速
  20. 无线充电Qi通信协议分析-转载

热门文章

  1. 开放系统理论(3)生物的特征——热力学第二定律,和熵(1吐槽)
  2. JAVA爬虫 - 爬取豆瓣租房信息
  3. 4、ESP32-S - 连接 WiFi
  4. [矩阵的三角分解系列四] 乔累斯基(Cholesky)分解公式
  5. Hutool美国、中国时区转换(冬令时,夏令时)
  6. 英语口语练习一之work详解
  7. 阿昌教你用Hutool包校验工具校验内容
  8. Unity游戏排行榜的制作与优化
  9. Oracle一个语句多个left,oracle 多个 left join
  10. Nature Microbiology | 枯草芽孢杆菌生物膜促进甜瓜生长并抗病