Hyperledger Fabric 如何处理同一对链码键值对 "invoke" 的并发?

How Hyperledger Fabric handle the Concurrent of "invoke" of the same Key-Value pair of chaincode?

例如,两个应用程序正在连接一个链代码,如果几乎同时请求"invoke"相同键值对链代码的动作,会发生什么?

如果它是 Hyperledger Fabric 的噩梦,我们该如何应对?在 Hyperledger core.yaml 设置方面?还是链码设计的一面?

所有调用和查询事务都是按顺序执行的(不是同时执行的)。在 中解释了交易是如何执行的。观察到通过共识,所有执行都是有序的,然后每个节点都按照该顺序执行它们。所以没有并发。

注:第一个回答是Fabric v0.6相关的。 Fabric v1 使用不同的机制。步骤是(据我目前所知):

  1. 客户向背书人发送交易。
  2. 背书者执行交易,生成世界状态键/值更改集,称为Read/Write集。背书人 return 给客户的结果。
  3. 客户端收到所有人的响应并比较结果和R/W设置背书策略。
  4. 客户端将成功的背书转发给排序服务,排序服务从一组交易中创建区块。
  5. 排序服务将完整的区块转发给所有提交者(背书者、观察者等)。
  6. 每个提交者按顺序应用事务的 R/W 集,更新每个读取密钥的版本(显然使用哈希图)。在提交每个集合时,它会检查读取集中每个密钥的版本,以便密钥版本不得低于当前版本号。

注意:这是 v0.6 的重大变化,因为即使在调用的上下文中,读取也只能看到完全提交的事务!如果存在任何密钥冲突,交易将在最后一分钟失败!没有发出链代码事件,但失败记录在最后一个块中。世界状态更改丢失,必须由客户端重新提交交易!

解决此问题的方法是将您的链代码设计为为每个资产使用共享密钥,或者将您的客户端设计为流量控制API调用(链代码事件,无论你想怎么称呼它)在资产层面,或者很可能是两者。

因此,原始问题的答案是事务在 v0.6 Fabric 上都可以正常工作,并且第一个事务可以工作,但第二个事务在 Fabric v1 上失败,如果两者发送得太近(并且同时太近) .

显然,当没有密钥冲突时,两者总是有效(假设交易通过共识并且是确定性的——就像在所有背书者上创建相同的结果)。