Couchdb fabric sdk go Execute不总是更新分类账

Couchdb fabric sdk go Execute不总是更新分类账,couchdb,hyperledger-fabric,go-gin,hyperledger-fabric-sdk-go,Couchdb,Hyperledger Fabric,Go Gin,Hyperledger Fabric Sdk Go,我正在使用fabric sdk中的client.channel.Execute API调用链码中的分类账更新Txs 我知道我的分类账更新的链码是正确的,因为从cli容器命令行运行时调用Tx始终工作正常 有几次,随机的,账本更新在作为来自POSTMAN的RESTAPI调用执行时没有反映出来,如下所示。在这些情况下,响应代码为200,正确的响应负载表明链码运行成功 ` 我正在docker容器中运行Fabric 1.4.4图像。我的网络有1个组织和4个对等节点 肯定缺少导致这种行为的某些方面。 提前感

我正在使用fabric sdk中的client.channel.Execute API调用链码中的分类账更新Txs

我知道我的分类账更新的链码是正确的,因为从cli容器命令行运行时调用Tx始终工作正常

有几次,随机的,账本更新在作为来自POSTMAN的RESTAPI调用执行时没有反映出来,如下所示。在这些情况下,响应代码为200,正确的响应负载表明链码运行成功

`

我正在docker容器中运行Fabric 1.4.4图像。我的网络有1个组织和4个对等节点

肯定缺少导致这种行为的某些方面。
提前感谢。

所有节点同步其数据块都需要时间。一旦对等方收到这些块,他们将更新其世界状态,以便您可以通过查询查看您的更改

当您查询“刚刚执行”的事务时,您可能会点击其他对等方之一。如果希望立即得到结果,请确保您查询的是实际执行事务的同一对等方。您可以尝试延迟一些时间,以便看到其他同龄人,以及获得阻塞

在CLI上立即看到更改的原因与客户端实现的方式有关。在CLI命令执行时,可以显式指定对等方。因此,事务在一个对等机上执行,并在同一个对等机上查询(无问题)。您可以在执行事务(通过CLI)后立即(通过CLI)查询另一个组织的对等方来证明此行为

但是,对于您的客户机,可能因为您没有明确指定对等机,所以您的客户机SDK使用对等机的发现服务,在网络中为您找到一个对等机并使用它


由于这个原因,当背书策略像“AND(org1,org2)”这样形成时,客户端SDK实际上查询2个对等方(每个组织一个)并比较结果。

谢谢@hsnkhrmn,这非常直观地解释了异常情况。对数据一致性进行优先级排序我总是可以在同一个对等机上运行查询和调用,但我担心这会破坏拥有多个节点的目的。相反,如果在每次账本更新调用后将对等机返回到客户端并存储在某个存储中(客户端),会不会更好因此,可以对该对等方(存储在客户端存储中的ID)进行后续分类账查询调用,直到进行另一个分类账更新调用,从而覆盖存储中的对等方。有可能吗?你的担心完全正确。为了保证您的事务被提交,您可以遵循或实现,并查看差异。发送事务后,您需要等待提交事件,然后执行查询,这将授予一定程度的一致性。检查数据完整性问题以及如何处理。还要检查上的问题“如何保证查询结果正确”。
chaincodeID := "hcc"
fcn := "GiftToken"
args := [][]byte{
    []byte(reqBody.TokenID),
    []byte(reqBody.GiftToUserID),
    []byte(GiftTokenCountAsString),
}

setup := lib.GetFabricSetup()

transientDataMap := make(map[string][]byte)
transientDataMap["result"] = []byte("Transient data in GiftToken invoke")

response, err := setup.Client.Execute(channel.Request{ChaincodeID: chaincodeID, Fcn: fcn, Args: args, TransientMap: transientDataMap})