Hyperledger Fabric不同版本链码安装后调用报错求助
Hey there! Let's break down your problem step by step.
首先明确回答:Hyperledger Fabric 确实支持不同Peer节点安装不同版本的链码,但你的报错问题出在链码调用/查询的版本与Peer本地安装的版本不匹配,或者通道的链码定义配置不一致。
报错原因分析
你看到的报错:
Error: endorsement failure during query. response: status:500 message:"cannot retrieve package for chaincode mycc/1.0.1, error open /var/hyperledger/production/chaincodes/mycc.1.0.1: no such file or directory"
这说明当你在Org2的Peer上执行调用/查询时,交易背书过程中要求使用mycc/1.0.1版本,但Org2的Peer只安装了mycc/1.0.0,自然找不到对应的链码包。
为什么会出现这种情况?大概率是以下两种原因之一:
- 你在调用时没有明确指定链码版本,而通道的链码定义(Chaincode Definition)中配置的版本是
1.0.1,所以Peer会默认尝试加载这个版本; - 你误指定了版本号为
1.0.1,但当前Peer只装了1.0.0。
正确的操作方式
场景1:确实需要不同版本链码共存(过渡场景)
如果这是你有意为之的测试(比如链码版本升级的过渡阶段),那么在调用时必须明确指定对应Peer已安装的链码版本:
- 针对Org1的Peer(装了1.0.1),调用命令要加版本参数:
peer chaincode invoke -n mycc -v 1.0.1 -c '{"Args":["invoke","a","b","10"]}' -C mychannel - 针对Org2的Peer(装了1.0.0),则指定1.0.0版本:
peer chaincode invoke -n mycc -v 1.0.0 -c '{"Args":["invoke","a","b","10"]}' -C mychannel
⚠️ 注意:这种不同版本共存的场景非常特殊,因为不同版本的链码可能会导致账本状态不一致,除非你明确知道自己在做什么(比如版本完全兼容,只是做热升级过渡),否则不建议长期这样配置。
场景2:统一通道内的链码版本(常规场景)
在大多数生产或学习场景中,通道内的链码版本应该是统一的,所有参与背书的Peer都需要安装相同版本的链码:
- 如果你想统一用
1.0.1版本:给Org2的两个Peer也安装mycc-1.0.1:peer chaincode install -n mycc -v 1.0.1 -p github.com/chaincode/chaincode_example02/go/ - 如果你想统一用
1.0.0版本:修改通道的链码定义为1.0.0,并让Org1的Peer重新安装mycc-1.0.0。
关键概念补充:链码定义(Chaincode Definition)
链码定义是通道层面的配置,它规定了链码的名称、版本、背书策略、集合配置等核心信息。当交易发起时,Peer会根据通道的链码定义来加载对应的链码版本进行背书。如果Peer本地没有安装该版本,就会出现你遇到的报错。
所以,即使你在不同Peer装了不同版本,只要通道定义的版本和Peer本地安装的版本一致,就能正常工作。如果定义版本和Peer本地版本不一致,就会触发背书失败。
内容的提问来源于stack exchange,提问作者Kanzt

