链码如何并行执行?

时间:2018-06-27 02:05:42

标签: hyperledger-fabric

我已经研究Hyperledger Fabric大约一年了。

但是我仍然无法确定链码的工作原理和处理方式,尤其是在实施和过程方面。

这就是我下面的理解链码的方式。

作为其在网络中完整性的docker容器之一,一个链代码正在运行并且与对等方隔离。 chaincode是一个程序,用于定义交易中的功能(例如AddTwoIntegerValues())应如何更新分类帐

此外,背书的对等方访问链代码以执行来自客户或其他对等方的交易建议中的功能以回应背书。(此过程尚不清楚)

在这种情况下,我想问你那些背书的同行如何并行执行或访问链码容器?我听说“链码执行”是指链码逻辑计算的仿真。但是我不明白。

换句话说,我的问题是他们如何同时执行或访问它?他们有该链码的副本吗?同行如何知道链码逻辑?如果我输入错了,您能纠正我还是解释一下链码处理过程?

如果您对我的问题有任何想法,请告诉我。我期待您的回答!

1 个答案:

答案 0 :(得分:4)

每个对等方对于给定链代码的每个版本都有自己的链代码容器。 将链码安装在对等方时,链码的代码的代码包将写入文件系统。

稍后,当对等方收到调用链代码上的函数的请求时(Init()或Invoke(),当Init()在实例化上运行时),对等方检查链代码是否已在运行,并且如果没有,它:

  • 旋转一个容器来编译chaincode代码包,以生成chaincode shim二进制文件,然后销毁它
  • Spins一个容器,该容器实际上将运行chaincode shim二进制文件。

chaincode shim二进制文件:

  • 通过gRPC连接到对等端,并自行注册为其安装名称。
  • 运行一个无限循环,在该循环中,它等待命令模拟来自对等方的事务。

只要对方收到客户的建议,便会:

  • 找到链码容器gRPC流并将提案从客户端转发到链码
  • 准备密钥读取和写入的映射,链码填充程序在执行过程中会询问对等方,称为Read-Write set

然后,在容器内部运行的链码填充程序-从提案中提取参数,并开始运行链码逻辑(其二进制文件的一部分)。

如果链码逻辑包含诸如GetState或PutState之类的数据访问操作,它将沿着连接到对等方的同一gRPC流向对等方发送请求,然后对等方执行以下操作:

  • 如果数据操作是读取操作,则将密钥和从密钥读取的版本添加到读写集中,然后通过gRPC流将密钥和值发送回链式代码填充容器。
  • li>
  • 如果数据操作是写操作,则将密钥,值和版本添加到读写集,然后将“ OK”发送回链码shim(*)。

(*)我个人认为此步骤不是必需的……它只会延长执行时间

链码填充程序完成交易的计算之后,它将结果(即“确定”)以及表示交易已完成执行的标记发送回对等方。

由于写入的值并未真正写入数据库,而是仅添加到内存映射中,因此称为“事务模拟”。 然后,对等方继续对交易模拟的结果(读写集映射和来自链码填充程序的结果)进行签名,然后将签名的交易模拟(也称为“背书”)作为响应返回给客户端。 >

In that case, I'd like to ask you how those endorsing peers can execute or access the chaincode container in parallel?

您可以并行执行此操作,因为当链码填充程序调用事务时,它会在a separate goroutine上执行。