问题描述
我正在尝试创建一个 Hyperledger Fabric 链码函数/方法,它接受不确定数量的输入(即可变参数函数)。
我在 Go 中工作。
这是我所拥有的:
38 type Prod struct {
39 ProdID string `json:"prodID"`
40 Attributes []string `json:"attributes"`
41 }
420 func (s *SmartContract) Ver2(ctx contractapi.TransactionContextInterface,prodID string,input...string) error {
421 //create Prod struct
422 var p Prod
423 //set values based on input:
424 p.ProdID = prodID
425 p.Attributes = make([]string,len(input))
426 for i:=0; i<len(input); i++ {
427 p.Attributes[i]=input[i]
428 }
429 //convert Go struct into JSON format
430 assetJSON,err := json.Marshal(p)
431 if err != nil {
432 return fmt.Errorf("Problem encountered during marshaling: %v\n",err)
433 }
434 //write data to ledger
435 return ctx.GetStub().PutState(prodID,assetJSON)
436 }
当我尝试使用以下代码调用此链码时
peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile /home/hans/fabric-samples/test-network/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n scm -c '{"Args":["Ver2","BB","ok","maybe","test"]}'
我收到此错误:
Error: endorsement failure during invoke. response: status:500 message:"Error managing parameter param1. Conversion error. Value ok was not passed in expected format []string"
我的代码有问题还是这是我使用的 Fabric api 的限制?
我试过在线搜索,但没有偶然发现有关链码中可变参数函数的任何相关讨论或文档。
我在这里得到了一个类似的(尽管是非链码)工作版本:https://play.golang.org/p/-7NX8-Uf88p
无论如何,我成功地制作了一个可变参数辅助函数,我可以从另一个链代码函数调用它,但是如果不更新链代码,就无法修改可变参数输入。 (所以对我来说不是很有用。)
作为参考,下面列出了这两个函数:
394 func (s *Prod) VeriTest(ctx contractapi.TransactionContextInterface,attr ...string) {
395 s.ProdID = prodID
396 s.Attributes = make([]string,len(attr))
397 for i:=0; i<len(attr); i++ {
398 s.Attributes[i]=attr[i]
399 }
400 }
401
402 //Ver: Proof of Concept - linked to VeriTest above
403 func (s *SmartContract) Ver(ctx contractapi.TransactionContextInterface) error {
404 //create Prod struct
405 var p Prod
406 //call VeriTest on Prod
407 p.VeriTest(ctx,"AA","test","string","five")
408 //convert Go struct into JSON format
409 assetJSON,err := json.Marshal(p)
410 if err != nil {
411 return err
412 }
413 //write data to ledger
414 return ctx.GetStub().PutState("AA",assetJSON)
415 }
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)