链码如何并行执行?

Lin*_*ear 1 hyperledger-fabric

我一直在研究 Hyperledger Fabric 大约 1 年。

但是我仍然无法说出链码是如何工作的以及如何准确处理的,尤其是在其实现和流程方面。

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

链码正在运行并与对等点隔离,作为 docker 容器之一,因为它在网络中具有完整性。链码是一个程序,它定义了交易中的函数(例如,AddTwoIntegerValues())应该如何更新账本

此外,背书节点访问链码以执行来自客户端或其他节点的交易提案中的功能,以响应背书。(此过程不清楚)

在这种情况下,我想问你这些背书节点如何并行执行或访问链码容器?我听说“链码执行”是指链码逻辑计算的模拟。但我无法理解。

换句话说,我的问题是他们如何同时执行或访问它?他们有那个链码的副本吗?peers 如何知道链码逻辑?如果我错了,你能纠正我或解释链码过程吗?

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

yac*_*ovm 6

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

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

  • 旋转容器以编译链码代码包以生成链码垫片二进制文件,然后将其销毁
  • 旋转一个容器,该容器将实际运行链码 shim 二进制文件。

链码垫片二进制文件:

  • 通过 gRPC 连接到对等方并将自身注册为安装时使用的名称。
  • 运行一个无限循环,在其中等待命令来模拟来自对等方的交易。

每当对等方收到来自客户端的提议时,它:

  • 定位链码容器 gRPC 流并将提案从客户端转发到链码
  • 准备链码 shim 在执行期间会询问对等方的密钥读写映射,称为读写集

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

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

  • 如果数据操作是读操作,它会将密钥和从密钥读取的版本添加到读写集合中,并通过 gRPC 流将密钥和值发送回链码垫片容器。
  • 如果数据操作是写操作,则将键、值和版本添加到读写集,然后向链码 shim(*) 发回“OK”。

(*) 我个人认为这一步不是必须的……它只是延长了执行时间

在链码 shim 完成交易计算后,它将结果(即“OK”)连同表示交易完成执行的标记一起发送回对等方。

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

In that case, I'd like to ask you how those endorsing peers can execute or access the chaincode container in parallel?
Run Code Online (Sandbox Code Playgroud)

您可以并行执行此操作,因为当链代码 shim 调用事务时,它会在单独的 goroutine执行此操作