Fabric Chaincode 中的灵活输入可变参数函数可能吗?

问题描述

我正在尝试创建一个 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 (将#修改为@)