我有一个Hyperledger Fabric网络,其中有多个具有对应StateDB(CouchDB)的对等体,并且在docker compose文件下的所有对等体配置中,我都给出了CORE_LEDGER_HISTORY_ENABLEHISTORYDATABASE = true。我将能够检索记录更新记录的想法是密钥。这里的关键是一个贸易编号,每当贸易的任何属性得到更新时,我都会看到CouchDB中发生更新,因为我看到修订值增加了。现在,在我的chaincode函数中,在下面的代码片段(现在为示例代码)中添加了
_,args:= 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))
} 返回shim.Success(nil)
但是,每次我检查chaincode容器时,它只打印Trade的最后一个值,而不是它经过的更新数量,有人可以让我知道我在做什么错吗?
答案 0 :(得分:1)
好吧,这个问题是只使用一次历史迭代器,而不是对其进行实际迭代。
代替:
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))
}
它将迭代所有关键更新和打印值。