Hyperledger Fabric: Using GetHistoryFromKey with Golang



我试图在我的Golang Chaincode中实现GetHistoryFromKey(),但我只是一直获得当前令牌状态(而不是历史)。

  1. 我的Hyperledger Fabric网络(最新版本)对于这个问题是非常基础的。我正在使用fabcarGolang中织物样品的链码和SDK Node.

  2. 调用InitLedger后,我正在使用CreateCar(CarNumber: "121",…)创建一辆新车。CarNumber在这种情况下是关键。

  3. 下一步是与ChangeCarOwner("121", "NewOwner")的交易

  4. 现在我想知道这辆车的历史。因此,我实现了以下功能:

    func (s *SmartContract) GetHistoryForKeyAccIDUUIDAMO(ctx contractapi.TransactionContextInterface, carNumber string) (string, error) {
    historyIter, err := ctx.GetStub().GetHistoryForKey(carNumber)
    if err != nil {
    return "0", fmt.Errorf("Error in loading History by Key", carNumber)
    }
    if historyIter.HasNext() {
    modification, err := historyIter.Next()
    if err != nil {
    return "0", fmt.Errorf("Error in getting History by Key in Iteration", carNumber)
    }
    return string(modification.Value), nil
    } else {
    return "0", fmt.Errorf("Error in getting HistorybyKey", carNumber)
    }
    

    }

结果:{"老爷:"Toyota","model":"Rav4","colour":"Grey","称:"NewOwner"}

这不是历史上的汽车令牌,而是将Car121的所有者更改为PersonX后的汽车

如何从创建car中获取历史事务数据?

编辑:这是我的新函数,但它仍然是相同的行为。

function (s *SmartContract) getassethhistory (ctx contractapi.)TransactionContextInterface, account string, carNumber uint64) ([]HistoryQueryResult, error) {

historyKey, err := ctx.GetStub().CreateCompositeKey(Prefix, []string{owner, strconv.FormatUint(carNumber, 10)})
resultsIterator, err := ctx.GetStub().GetHistoryForKey(historyKey)
defer resultsIterator.Close()
var records []HistoryQueryResult
for resultsIterator.HasNext() {
response, err := resultsIterator.Next()
if err != nil {
return nil, err
}
var asset Asset
if len(response.Value) > 0 {
err = json.Unmarshal(response.Value, &asset)
if err != nil {
return nil, err
}
} else {
asset = Asset{Account: account}
}
timestamp, err := ptypes.Timestamp(response.Timestamp)
if err != nil {
return nil, err
}
record := HistoryQueryResult{
TxId:      response.TxId,
Timestamp: timestamp,
Record:    &asset,
IsDelete:  response.IsDelete,
}
records = append(records, record)
}
return records, nil

}

您只是从历史迭代器中读取第一个值,因此您只看到与该键相关联的一个值。要查看所有历史值,您需要遍历所有这些值,可能需要将它们收集到一个片中。请看这里的例子:

https://github.com/hyperledger/fabric-samples/blob/8ca50df4ffec311e59451c2a7ebe210d9e6f0004/asset-transfer-ledger-queries/chaincode-go/asset_transfer_ledger_chaincode.go L389-L433

最新更新