fabric-samples-fabcar-go示例的问题及解决方案
1. 启动Fabric测试网络
前提是已经拉取了Fabric的镜像文件。
然后拉取fabric-samples工程,并启动测试网络。
1 | $ git clone https://github.com/hyperledger/fabric-samples.git |
2. 执行Go版本的SDK测试程序时出错
1 | $ cd go |
查询智能合约成功,写入智能合约时失败。错误信息如下:Failed to submit transaction: Failed to submit: CreateAndSendTransaction failed: SendTransaction failed: orderers is nil
3. 执行Java版本的SDK测试程序成功
1 | $ cd ../java |
查询和写入智能合约都是成功的。
4. 比较Go版本和Java版本SDK测试程序的区别
看了一下两种版本的测试程序,使用的是同一个连接配置文件:
fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/connection-org1.yaml
但Java版本的没问题,Go版本就出现上面的错误。让人郁闷呐!
5. 网上寻求解决方案
使用关键词fabcar orderers is nil
在谷歌中查找。
谷歌真是最爱,第一条就是我需要的内容。
https://stackoverflow.com/questions/62927393/hyperledger-2-2-fabcar-transaction-issue
stackoverflow
这个网站真的很赞,在上面总能找到各种各样的技术问题和答案。这次也没有让我失望。
浏览了一下题主的问题,跟我遇到的情况一模一样,欧耶~!
可是这个问题下面就一个人回答,也不对题。还是题主自己搞定了问题,他在问题的后面附加了一段信息:
1 | It worked, the solution is add channel into connection-org1.yaml: |
有解决方案就OK!感谢Nguyen Tien Huy
这哥们。
6. 试验解决方案
我把题主追加的配置添加到我的connection-org1.yaml
文件中,然后运行程序,居然…居然…还是出错了。
1 | $./runfabcar.sh |
关键是这句:Could not find Orderer Config for channel orderer [orderer.example.com]
说明找不到orderer.example.com的连接信息。我观察了一下connection-org1.yaml
文件的结构,参照peer的配置增加了一段针对orderer的配置信息:
1 | orderers: |
再次运行测试程序。YES!成功了!
1 | $ ./runfabcar.sh |
查询和写入都成功了。
自动生成的连接配置文件connection-org1.yaml
对于Go版本的SDK测试程序是有缺陷的,但针对Java版本的SDK测试程序就完全没问题。目前还搞不清楚为什么会如此!
虽然成功了,但从输出来看,还是有些小问题:
1 | fab.detectDeprecatedNetworkConfig -> WARN Getting orderers from endpoint config channels.orderer is deprecated, use entity matchers to override orderer configuration |
从提示看,虽然添加的这段配置可以工作,但官方好像已经不推荐这种形式,而是推荐使用entity matchers
的方式。
那么什么是entity matchers
?直接提供了一个sample让参考。
打开示例看了看,并参照例子中的格式配置到connection-org1.yaml
文件中用来替代我添加的内容。很遗憾,没有成功。
所以,虽然暂时解决了这个问题,但并非最终方案。关于如何使用entity matchers
,后续还要继续研究。