使用Fabric Java SDK实例化链码时cid包找不到的安装位置问询
解决Hyperledger Fabric链码找不到cid包的问题
问题根源
从你的错误日志能看出,Go构建器在容器内的三个Go源码路径里都没找到github.com/hyperledger/fabric/core/chaincode/lib/cid包:
/opt/go/src/...(容器的GOROOT目录)
/chaincode/input/src/...(链码构建时的临时GOPATH src目录)
/opt/gopath/src/...(容器默认的GOPATH src目录)
这个cid包是Fabric官方用于处理客户端身份的工具包,但手动在peer节点内安装包并不是长久之计(毕竟peer一般是容器化运行,重启后改动就没了),更规范的做法是用Go依赖管理工具来解决。不过我还是会把两种方法都列出来:
方法一:用Go Modules管理依赖(推荐)
这是最可靠的方式,能保证依赖版本一致,且不需要手动修改peer容器:
- 在你的链码项目根目录初始化Go模块(替换成你的链码模块名,比如
github.com/ify/ify):go mod init github.com/ify/ify - 拉取对应Fabric版本的
cid包(比如你用Fabric v1.4.10,就写这个版本号):go get github.com/hyperledger/fabric/core/chaincode/lib/cid@v1.4.10 - 这会生成
go.mod和go.sum文件,把这两个文件和你的链码.go文件一起打包,在实例化链码时提交给peer。Fabric的Go构建器会自动识别Go模块,自动下载所需依赖。
注意:如果你的Fabric版本是v2.0及以上,
cid包的路径已经改成github.com/hyperledger/fabric-chaincode-go/pkg/cid了,记得同步修改链码里的导入语句!
方法二:手动在peer容器内安装(临时方案)
如果你因为特殊场景必须手动安装,步骤如下:
- 先进入你的peer容器(替换成实际的peer容器名称):
docker exec -it peer0.org1.example.com bash - 在容器内执行
go get命令,把包下载到容器的GOPATH路径下:
这个命令会把包下载到go get github.com/hyperledger/fabric/core/chaincode/lib/cid/opt/gopath/src/github.com/hyperledger/fabric/core/chaincode/lib/cid,也就是报错日志里提到的第三个路径,这样Go构建器就能找到它了。
但再次提醒:这种方式是临时的,peer容器重启后,下载的包会被清空,所以只适合临时测试用。
额外注意点
用IBM的Fabric Java SDK示例时,要确保链码打包时包含所有依赖文件,并且Fabric网络的版本和链码依赖的Fabric版本一致,避免版本不兼容导致的其他问题。
内容的提问来源于stack exchange,提问作者Kaizerman
相关产品推荐
相关产品推荐

