我们在内部设置了一个Hyperledger网络来运行一些测试 . 正在使用的Hyperledger Fabric版本是1.1 .
我们有一个由5台机器组成的网络,每台机器代表一个组织,所有这些机器都运行在Docker上 - 两个对等体,一个CA,以及一个命令行界面 . 我们还有一个在独立计算机上运行的Orderer节点 .
我们可以安装Golang链代码,让组织沟通得很好 . 当我们尝试通过BNA安装业务网络逻辑时出现问题 . 我们正在使用Hyperledger Composer 0.19.7 . 要做到这一点,这是发生的事情:
-
我使用npm install生成BNA .
-
我在本地对等设备上成功安装它,并通过composer install和composer start命令启动网络 .
-
我将完全相同的BNA文件发送给网络的其他成员,并且他们还使用composer install命令成功地将其安装在对等体上 .
-
但是,当他们尝试使用相应的管理卡与网络(作曲家网络ping)通信时,会显示以下消息:
错误:尝试ping时出错 . 错误:2 UNKNOWN:执行chaincode时出错:无法获取Todo-poc5-network的ChaincodeDeploymentSpec:0.0.1:从LSCC错误获取Todo-poc5-network / default的ChaincodeDeploymentSpec:链代码指纹不匹配数据不匹配命令失败
真正奇怪的部分是,如果我 - 而不是BNA - 分发安装在我的对等体上的bin文件(可以在/ var / hyperledger / peer0 / chaincodes文件夹中找到),ping命令可以正常工作,组织可以进行通信 . 但是分发bin文件而不是BNA本身似乎不是理想的解决方案 .
有没有人经历过类似的事情?
提前致谢 .
编辑:
好的,对不起,长期缺席 .
事实证明我们运行了不同版本的CLI,但即使在对它们进行规范化之后,仍然会出现错误 . 还有其他建议吗?
您提到安装后会提供路径,ID和版本 . 有什么地方我可以看到它们吗?
通过命令行,通过编写器安装所有我看到的是:
✔安装业务网络 . 这可能需要一分钟...成功安装业务网络预测poc,版本1.0.2命令成功
2 回答
指纹不匹配数据不匹配的发生是因为安装到对等端的程序包以不同的方式不同,因此这种结构将此差异视为一个问题并报告此错误 .
为了理解这是如何发生的,需要有关作曲家如何将bna放到对等体上的详细信息 .
扩展的bna文件看起来像一个节点模块,它有一个package.json文件和构成业务网络的一些工件,因此composer解压缩bna文件并使用fabric-node-sdk打包它,告诉它是节点模块和fabric-node-sdk将适当地打包并将其发送给对等体 . 然后,Fabric可以解压缩此包并执行
npm install --production
以完成此业务网络的设置 . 但是,需要确保在bna的package.json中存在对某些编写器npm模块的引用,以便业务网络能够实际运行,如果这些引用不存在则composer network install
命令注入它们在fabric-node-sdk创建最终包并将其发送给对等方之前,为您准备了package.json . 该命令有效地做的是将这些行添加到package.json文件的dependencies部分(注意这里提供的版本号是编写本文时的最新版本,您可能希望使用另一个/更新版本的composer运行时)
并且插入的版本号取自您当前安装的composer-cli的版本,因此如果您有不同版本的composer-cli,您可以看到当您将相同的bna部署到不同的对等端时,如果安装了不同版本的composer-cli,则对等端的最终结果会有所不同 . (作为一个侧面,fabric-node-sdk不使用文件的日期/时间,而是将它们设置为确定值,因此不同的日期/时间不是问题 . )
有两种方法可以确保不会发生此问题 .
确保使用完全相同级别的composer-cli安装到不同组织的同行
您可以显式设置
composer-runtime-hlfv1
和composer-common
的版本依赖自己在业务网络实现的package.json中 . 如果存在这些,则在将包发送到对等体之前,命令行不会覆盖或将条目注入package.json .安装链码时,您需要提供路径,ID和版本 . 所有三个属性都成为调用链码时必须匹配的“指纹”的一部分 . 安装相同的链码但使用不同的路径时会出现此问题 . 当同一 Channels 上的不同人想要独立运行链码时,这种情况将有机地发生 . 例:
人A安装在Peer1上:
和人B安装在Peer2上:
然后让我们选择Person A来实例化同伴加入的 Channels 上的链码 . 意图是每个人都有自己的链代码运行,但是b / c路径不同,调用将无法在人B的同伴上运行 .
此问题已在fabric v1.1.3,v1.2.2和v1.3的版本中关闭,有关详细信息,请参阅issues FABN-855 .