Hyperledger fabric Hyperledger-链码指纹不匹配
我们已经在内部建立了一个Hyperledger网络来运行一些测试。所使用的Hyperledger结构版本为1.1 我们有一个由5台机器组成的网络,每台机器代表一个组织,所有这些机器都有两个对等机、一个CA以及一个命令行界面——在Docker上运行。我们还有一个在独立机器上运行的Orderer节点 我们可以安装Golang链码,让组织间的沟通正常。当我们试图通过BNAs安装业务网络逻辑时,问题就出现了。我们正在使用Hyperledger Composer 0.19.7。要做到这一点,会发生以下情况:Hyperledger fabric Hyperledger-链码指纹不匹配,hyperledger-fabric,hyperledger,hyperledger-composer,Hyperledger Fabric,Hyperledger,Hyperledger Composer,我们已经在内部建立了一个Hyperledger网络来运行一些测试。所使用的Hyperledger结构版本为1.1 我们有一个由5台机器组成的网络,每台机器代表一个组织,所有这些机器都有两个对等机、一个CA以及一个命令行界面——在Docker上运行。我们还有一个在独立机器上运行的Orderer节点 我们可以安装Golang链码,让组织间的沟通正常。当我们试图通过BNAs安装业务网络逻辑时,问题就出现了。我们正在使用Hyperledger Composer 0.19.7。要做到这一点,会发生以下情况
指纹不匹配数据不匹配是因为安装在对等机上的包以相同的方式不同,因此结构将此差异视为问题并报告此错误 为了理解这是如何发生的,需要了解composer如何将bna放到对等机上的详细信息 一个扩展的bna文件看起来像一个节点模块,它有一个package.json文件和一些组成业务网络的工件,因此composer解包bna文件并使用fabric node sdk将其打包,告诉它是一个节点模块,fabric node sdk将适当地打包并发送给对等方。fabric然后可以解包并执行
npm安装--production
,以完成此业务网络的设置。
但是,需要确保bna的package.json中存在对某些composer npm模块的引用,以便业务网络能够实际运行,如果这些引用不存在,则在fabric node sdk创建最终包并将其发送给对等方之前,composer network install
命令会将它们注入package.json中。
该命令有效地将这些行添加到package.json文件的dependencies部分
“composer-runtime-hlfv1”: “0.19.9”,
“composer-common”: “0.19.9”
(请注意,此处提供的版本号是撰写本文时的最新版本,您可能需要使用其他/更新版本的composer运行时)
插入的版本号取自您当前安装的composer cli版本,因此,如果您有不同版本的composer cli,您可以看到,当您将相同的bna部署到不同的对等机上时,如果安装了不同版本的composer cli,则在对等机上结束的包将不同。
(作为补充,fabric node sdk不使用文件的日期/时间,而是将其设置为确定性值,因此不同的日期/时间不是问题。)
有两种方法可以确保此问题不会发生
composer-runtime-hlfv1
和composer-common
依赖项的版本。如果存在这些条目,则在将包发送给对等方之前,命令行不会覆盖package.json或将条目注入package.json安装链码时,请提供路径、ID和版本。这三个属性都成为调用链码时必须匹配的“指纹”的一部分。当安装相同的链码但使用不同的路径时,会出现此问题。当同一频道上的不同用户想要独立运行链码时,这种情况就会有机地发生。例如: 人员A在Peer1上安装以下设备:
path - /uhoh/chaincode/marbles/dir,
id - marbles
version - v1
而人员B在Peer2上安装时:
path - /marbles
id - marbles
version - v1
然后让我们选择一个人来实例化两个对等方加入的通道上的链码。其目的是每个人都有自己的链码运行,但是b/c路径不同调用将无法在人b的对等机上运行
此问题已在fabric v1.1.3、v1.2.2和v1.3+版本中解决,有关更多详细信息,请参阅。在fabric级别,当安装链码时(在composer network安装之后)-它提供路径、ID和版本。这三个属性都成为“指纹”的一部分,在[随后]调用chai时必须匹配