Hyperledger Fabric中Marbles账本查询报错及解决方案咨询
解决Marbles Demo账本查询与交易调用的问题
看起来你在尝试用Fabcar的查询脚本调用Marbles链码时踩了个小坑——函数名不匹配导致的链码错误!我来帮你一步步解决这个问题:
错误原因分析
你遇到的Received unknown invoke function name - 'readMarble'错误,核心原因是Marbles链码中并没有名为readMarble的函数。Marbles链码里用于查询单个 marble 的正确函数名是getMarble,拼写或名称错误直接触发了链码的500错误。
正确的账本查询操作步骤
1. 修改query.js脚本
打开fabcar目录下的query.js,调整以下关键部分:
- 确保
chaincodeId已设置为marbles(你已经完成这一步,没问题) - 将调用的函数名从
readMarble改为getMarble - 传入正确的marble名称参数(比如你之前创建的
marble1)
修改后的核心代码片段示例:
// 构造查询请求 const request = { chaincodeId: 'marbles', fcn: 'getMarble', // 这里替换为Marbles链码的正确查询函数名 args: ['marble1'] // 替换为你实际创建的marble名称 };
2. 执行查询命令
确保Marbles对应的Fabric网络处于运行状态,在fabcar目录下执行:
node query.js
如果一切正常,你会收到该marble的详细信息,包括颜色、大小、所有者等。
执行Marbles交易的操作示例
如果要执行转移marble所有权这类交易操作,可以修改invoke.js脚本:
1. 修改invoke.js脚本
调整交易请求的函数名和参数:
// 构造交易请求 const request = { chaincodeId: 'marbles', fcn: 'transferMarble', // Marbles链码的转移交易函数 args: ['marble1', 'alice'] // 参数为:marble名称、新所有者名称 };
2. 执行交易命令
在fabcar目录下执行:
node invoke.js
执行完成后,可以再用query.js查询该marble,确认所有者已更新。
额外注意事项
- 确保
user1在Marbles使用的mychannel通道上有对应的查询/交易权限(Marbles和Fabcar默认使用同一个通道,权限应该是兼容的) - 确认目标marble已经被正确初始化到账本中(可以通过Marbles的Web界面,或者调用
initMarble函数创建) - 如果仍有问题,可以查看peer容器的链码日志排查细节:
docker logs peer0.org1.example.com | grep marbles
内容的提问来源于stack exchange,提问作者Riya Soni
相关产品推荐
相关产品推荐

