You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:30:59