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 使用不同的机制。步骤是(据我目前所知):
- 客户向背书人发送交易。
- 背书者执行交易,生成世界状态键/值更改集,称为Read/Write集。背书人 return 给客户的结果。
- 客户端收到所有人的响应并比较结果和R/W设置背书策略。
- 客户端将成功的背书转发给排序服务,排序服务从一组交易中创建区块。
- 排序服务将完整的区块转发给所有提交者(背书者、观察者等)。
- 每个提交者按顺序应用事务的 R/W 集,更新每个读取密钥的版本(显然使用哈希图)。在提交每个集合时,它会检查读取集中每个密钥的版本,以便密钥版本不得低于当前版本号。
注意:这是 v0.6 的重大变化,因为即使在调用的上下文中,读取也只能看到完全提交的事务!如果存在任何密钥冲突,交易将在最后一分钟失败!没有发出链代码事件,但失败记录在最后一个块中。世界状态更改丢失,必须由客户端重新提交交易!
解决此问题的方法是将您的链代码设计为不为每个资产使用共享密钥,或者将您的客户端设计为流量控制API调用(链代码事件,无论你想怎么称呼它)在资产层面,或者很可能是两者。
因此,原始问题的答案是事务在 v0.6 Fabric 上都可以正常工作,并且第一个事务可以工作,但第二个事务在 Fabric v1 上失败,如果两者发送得太近(并且同时太近) .
显然,当没有密钥冲突时,两者总是有效(假设交易通过共识并且是确定性的——就像在所有背书者上创建相同的结果)。
例如,两个应用程序正在连接一个链代码,如果几乎同时请求"invoke"相同键值对链代码的动作,会发生什么?
如果它是 Hyperledger Fabric 的噩梦,我们该如何应对?在 Hyperledger core.yaml 设置方面?还是链码设计的一面?
所有调用和查询事务都是按顺序执行的(不是同时执行的)。在
注:第一个回答是Fabric v0.6相关的。 Fabric v1 使用不同的机制。步骤是(据我目前所知):
- 客户向背书人发送交易。
- 背书者执行交易,生成世界状态键/值更改集,称为Read/Write集。背书人 return 给客户的结果。
- 客户端收到所有人的响应并比较结果和R/W设置背书策略。
- 客户端将成功的背书转发给排序服务,排序服务从一组交易中创建区块。
- 排序服务将完整的区块转发给所有提交者(背书者、观察者等)。
- 每个提交者按顺序应用事务的 R/W 集,更新每个读取密钥的版本(显然使用哈希图)。在提交每个集合时,它会检查读取集中每个密钥的版本,以便密钥版本不得低于当前版本号。
注意:这是 v0.6 的重大变化,因为即使在调用的上下文中,读取也只能看到完全提交的事务!如果存在任何密钥冲突,交易将在最后一分钟失败!没有发出链代码事件,但失败记录在最后一个块中。世界状态更改丢失,必须由客户端重新提交交易!
解决此问题的方法是将您的链代码设计为不为每个资产使用共享密钥,或者将您的客户端设计为流量控制API调用(链代码事件,无论你想怎么称呼它)在资产层面,或者很可能是两者。
因此,原始问题的答案是事务在 v0.6 Fabric 上都可以正常工作,并且第一个事务可以工作,但第二个事务在 Fabric v1 上失败,如果两者发送得太近(并且同时太近) .
显然,当没有密钥冲突时,两者总是有效(假设交易通过共识并且是确定性的——就像在所有背书者上创建相同的结果)。