我试图在我的Golang Chaincode中实现GetHistoryFromKey(),但我只是一直获得当前令牌状态(而不是历史)。
-
我的Hyperledger Fabric网络(最新版本)对于这个问题是非常基础的。我正在使用fabcarGolang中织物样品的链码和SDK Node.
-
调用InitLedger后,我正在使用CreateCar(CarNumber: "121",…)创建一辆新车。CarNumber在这种情况下是关键。
-
下一步是与ChangeCarOwner("121", "NewOwner")的交易
-
现在我想知道这辆车的历史。因此,我实现了以下功能:
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