Hyperledger Fabric如何回滚数据?

问题描述

我阅读了有关Hyperledger Fabric网络接受数据以写入分类帐的方式的文档。这是由认可同行完成的。 但这是另一种情况,我有多次调用PutState的情况。

// 1. Update User 
err = stub.PutState(userKey,updateUser)
if err != nil {
    return nil,Response.Error
}
// 2. Update Product
err = stub.PutState(productKey,updateProduct)
if err != nil {
    return nil,Response.Error
}

如果第二个呼叫(更新产品)失败,但是第一个呼叫(新用户)成功,这很奇怪。 用户数据仍然显示分类帐中,但不应显示分类帐中。我有两个问题:

  1. 在这种情况下,谁能向我解释或提供与回滚相关的任何文件

  2. 如何解决此问题以进行真正的回滚?

织物1.4版

解决方法

从客户发送给对等方的提案可能会多次调用分类帐的方法。通常,成功的链码调用应达到return shim.Success(nil) chaincode example

当您调用链码存根的方法(PutStateGetState,...)时,链码服务将向已连接到Peer-Endorser的流发送一条消息到尝试与分类帐互动。您可以看一下Fabric的源代码here-Endorser在其中处理来自链码服务的事件。

如果您的第一个呼叫成功,则对等方对chaincode服务的响应没有错误。这并不意味着分类帐已更新。事务仅在提交到一个块时才成功。

第二次调用失败时,调用将以错误结束。对等方将向调用方提供错误响应。如果呼叫者不断将交易发送给订购者,则对等方-提交者仍然拒绝该交易=>实际没有更新数据=>无需回滚

我认为您应该仔细阅读the transaction flow document

根据您的情况,让我们尝试在触发错误时return shim.Error(err.Error())