Chaincode HLF存储带有附加信息的变量



我正在使用基于链码的HLF系统来展示如何创建智能合约。

我想现在我被一个很简单的问题困住了。

我想把一个数据对象的内容作为键值对存储在链的couchDb状态数据库中。

我正在这样做一个docker请求看起来像这样:命令WRITE: docker exec -t Lane1_Zf4URs_cli peer chaincode invoke -o orderer.Zf4URs.com:7050——tls——cafile/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/Zf4URs.com/orderers/orderer.Zf4URs.com/msp/tlscacerts/tlsca.Zf4URs.com-cert.pem -C mychannel -n 9bc7cca8- 1cd -49b0-a25c-fb639a0403cf -C '{"Args":["set";;[D1]{P1}", "data4"]}'

如你所见,我的参数正在调用set方法和storekey ="[Di]{P1}"值="data4"这在这个"设置"下工作得很好。方法。

func (s *SmartContract) set(stub shim.ChaincodeStubInterface, args []string) peer.Response {
if len(args) != 2 {
return shim.Error("Incorrect arguments. Expecting a key and a value")
}

err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error("Failed to set asset: " + string(args[0]))
}
return shim.Success([]byte(args[1]))
// return args[1]

}

现在,当查看状态dB时,这是存储的结果:

{"_id"(D1) {P1}","_rev"2-a74269cadec50f97d34d165d60235e34"~ version"8:0"_attachments" {"valueBytes" {"content_type"应用程序/octet-stream"revpos" 2"digest"md5-2cRbxPYpSEbldj1mVovx8Q = =","length" 5"stub"没错}}}

现在我想要的是在这个状态数据库请求上存储一个额外的值。除了"_id"(键)我想有另一个名为"_executor"它应该有一个值"{P1}">

应该像这样:

{"_id"(D1) {P1}","_rev"2-a74269cadec50f97d34d165d60235e34">"_executor"{P1}","~ version"8:0"_attachments" {"valueBytes" {"content_type"应用程序/octet-stream"revpos" 2"digest"md5-2cRbxPYpSEbldj1mVovx8Q = =","length" 5"stub"没错}}}

我该怎么做呢?我需要改变docker请求或设置方法吗?这可能吗?

谢谢你的帮助

应该可以了!你对智能合约中的第二个参数(args[1])没有限制。由于这是一个字符串,因此它存储在一个列中,因此不依赖于表结构。

我已经更新了我的代码。我尝试使用结构体来存储这个

`type DataObject struct {
Name string
Executor string
Data []byte} func (s *SmartContract) set(stub shim.ChaincodeStubInterface, args []string) peer.Response {
if len(args) != 2 {
return shim.Error("Incorrect arguments. Expecting a key and a value")
}
p := DataObject{
Name: args[0],
Executor: "p1",
Data: []byte(args[1]),
}
str, err2 := json.Marshal(p)
if err2 != nil {
fmt.Println(err2)
}
fmt.Println(string(str)) 
if(args[1] == "data4"){
err := stub.PutState(args[0], str)
if err != nil {
return shim.Error("Failed to set asset: " + string(args[0]))
}
return shim.Success(str)
} else {
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error("Failed to set asset: " + string(args[0]))
}
return shim.Success([]byte(args[1]))
}}`

现在我可以存储执行器,但我的数据变量不像以前那样存储。我需要摘要,所以它应该是_attachments: [valueBytes: ....digest:md5-xxx]。

看起来是这样的:couchDb-doc

{"_id";: & "(D1) {P1}","_rev"1 - 69 - be87268fs88s788668f8s766fnkushof7"Data"ZGF0YTQ =";"Executor"P1"Name"(D1) {P1}","_version"3:0"}

最新更新