如何获取 Hyperledger Fabric 中特定密钥的交易历史记录?

How to get transaction history on a particular key in Hyperledger Fabric?

我有一个 Hyperledger Fabric 网络,它有多个具有相应 StateDB (CouchDB) 的对等点,并且我在 docker 撰写文件下的所有对等点配置中都给出了 CORE_LEDGER_HISTORY_ENABLEHISTORYDATABASE=true。我应该能够根据密钥检索记录的更新历史的想法。这里的关键是交易号,每当交易的任何属性更新时,我都会看到 CouchDB 中发生更新,因为我看到修订值增加了。现在,在我的链代码函数中,添加了以下代码片段(现在的示例代码)

_, 参数 := stub.GetFunctionAndParameters()

tradeNumber := args[1]

historyIer, err := stub.GetHistoryForKey(tradeNumber)

if err != nil {
    fmt.Println(err.Error())
    return shim.Error(err.Error())
}

if historyIer.HasNext() {
    modification, err := historyIer.Next()
    if err != nil {
        fmt.Println(err.Error())
        return shim.Error(err.Error())
}
fmt.Println("Returning information about", string(modification.Value))

} return shim.Success(无)

但是,每次我检查链代码容器时,它只打印最后一个贸易值而不是它经历的更新次数,有人可以告诉我我在这里做错了什么吗?

好吧,问题是只使用一次历史迭代器而不是实际迭代它。

而不是:

if historyIer.HasNext() {
    modification, err := historyIer.Next()
    if err != nil {
        fmt.Println(err.Error())
        return shim.Error(err.Error())
    }
    fmt.Println("Returning information about", string(modification.Value))
}

您需要做的:

for historyIer.HasNext() {
    modification, err := historyIer.Next()
    if err != nil {
        fmt.Println(err.Error())
        return shim.Error(err.Error())
    }
    fmt.Println("Returning information about", string(modification.Value))
}

这将遍历所有关键更新和打印值。