长安链社群及社区issue中每周都会产生一些常见问题,我们整理了近期社群的一些问答以供参考(社群中部分优质问题连贯性不足未能收录,欢迎点击公众号菜单栏加入社群共同交流)。有更多问答在社区issue中描述的更为细致,开发者提问前可以先按照关键词进行搜索。
欢迎各位开发者按照问答template提交issue,也欢迎有意愿的开发者参与到社区issue版块维护中。
issue问答合集链接:
https://git.chainmaker.org.cn/chainmaker/issue/-/issues?scope=all&utf8=%E2%9C%93&state=all
社群问答精选
安装配置
1. Q:区块链部署go合约时失败,投票过后时进行报错,服务器linux端已进行go get;使用命令行可以成功部署go合约,但管理台无法正常部署。
A:自查其他合约是否正常部署,判断链是不是有问题;
如果其他合约通过,再自查docker合约相关的环境是否正常启动、包含docker-vm,7z等。
2. Q:请问一下,有快速降低链版本的方法吗?
A:降低链版本最好的方法是重新建链,因为已有的链如果版本比较高,版本再降低的话交易验证可能有问题。
3. Q:管理台部署后怎么移除干净呢,只是删掉容器就可以了嘛?
A:docker-compose down -v。
4. 请问2.3.x版本支持跨链吗?
目前已发布的2.3.x版本暂时不支持,可以期待一下后续版本。
5. Q:Mac 启动管理平台报。ERROR: no matching manifest for linux/arm64/v8 in the manifest list entries 这个错误,怎么解决吗?(mac芯片为M1)
A:目前管理台没有发布arm架构的镜像,可以自己通过源码打包一个;管理台部分的代码库中有Dockerfile文件,可以通过docker build来创建镜像,然后在那个docker-compose.yml文件中调整镜像就可以了。
6. Q:历史迭代器是否支持2.3.x的链,我这样使用正确吗?sdk.Instance.NewHistoryKvIterForKey,使用sdk.Instance.GetStateByte能得到最新的数据,但是使用NewHistoryKvIterForKey,会发生timeout。
A:模拟器运行的迭代器未支持,链上是支持的。
7. Q:chainmaker-sdk-java 2.3.0 配置2个节点连接, 每个节点4个连接 , 结果发现:节点1创建了7个连接 节点2建了1个连接?
A:2.3.0加入了连接池,会自动根据网络状况优化连接数。( 每个节点4个连接 ,这个配置是多余的未使用到)
新建连接步骤如下:
1、获取连接数最少的节点;
2、建立连接;
3、若此时建立连接失败,则排除该节点,重复1-2;
4、若全部节点都建立连接失败则抛出异常。
8. Q:v2.3.0版本加入由v2.1.0 组成的共识网络失败。
A:2.1.0升级到2.3.0版本不支持这种混搭部署的模式,2.2.x版本才可以实现无缝升级。
存储
9. Q:过查询数据归档中心的当前已归档数据状态,得到 archived-status height 1745 , inArchive false 结果,其中这个 inArchive false 是什么意思呢?
A:代表没有链正在做归档操作。
10. Q:磁盘满了,节点中的日志太多了,这些日志可以删除吗?
A:没有需要修复的bug日志就可以删除,最新的几个可以留一下,其他的都可以删除。
11. Q:SQL初始化合约的时候创建表,文档里没看到删除表,drop DB的操作,这些功能支持吗?
A:区块链上不允许删除表。
Q:db和表都不支持删除?
A:不支持,除非在归档的时候才会删除部分数据;用户写的SQL合约,可以在升级合约的时候执行DROP TABLE语句。
隐私计算
12. Q:测试官网的paillier算法的智能合约编写有几个包找不到,有遇到这种情况的吗?是官网的智能合约。
A:
需要import "chainmaker.org/contract-sdk-tinygo/sdk/convert"。
详情可以参考文档:https://docs.chainmaker.org.cn/instructions/%E4%BD%BF%E7%94%A8Go%28TinyGo%29%E8%BF%9B%E8%A1%8C%E6%99%BA%E8%83%BD%E5%90%88%E7%BA%A6%E5%BC%80%E5%8F%91.html。
13. Q:隐私计算必须需要tee硬件环境吗。虚拟机是否可以支持?、
A:虚拟环境不支持。
所有chainmaker节点都是需要硬件环境,还是只有部署graphene和chainmaker-tee的节点才需要硬件环境?
只有tee节点需要。
预言机
14. Q:预言机取到的数据返回到哪里啊?
A:预言机的数据应该返回到对应的预言机合约,预言机合约再调用业务合约通知链下数据。
15. Q:通过预言机把数据取到链上后,这个数据是加密了吗?要如何解密啊?
A:base64的编码。
智能合约
16. Q:我现在想把rust合约改成go的合约,那之前已上链的数据还能通用吗?go合约里的字段和方法逻辑与rust的一样。
A:可以先洗一遍数据。再升级到新合约。就是在wasmer里先把数据解析好,重新按go和rust都能解析的方式写入。然后再升级。
17. Q:使用DOCKER_GO(tag:2.3.1),日志中有错误提示,部署合约失败,什么原因?
A:vm-engine采用cgroup限制资源,目前只支持cgroupv1,在2.3.2版本会支持v2。如果你是v2版本,目前可能需要降级到v1,您可以执行stat -fc %T /sys/fs/cgroup/看看,如果是cgroup2fs就是v2,如果是tmpfs就是v1。如果您使用ubuntu22,建议降级一下,我们在232版本会支持v2。
18. Q:VM换了,之前rust合约里边有个序列化,在GO这边不支持导致历史数据无法查询。请问调用合约时可以指定一个版本号吗,不然新合约和历史合约遇到这种情况就难搞了啊。
A:不可以指定版本号。
19. Q:长安链的DAG并行调度是以合约为维度的吗,还是可以更细粒度到同一合约下的事务KEY上?比如同一个转账合约,A到B转账,C向D转账。能并行吗
A:调度冲突是以读写集作为判断维度的;可以并行
Q:那如果涉及到跨合约调用呢。也是一样的是吗,跨合约调用本身算事务吗,比如C1合约调转账合约C0,C2合约也调转账合约C0, 它们也能并行是吗?
A:并行,看是否会有冲突的k,假如在被调用的合约中使用了相同的k则表示冲突;如果跨合约调用中使用到了相同的读写集,则会冲突,否则不冲突。
其他问题
20. Q:长安链中,一个链可以有些证书使用国密有些使用非国密吗?
A:不可以;
Q:那在数据库里面,链的表没有标识国密还是非国密,它是怎样区分的?
A:根据链配置里的哈希类型,以及每个证书里带的签名类型。
21. Q:长安链中的sdk.Instance.GetSenderAddr()这个函数获取的交易方地址,可以伪造吗?
A:可以伪造,那样的话那个节点就是恶意节点。他的交易不会通过共识的。
22. Q:节点运行的cpu占用率和区块高度有关系吗?目前压测的区块高度到10多万了,每个块内最高交易笔数配的1000笔。突然出现一个问题,收交易的节点cpu占用率比较高,4核的,很快就跑满了。
A:收交易节点需要广播,会有大量的序列化/反序列化操作,所以cpu占用率比较高。
23. Q:fabric里的多通道对应长安链里的那个技术呀?
A:多链;
Q:最多支持几条链?
A:没有限制。
24. Q:我看日志的时候发现偶尔会有verify block repeat,然后会有block illegal,想请教一下这个是什么原因?(节点为共识节点)
A:在共识过程中,区块有两个来源,一个是共识过程中通过提案获取到的,另外一个是如果这个节点慢了的话,就会触发同步过程,由同步模块从其他节点同步过来,但是两者都会进行区块校验,所以会产生同一个区块的两次校验,说明这个节点应该是慢了。