Hyperledger - 链码指纹不匹配

Hyperledger - Chaincode Fingerprint Mismatch

我们已经在内部设置了一个 Hyperledger 网络来 运行 一些测试。使用的 Hyperledger Fabric 版本是 1.1.

我们有一个由 5 台机器组成的网络,每台机器代表一个组织,并且所有这些机器都有 - 运行宁超过 Docker - 两个对等点,一个 CA,以及一个命令行界面。我们还有一个在独立机器上 运行ning 的 Orderer 节点。

我们可以安装 Golang 链代码,让组织之间的沟通变得很好。当我们尝试通过 BNA 安装业务网络逻辑时,问题就出现了。我们正在使用 Hyperledger Composer 0.19.7。这样做是会发生什么:

  1. 我使用 npm install 生成 BNA。

  2. 我在我的本地节点上成功安装它并通过 composer installcomposer start 命令启动网络.

  3. 我将完全相同的 BNA 文件发送给网络的其他成员,他们也成功地使用 composer install 命令将其安装在他们的同行上。

  4. 但是,当他们尝试使用适当的管理卡与网络通信 (composer network ping) 时,会显示以下消息:

Error: Error trying to ping. Error: 2 UNKNOWN: error executing chaincode: could not get ChaincodeDeploymentSpec for todo-poc5-network:0.0.1: get ChaincodeDeploymentSpec for todo-poc5-network/default from LSCC error: chaincode fingerprint mismatch data mismatch Command failed

真正奇怪的部分是,如果我 - 而不是 BNA - 分发安装在我的同行上的 bin 文件(在 /var/hyperledger/peer0/chaincodes文件夹)ping 命令运行良好,组织可以进行通信。但是分发 bin 文件而不是 BNA 本身似乎不是理想的解决方案。

有没有人经历过类似的事情?

提前致谢。

编辑:

好的,抱歉,久违了。

事实证明我们有不同版本的 CLI 运行ning,但即使在规范化它们之后错误仍然出现。还有其他建议吗?

您提到安装后会提供路径、ID 和版本。有什么地方可以看到它们吗?

在命令行上,通过 composer install 我看到的是:

✔ Installing business network. This may take a minute... Successfully installed business network predic-poc, version 1.0.2 Command succeeded

发生指纹不匹配数据不匹配,因为安装到对等方的包以相同的方式不同,因此 fabric 将此差异视为问题并报告此错误。

为了了解这是如何发生的,需要有关作曲家如何将 bna 放到对等节点上的详细信息。

展开的bna文件看起来像一个node模块,它有一个package.json文件和一些组成业务网络的工件,所以composer解压bna文件并使用fabric-node-sdk打包它,告诉它是一个节点模块,fabric-node-sdk 将适当地打包并将其发送给对等方。 fabric 然后可以解包这个包并执行 npm install --production 来完成这个业务网络的设置。 但是,需要确保 bna 的 package.json 中存在对某些 composer npm 模块的引用,以便业务网络能够实际 运行,如果这些引用不存在然后 composer network install 命令在 fabric-node-sdk 创建最终包并将其发送给对等方之前为您将它们注入 package.json。 该命令有效的作用是将这些行添加到 package.json 文件

的依赖项部分
“composer-runtime-hlfv1”: “0.19.9”,
“composer-common”: “0.19.9”

(注意此处显示的版本号是撰写本文时的最新版本,您可能希望使用作曲家 运行 时的 different/newer 版本)

并且插入的版本号取自您当前安装的 composer-cli 的版本,所以如果您有不同版本的 composer-cli,您可以看到当您将相同的 bna 部署到不同的peers,如果安装了不同版本的 composer-cli,最终在 peer 上的包会有所不同。 (顺便说一句,fabric-node-sdk 不使用文件的 date/time,而是将它们设置为确定性值,因此 date/time 不同不是问题。)

有两种方法可以确保此问题不会发生。

  1. 确保您使用完全相同级别的 composer-cli 来安装到不同组织的同行
  2. 您可以在业务网络实施的 package.json 中自行明确设置 composer-runtime-hlfv1composer-common 依赖项的版本。如果存在这些,则在将包发送给对等方之前,命令行将不会覆盖条目或将条目注入 package.json。

安装链代码时,您需要提供路径、ID 和版本。所有三个属性都成为 "fingerprint" 的一部分,在调用链代码时必须匹配。当您安装相同的链代码但使用不同的路径时会出现此问题。当同一频道上的不同人想要独立 运行 链代码时,这种情况就会有机地发生。示例:

人 A 在 Peer1 上安装:

path - /uhoh/chaincode/marbles/dir,
id - marbles
version - v1

B 在 Peer2 上安装:

path - /marbles
id - marbles
version - v1

然后让我们选择 Person A 在两个对等方都加入的通道上实例化链代码。意图是每个人都会有自己的链代码 运行ning,但是 b/c 路径不同,调用将无法 运行 在 B 的对等方上。

此问题已在 fabric v1.1.3、v1.2.2 和 v1.3+ 版本中关闭,请参阅issues FABN-855了解更多详情。