建议和反馈

请填写你的反馈内容

java通过web3j调用智能合约传递数组参数的坑

2020-12-10 ·4408次阅读 ·读完需要2分钟

最近在写solidity智能合约,用java与solidity交互过程中,需要传递数组参数到智能合约,但是用web3j转换后的数组参数去调用智能合约接口一直返回错误信息,在万能的互联网上翻阅了大量资料后,终于解决,在此记录一下:

首先java项目需要引入web3j的依赖包:

org.web3jcore4.5.18okhttpcom.squareup.okhttp

合约demo代码如下:

function arrTest(bytes32[] memory arr) public view  returns(string memory) {return bytes32ToString(arr[0]);}function bytes32ToString(bytes32 bname) view public returns(string memory){// 此处要加上memory// 先将有效字符计算出来bytes memory bytesChar = new bytes(bname.length);uint charCount = 0;for(uint i = 0;i < bname.length; i++){bytes1 char = bname[i];if(char != 0){charCount++;}}// 新建数组,指定长度为有效字节长度bytes memory bytesName = new bytes(charCount);for(uint j = 0;j < charCount;j++){bytesName[j] = bname[j];}return string(bytesName);}

java调用合约方法代码如下:

public static Bytes32 stringToBytes32(String string) {byte[] byteValue = string.getBytes();byte[] byteValueLen32 = new byte[32];System.arraycopy(byteValue, 0, byteValueLen32, 0, byteValue.length);return new Bytes32(byteValueLen32);}public RemoteCall arrTest(List data) {//首先把String转换成Bytes32Bytes32[] _dataBytes32 = new Bytes32[data.size()];List _dataUint = new ArrayList<>();for(int i = 0 ; i < data.size() ; i++) {_dataBytes32[i] = stringToBytes32(data.get(i));}//需要使用DynamicArray 进行参数传递其他传递方式均出现错误 如: 直接传入参数dataBytes32 的数组,程序报错 ;List形式传参,程序报错DynamicArray inputDataByte32 = new DynamicArray(Bytes32.class , _dataBytes32);final Function function = new Function("arrTest",Arrays.asList(//错误示例//dataBytes32//正确示例inputDataByte32),Arrays.asList(new TypeReference() {}));return executeRemoteCallSingleValueReturn(function);}

通过各种尝试,发现java调用合约带数组的参数,需要用 DynamicArray 作为中转调用。

欢迎交流区块链问题,qq群组: 786937587


声明:作为区块链技术信息平台,本站所提供的资讯信息不代表任何投资暗示,本站所发布文章仅代表个人观点,与链客社区官方立场无关。
评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

趋势赋予契机 去中心化基金平台Noel Finance打造DeFi数字金融新世界

DeFi是区块链市场近一年的热词,发展一年,DeFi生态发展速度远超乎想象。从DeBank上来看,DeFi总锁仓量于2021年05月11日突破了1344亿美元,对比2020年6月DeFi总锁仓量突破1......
链上闻 · 2021-08-21
497阅读 · 0赞赏 · 0问答

【科普】 为什么挖FIL需要质押和GAS,还有180天线性释放?

很多人刚进入这个行业,不明白为什么挖FIL需要质押和GAS费用?还有180天线性释放?挖以太坊和比特币不需要这些吗?本文逐一回答上述相关问题。资深矿工hblan413一、为什么挖Fil币需要质押?比特......
V_hblan413 · 2021-07-12
808阅读 · 0赞赏 · 0问答

深入解析数据可用性问题:它如何影响以太坊扩容?

ZK Rollup、Optimistic Rollup 和 Polygon 等以太坊扩容方案都是如何应对数据可用性问题的?原文标题:《数据可用性问题》撰文:Polygon在这篇文章......
胖shy · 2021-06-29
477阅读 · 0赞赏 · 0问答

技术:根据例子学习Solidity

根据例子学习Solidity投票以下的合约相当复杂,但展示了很多Solidity的功能。它实现了一个投票合约。 当然,电子投票的主要问题是如何将投票权分配给正确的人员以及如何防止被操纵。 我们不会在这......
胖shy · 2021-02-07
2226阅读 · 0赞赏 · 0问答

Solidity v0.8.0重大更改

Solidity v0.8.0重大更改本节重点介绍了Solidity 0.8.0版中引入的主要重大更改。有关完整列表,请检查 发行变更日志。语义的无声变化本部分列出了现有代码更改其行为而无需......
胖shy · 2021-01-15
2907阅读 · 0赞赏 · 0问答

Solidity v0.8.0重大更改

Solidity v0.8.0重大更改本节重点介绍了Solidity 0.8.0版中引入的主要重大更改。有关完整列表,请检查 发行变更日志。语义的无声变化本部分列出了现有代码更改其行为而无需......
胖shy · 2021-01-15
2582阅读 · 0赞赏 · 0问答

Diva

3078.0

LK币

5

粉丝

116

笔记

感谢"Diva"

这篇精彩的笔记,目前已经帮助

  • 0
  • 4
  • 4
  • 0
  • 8
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!