在合约中使用迭代器查询历史数据的返回EOF错误
【问题分类】
- bug
- P2P网络相关(包含libp2p,liquid)
- 链账户身份与权限相关(证书问题、public、多签投票问题)
- 核心交易引擎相关(交易池、DAG)
- 共识相关
- 智能合约相关
- 存储相关
- SDK相关
- 长安链CMC工具
- 长安链管理台
- 长安链浏览器
- 长安链合约IDE
- 长安链web签名插件
- 跨链相关
- 轻节点相关
- 隐私计算相关
- 密码学相关
- 环境依赖
- 其他补充:
【问题描述】(请对问题进行描述,方便定位问题)
智能合约中使用迭代器stub.NewHistoryKvIterForKey(key, field)来查询历史的时候,iter.HasNext()返回true,但是km, err := iter.Next()报错,返回的err为EOF,该错误会有规律的偶发,经排查应该是链上返回的数据在合约解析的时候有问题。 链上会返回txId,blockHeight,value,isDelete,timestamp这5个数据,用#拼接,但是如果块高度为35(#对应的ascii码也是35),blockHeight会转为#\000\000\000,合约中再split的时候就会有问题 链上代码(runtime.go:749): 合约代码 (stub.go:778):
【相关日志文件】(如果有报错日志请贴图,或者上传附件)
打印合约中result如下,其中payload部分为:8fa3470d4efbfaf2e056091386c0e525a65afa2e3c9302f7306baf1d90cd2aeb##\000\000\000#121218#\000\000\000\000#1668077870 块高度对应的区域为#\000\000\000 合约再split的时候就会变成这样,数据错乱: 再转换blockHeight数据的时候就会报错
【系统信息】(请填写系统信息,方便定位问题)
- chainmaker-go version * : [v2.1.1]
- OS & version * : Linux version 3.10.0-957.el7.x86_64 (mockbuild@x86-040.build.eng.bos.redhat.com) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) )
- docker镜像 version: chainmakerofficial/chainmaker:v2.2.1 chainmakerofficial/chainmaker-docker-go-contract:v2.2.1
-
管理台 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