func (t *basicInfo) queryAll(stub shim.ChaincodeStubInterface, args []string) pb.Response{ if(len(args)!=1){ return shim.Error("except one arg") } resultsIterator,err:= stub.GetHistoryForKey(args[0]) if err!=nil{ return shim.Error(err.Error()) } defer resultsIterator.Close() var buffer bytes.Buffer buffer.WriteString("[") bArrayMemberAlreadyWritten := false for resultsIterator.HasNext() { response, err := resultsIterator.Next() if err != nil { return shim.Error(err.Error()) } if bArrayMemberAlreadyWritten == true { buffer.WriteString(",") } buffer.WriteString("{\"TID\":") buffer.WriteString("\"") buffer.WriteString(response.TxId) buffer.WriteString("\"") buffer.WriteString(", \"THistory\":") if response.IsDelete { buffer.WriteString("null") } else { buffer.WriteString(string(response.Value)) } buffer.WriteString(", \"TTime\":") buffer.WriteString("\"") buffer.WriteString(time.Unix(response.Timestamp.Seconds, int64(response.Timestamp.Nanos)).String()) buffer.WriteString("\"") buffer.WriteString(", \"IsDelete\":") buffer.WriteString("\"") buffer.WriteString(strconv.FormatBool(response.IsDelete)) buffer.WriteString("\"") buffer.WriteString("}") bArrayMemberAlreadyWritten = true } buffer.WriteString("]") return shim.Success(buffer.Bytes()) }
时间: 2023-07-05 09:05:19 浏览: 56
这是一个基于 Hyperledger Fabric 的智能合约中的一个函数,用于查询某个 key 的历史记录。在这个函数中,首先检查参数是否为一个,如果不是则返回错误信息。然后调用 `stub.GetHistoryForKey(args[0])` 函数获取 key 的历史记录迭代器。接着遍历历史记录迭代器,使用 `bytes.Buffer` 缓存查询结果,并将查询结果转换为 JSON 格式返回。最后,返回查询结果的字节数组。
相关问题
func (t *basicInfo) Init(stub shim.ChaincodeStubInterface) pb.Response { return shim.Success(nil) } func (t *basicInfo) Invoke(stub shim.ChaincodeStubInterface) pb.Response { funcName, args := stub.GetFunctionAndParameters() if funcName == "save" { return t.saveBasic(stub, args) } else if funcName == "query" { return t.queryBasic(stub, args) } else if funcName == "delete" { return t.deleteBasic(stub, args) } else if funcName == "queryAll" { return t.queryAll(stub, args) } else { return shim.Error("no such function") } } func (t *basicInfo) saveBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 2 { return shim.Error("except two args") } else { err := stub.PutState(args[0], []byte(args[1])) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil) } }
这段代码已经比较简洁,但可以进一步优化:
1. 在 `Init` 函数中,可以使用 `shim.Success([]byte{})` 替代 `shim.Success(nil)`,以避免在调用端出现错误。
2. 在 `Invoke` 函数中,可以使用 `switch` 语句替代 `if else` 语句,使代码更加简洁易读。
3. 在 `saveBasic` 函数中,可以使用 `shim.Success([]byte{})` 替代 `shim.Success(nil)`,以避免在调用端出现错误。
下面是优化后的代码:
```
func (t *basicInfo) Init(stub shim.ChaincodeStubInterface) pb.Response {
return shim.Success([]byte{})
}
func (t *basicInfo) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
funcName, args := stub.GetFunctionAndParameters()
switch funcName {
case "save":
return t.saveBasic(stub, args)
case "query":
return t.queryBasic(stub, args)
case "delete":
return t.deleteBasic(stub, args)
case "queryAll":
return t.queryAll(stub, args)
default:
return shim.Error("no such function")
}
}
func (t *basicInfo) saveBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response {
if len(args) != 2 {
return shim.Error("except two args")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error(err.Error())
}
return shim.Success([]byte{})
}
```
func (t *basicInfo) saveBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response { if(len(args)!=2){ return shim.Error("except two args") }else{ err:=stub.PutState(args[0],[]byte(args[1])) if(err!=nil) { return shim.Error(err.Error()) } return shim.Success(nil) } } func (t *basicInfo) queryBasic(stub shim.ChaincodeStubInterface, args []string) pb.Response{ if(len(args)!=1){ return shim.Error("except one arg") }else{ value,err :=stub.GetState(args[0]) if(err!=nil){ shim.Error("no data found") } return shim.Success(value) } }
这段代码是一个基本信息的智能合约,包括保存和查询操作。其中,saveBasic函数用于保存基本信息,接收两个参数:args[0]表示关键字,args[1]表示数据。queryBasic函数用于查询基本信息,接收一个参数args[0]表示要查询的关键字。如果查询成功,返回shim.Success(value),value表示查询到的数据;如果查询失败,返回shim.Error("no data found")。如果保存成功,返回shim.Success(nil);如果保存失败,返回shim.Error(err.Error())。
阅读全文