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

qnzebej0  于 2023-01-10  发布在  CouchDB
关注(0)|答案(2)|浏览(202)

我将使用一个基于chaincode的hlf系统来展示如何创建智能合约。
我想现在我被一个很简单的问题卡住了。
我想在chains couchDb状态数据库中存储一个数据对象内容作为键-值对。
I am doing this with a docker request looking like this: COMMAND 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-1dcd-49b0-a25c-fb639a0403cf -c '{"Args":["set", "[D1]{P1}", "data4"]}'
正如你所看到的,我的参数调用set方法,并且store key ="[Di] {P1}" value ="data4",这在这个"set"方法中运行良好。

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时,这是存储的结果:
{"标识号":"[D1] {P1} ","版本号":"2-a74269cadec50f97d34d165d60235e34","~版本":"8:0","_附件":{"值字节":{"内容类型":"应用程序/八位字节流","revpos":2、《文摘》:"md5 - 2cRbxPYpSEbldj1mVovx8Q ==","长度":5,"存根":真}}}
现在,我需要在此状态数据库请求上存储一个附加值。除了"_id"(键)之外,我还需要一个名为"_executor"的字段,其值应为"{P1}"
应如下所示:
{"标识号":"[D1] {P1} ","版本号":"2-a74269卡德科50f97d34d165d60235e34","执行人":"{P1}","~版本":"8:0","_附件":{"值字节":{"内容类型":"应用程序/八位字节流","revpos":2、《文摘》:"md5 - 2cRbxPYpSEbldj1mVovx8Q ==","长度":5,"存根":真}}}
我该怎么做呢?我需要在docker请求或者set方法上做什么改变呢?这可能吗?
多谢帮忙

pbgvytdp

pbgvytdp1#

这应该可以实现,因为智能合约中的第二个参数(args[1])没有任何约束,而且由于这是一个字符串,它存储在一列中,因此不依赖于表格结构。

2ic8powd

2ic8powd2#

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

`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:[值字节:....摘要:md5-xxx]。
它看起来像这样:couchDb-doc
{"标识号":"[D1] {P1} ","版本号":"1 - 69be87268fs88s788668f8s766fnkushof7","数据":"ZGF0YTQ =","执行人":"P1"、"名称":"[D1] {P1}","_版本":"3:0 "}

相关问题