Golang智能合约调用ChainCode时参数格式错误问题求助
排查Golang链码CreateSeqMrNum函数参数格式错误问题
问题场景
调用Golang编写的Fabric智能合约CreateSeqMrNum函数时,传入字符串数组参数触发参数格式错误。
链码函数实现
func (m *MdmChaincode) CreateSeqMrNum(ctx contractapi.TransactionContextInterface, args []string) error { SeqId := args[0] SrNo := args[1] DocType := args[2] mtrSeqNo := &SeqMrNum{SeqId, SrNo, DocType} seqMrNumAsBytes, err := json.Marshal(mtrSeqNo) if err != nil { return fmt.Errorf("Unable to marshal the JSON.") } err = ctx.GetStub().PutState(SeqId, seqMrNumAsBytes) if err != nil { return fmt.Errorf("Cannot add to World State: %s", err.Error()) } return nil }
报错信息
Error: endorsement failure during invoke. response: status:500 message: "Error managing parameter param0. Conversion error. Value 'M1001' not passed in expected format []string.
原因分析
- 报错核心提示
Value 'M1001' not passed in expected format []string,说明调用链码时未按照字符串数组格式传递参数:实际传入的是单个字符串(如M1001),但链码函数期望接收的是[]string类型的参数列表。 - Fabric链码的Invoke接口要求参数必须以字符串数组形式传递,若调用端(CLI/SDK)参数格式错误,会导致链码无法解析参数,触发类型转换失败。
解决办法
1. Fabric CLI调用修正
调用时需用JSON数组包裹函数名和所有参数,格式如下:
peer chaincode invoke -n [你的链码名称] -c '{"Args":["CreateSeqMrNum", "M1001", "S001", "DOC001"]}' -C [你的通道名称]
注意:Args对应的JSON数组中,第一个元素是链码函数名,后续元素依次对应函数的args []string参数。
2. SDK调用修正(以Go SDK为例)
构建调用参数时必须严格使用字符串数组结构,示例代码:
// 直接通过SubmitTransaction传递参数,底层会封装为字符串数组 response, err := contract.SubmitTransaction("CreateSeqMrNum", "M1001", "S001", "DOC001")
避免将单个字符串直接作为参数传递,确保参数符合[]string的结构要求。
3. 链码函数验证
当前链码函数的参数声明args []string符合Fabric链码规范,无需修改函数实现,只需修正调用端的参数传递方式即可。
内容的提问来源于stack exchange,提问作者Ankur Singh
相关产品推荐
相关产品推荐

