我将使用一个基于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方法上做什么改变呢?这可能吗?
多谢帮忙
2条答案
按热度按时间pbgvytdp1#
这应该可以实现,因为智能合约中的第二个参数(args[1])没有任何约束,而且由于这是一个字符串,它存储在一列中,因此不依赖于表格结构。
2ic8powd2#
我已经更新了我的代码。我试图使用一个结构体来存储这个。
现在我可以存储执行器,但我的数据变量得到不像以前一样存储。我需要的摘要,所以以前它应该是_attachments:[值字节:....摘要:md5-xxx]。
它看起来像这样:couchDb-doc
{"标识号":"[D1] {P1} ","版本号":"1 - 69be87268fs88s788668f8s766fnkushof7","数据":"ZGF0YTQ =","执行人":"P1"、"名称":"[D1] {P1}","_版本":"3:0 "}