solidity采坑日记之智能合约返回事件内容解析
最近在用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的源数据data与event事件对应的参数类型列表,都传入web3j中FunctionReturnDecoder.decode(rawData,List<TypeReference<Type>>),解析器会根据事件参数去解析源数据,并得到预期的结果。
solidity采坑日记之智能合约返回事件内容解析相关推荐
- [区块链笔记1] 入坑区块链 智能合约solidity基础
以太坊是一个分布式计算网络,提供了运行智能合约的分布式平台. 智能合约是在以太坊虚拟机上运行的应用程序. 以太坊拥有多种高级语言可以用来编写智能合约,最流行的是solidity,基于javascrip ...
- 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld
有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...
- 用solidity语言开发代币智能合约
智能合约开发是以太坊编程的核心之一,而代币是区块链应用的关键环节,下面我们来用solidity语言开发一个代币合约的实例,希望对大家有帮助. 以太坊的应用被称为去中心化应用(DApp),DApp的开发 ...
- Solidity入门级别|用智能合约实现房屋贷款系统
Home Loans Based on Smart Contract for Banks 代码目的: 创造一个自运行的房屋贷款系统,减轻银行许多传统金融合约操作流程的负担 执行摘要: 贷款申请人在线登 ...
- 用Solidity写一个网上购物智能合约
学校期末web作业,要实现一个简单的网上购书平台,写到一半的时候发现支付这一块可以借助智能合约来完成.虽然接触过一点区块链的知识,但还没有动手写过智能合约,于是匆忙学习了一下Solidity和Smar ...
- 使用ethers.js直接读取智能合约中插槽内容
我在上一篇<代理/实现模式下合约插槽索引计算>中的最后,提到了一个合约示例,(BSC 区块链,地址为:0x4BfE9489937d6C0d7cD6911F1102c25c7CBc1B5A) ...
- solidity modifier函数修改器 智能合约开发知识浅学(三)
环境说明: Ide:在线remix Solidity IDE 语言:solidity solidity 版本号:0.4.20 Tip:如果一点都不懂的建议从头开始看 运行结果截图我不赘述,所有合约代码 ...
- 熊海CMS_V1.0代码审计与漏洞分析及采坑日记(一)--文件包含漏洞
前言 最近几天在给协会的学弟讲代码审计入门相关内容,便找了这个熊海CMS_V1.0来教学,结果在这个过程中遇到蛮多问题的,于是这篇文章详细记录了对熊海CMS_V1.0从搭建到审计与漏洞分析的过程,其中 ...
- solidity不同sol文件的智能合约调用 A调用B
直接进入正题 上代码 DemoSimple.sol 这是B合约 // SPDX-License-Identifier: GPL-3.0 pragma solidity >=0.7.0 <0 ...
最新文章
- SHELL字符串使用总结
- OpenStack点滴01-概览
- navigationcontroller和navigationbar和navigationitem之间的区别以及不用nib实现点击屏幕关闭虚拟键盘20130911...
- linux命令(日常更新)
- C语言实例第8期:模拟银行账户登陆
- 微信小程序官方开发文档
- 众元教育H3CSE20200603班-云计算基础知识讲解
- sqlserver 误删除数据恢复
- linux 微信安装
- ArduCopter——ArduPilot——航点导航WPNav(一)
- docker安装nfs文件服务所需镜像,centos7安装nfs所需的安装包
- java面试基础题整理(二)
- Java 开发中常用的 4 种加密方法。MD5加密工具类测试 base64加密工具类测试 SHA加密工具类测试 BCrypt加密工具类测试
- 大数据学习路线图(知识体系整理)
- SX1278传输距离测试
- 怎么用python做战斗机_少儿编程分享:手把手教你用Python编写战斗机游戏(四)
- AutoSAR系列讲解(实践篇)8.5-C/S原理进阶
- (转)从17家顶级基金退出情况中反思投资机构退出之道
- 通过speedtest-cli来测试网速
- 无线充电Qi通信协议分析-转载