solidity函数返回Struct类型变量值,CMC/Go SDK无法通过ABI解析
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
具体的现象,操作步骤,前置条件等,尽可能描述清楚,有截图说明更佳
struct Pack {
address sender;
string info;
}
...
function getPack() public view returns(Pack memory _ret){
...
}
合约的getPack()方法返回一个包含address和string的struct变量,debug看到函数返回值(解析hex后)是正常的:
0000000000000000000000000000000000000000000000000000000000000020 => offset 1
000000000000000000000000be9f4d6e75401c80d5c6aaf2c736a33b78246978 => address
0000000000000000000000000000000000000000000000000000000000000040 => offset 2
0000000000000000000000000000000000000000000000000000000000000004 => string length
6173646600000000000000000000000000000000000000000000000000000000 => string content: "asdf"
但是经过CMC或者Go SDK使用ABI.unpack,会把这个返回值解析为EVMAddress,然后把之后的内容忽略掉:
0000000000000000000000000000000000000020
我的问题是:如何像Remix IDE(下图)将结果正常解析成tuple?需要在哪里(SDK层面,还是ABI解析层面)进行改动?
【相关日志文件】(如果有报错日志请贴图,或者上传附件)
cmc结果:
gosdk 代码&结果:
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.1.0]
- OS & version * :
- docker镜像 version:
-
管理台 version:
- 如果是管理台的相关问题,请附带管理台版本,如果不是可忽略。
-
区块浏览器 version:
- 如果是浏览器的相关问题,请附带浏览器版本,如果不是可忽略。
-
合约IDE version:
- 如果是合约IDE的相关问题,请附带合约IDE版本,如果不是可忽略。
-
web签名插件 version:
- 如果是web签名插件的相关问题,请附带web签名插件版本,如果不是可忽略。
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information