调用QSCC链码查询Fabric区块时提示无法找到ledger问题求助
我之前也碰到过类似的问题,结合你的代码和报错信息,咱们一步步来排查解决:
先明确你的核心问题场景:
- 你用Go开发了
registroHorario智能合约,通过Swagger API调用系统链码QSCC的GetBlockByTxID方法,查询指定交易ID对应的区块 - 报错显示找不到
gesjornada通道的账本:
500: Error: Internal Server Error
{ "error": { "message": "INVOKE_CHAINCODE failed: transaction ID: 5172ad78a74af6fd0c45af6e7e54f92b03c8e34db1e6387d5d359d27550538fc: failed to find ledger for channel: gesjornada", "code": "CustomError", "status": 500 } }
你的核心调用逻辑代码如下:
func (cc *registroHorario) query(stub shim.ChaincodeStubInterface, args []string) peer.Response { TxId := args[0] invokeArgs := ToChaincodeArgs("GetBlockByTxID", "gesjornada", TxId) response := stub.InvokeChaincode("qscc", invokeArgs, "gesjornada") if response.Status != shim.OK { return shim.Error(BytesToString(response.Payload)) } value := response.Payload logger.Infof("QueryResult: %s", value) return shim.Success(value) } //ToChaincodeArgs converts string args to []byte args. func ToChaincodeArgs(args ...string) [][]byte { bargs := make([][]byte, len(args)) for i, arg := range args { bargs[i] = []byte(arg) } return bargs }
下面是几个可以尝试的解决方向:
1. 修改QSCC调用的通道参数为空字符串
当你的业务链码已经部署在gesjornada通道上时,调用QSCC不需要在stub.InvokeChaincode的第三个参数里手动指定通道名——QSCC会自动复用当前业务链码所在的通道上下文。你可以把调用代码改成:
response := stub.InvokeChaincode("qscc", invokeArgs, "")
这个小改动经常能解决通道上下文不匹配的问题,手动指定通道名时很容易出现权限或上下文冲突。
2. 确认业务链码已在目标通道实例化
哪怕你从SAP API HUB拿到了正确的通道名,也要确保registroHorario链码已经在gesjornada通道上完成实例化操作。可以用Fabric CLI命令验证:
# 检查节点上已安装的链码 peer chaincode list --installed # 检查gesjornada通道上已实例化的链码 peer chaincode list --channelID gesjornada --instantiated
如果链码没有在该通道实例化,就无法访问通道的账本数据,自然会报错。
3. 严格校验通道名的拼写与大小写
Fabric的通道名是大小写敏感的,哪怕一个字母大小写错误都会导致找不到账本。建议直接从Fabric节点的通道配置文件或通道创世块里提取准确的通道名,避免复制粘贴时出现隐藏空格或拼写错误。
4. 检查Fabric节点的通道加入状态
如果你的链码部署在某个节点上,但该节点没有加入gesjornada通道,也会出现找不到账本的错误。可以用命令检查节点已加入的通道:
peer channel list
如果节点未加入该通道,需要先让节点加入通道:
peer channel join -b gesjornada.block
(这里的gesjornada.block是通道创世块文件,需要提前准备好)
5. 验证QSCC的调用参数格式
QSCC的GetBlockByTxID要求的参数格式是[通道名, 交易ID],你的invokeArgs是正确的。如果前面修改了InvokeChaincode的通道参数为空,也可以保持参数不变——QSCC会优先使用你传入的通道名参数进行查询。
先试试第一个方案,修改通道参数为空字符串,这是最快速的排查方法。如果还是不行,再逐步验证后面的步骤。
内容的提问来源于stack exchange,提问作者ebg94_

