作者整理了8条编写链码的实践准则。

我相信

那么,为什么我讨厌这样?

原因1:假设你已经完成这个Fabric链码,一切都很正常,直到有一天, 某个运行这个链码的peer节点,崩溃了。虽然账本数据还在,但是内部有些可怕的事情已经发生了。你可能重新启动peer节点,起初一切看起来都正常。 但是突然,这个节点背书的所有交易都开始失败了。为什么?就是因为那个全局计数变量已经不能正确跟踪真实的值了。其他的peer节点都计数到比如15K了,而这个节点突然从零开始计数,你的弹珠的ID又从零开始了。因此,当你将这个交易发送给排序节点(Orderer)并到达提交节点(Peer)时,提交节点上的验证系统(Validation System Chaincode)会比较所有背书交易的提议响应, 同时检查是否有足够的签名存在,只要有一个提议响应不匹配,提交节点就会抛出一个 ENDORSEMENT_POLICY_FAILURE异常。

原因2:现在让我们尝试解决上面的问题,在Fabric链码的最后添加代码 stub.PutState("marble_count", totalNumberOfMarbles)

这样会好一些吗? NO…

考虑一下有两个并发交易都试图插入新的弹珠。

例如,一个交易要将marble_count的值更新为34,此时marble_count的版本为10 new_version(marble_count) = 10。 而另一个交易则要将marble_count的值更新为35,也是 new_version(marble_count) = 10 。 记住,由于这两个交易是并发的,两个交易看到的都是current_version(marble_count) = 09

现在其中一个交易将在另一个交易之前到达Fabric的排序节点,marble_count键已经更新到新的值,这时marble_count的版本已经是10,因此后到的交易将失败,因为 marble_count的版本已经是10 ,而后续交易还认为它读的是版本09并且将更新到版本10。这是

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注