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