Hyperledger Fabric测试网部署Go链码失败问题求助
Hyperledger Fabric test-network部署Go链码vendoring报错解决方案
问题现象
- 可通过
network.sh脚本正常完成网络搭建、通道创建,执行docker ps -a验证所有节点组件运行状态正常 - 执行如下链码部署命令时操作失败:
./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
- 默认执行时控制台返回vendoring不一致报错,提示忽略vendoring目录,对应
GOFLAGS='-mod=readonly'场景下为依赖校验失败 - 部署前手动执行
export GOFLAGS=-mod=readonly重试,报错无变化;改为export GOFLAGS=-mod=mod重试时,触发链码路径归一化失败报错
环境信息
- 操作系统:Linux Mint 20.2 (Uma)
- 本地依赖版本:
- git: 2.25.1
- curl: 7.68.0
- docker: 20.10.14
- docker-compose: 1.25.0(版本后缀标注
build unknown) - go: 初始版本1.13.8,更换为1.18版本重试后问题仍存在
- jq: 1.6
- 额外观测信息:运行monitordocker脚本监控容器日志时,显示链码构建容器内Go版本为1.17.5,高于官方文档要求的1.13.x版本;不确定docker-compose的
build unknown标识是否与问题相关
根因说明
该问题与本地安装的Go版本、docker-compose的build unknown标识均无关联:
- 链码部署时的编译动作实际运行在
hyperledger/fabric-ccenv官方链码构建镜像内,容器内的1.17.5版本是对应Fabric版本绑定的内置Go版本,属于正常情况,本地Go版本仅用于前期依赖整理,不参与链码最终编译 - docker-compose的
build unknown后缀是发行版打包时移除了构建元数据导致,不影响网络正常功能
两类报错的具体触发逻辑:
-mod=readonly模式报错:拉取的asset-transfer-basic链码目录下vendor依赖目录与go.mod声明的依赖版本不一致,只读模式不允许自动修改依赖,直接抛出校验错误-mod=mod模式报错:链码目录依赖配置异常时,network.sh脚本做路径归一化校验无法识别有效Go模块路径,抛出路径处理失败
解决步骤
按顺序执行以下操作即可修复:
- 清理之前失败部署的残留资源,在test-network目录下执行:
./network.sh down docker rm -f $(docker ps -aq --filter name=chaincode) 2>/dev/null
- 进入Go链码目录,重新整理依赖,无需手动设置全局GOFLAGS环境变量:
cd ../asset-transfer-basic/chaincode-go # 删除旧的不一致的vendor目录 rm -rf vendor # 拉取匹配go.mod声明的正确依赖 go mod tidy # 重新生成一致的vendor依赖目录 go mod vendor # 返回test-network目录 cd -
- 重新启动网络、创建通道后执行链码部署:
./network.sh up createChannel ./network.sh deployCC -ccn basic -ccp ../asset-transfer-basic/chaincode-go -ccl go
如果执行后仍报错,先检查拉取的fabric-samples仓库版本与本地下载的Fabric二进制、Docker镜像版本是否完全对齐,版本不匹配时ccenv镜像内置的Go版本与链码声明的Go版本要求不兼容,也会触发同类依赖报错,切换到对应版本的fabric-samples标签即可。
内容的提问来源于stack exchange,提问作者ChrisiMW
相关产品推荐
相关产品推荐

