- Published on
fabric 1.4.10 国密改造
- Authors
- Name
- JiGu
- @crypto20x
拉取源码
git clone https://github.com/hyperledger/fabric.git
cd fabric
# 切换到1.4.10版本
git checkout v1.4.10
改为go module包管理
1. 删除原dep包管理的两个文件
rm Gopkg.lock Gopkg.toml
2. 改为go moudle 管理
go mod init github.com/hyperledger/fabric
go mod tidy
报错
go: finding module for package go.etcd.io/etcd/etcdserver/api/snap
github.com/hyperledger/fabric/orderer/consensus/etcdraft imports
go.etcd.io/etcd/etcdserver/api/snap: module go.etcd.io/etcd@latest found (v3.3.25+incompatible), but does not contain package go.etcd.io/etcd/etcdserver/api/snap
将vendor里面的vendor/etcd拷贝到fabric根目录
cd etcd
go mod init etcd
修改 fabric 目录下的go.mod 文件
# 在最下下面加入一行
replace go.etcd.io/etcd v3.3.25+incompatible => ./etcd
# 根据Gopkg.toml 确定每个库的版本号,然后用go mod 指定版本号
go mod tidy
go get xxx@vx.x.x
go get xxx@提交的哈希前七个字母
添加国密包
git clone https://github.com/gwanted/fabric-gm
将bccsp里的gm 文件夹,复制到 v1.4.10工程的fabric/bccsp/里 gm包里引用的加密函数库做了一些变化,需要修改。 以前github.com/tjfoc/gmsm/sm4里包的函数放在了 github.com/tjfoc/gmsm/untils 以前github.com/tjfoc/gmsm/sm2里包的函数放在了github.com/tjfoc/gmsm/x509里 函数名基本没变
改好的源码链接如下 (根据我发的源码修改)
编译
1. 修改Makefile
# No sense rebuilding when non production code is changed
PROJECT_FILES = $(shell git ls-files | grep -v ^test | grep -v ^unit-test | \
grep -v ^.git | grep -v ^examples | grep -v ^devenv | grep -v .png$ | \
grep -v ^LICENSE | grep -v ^vendor )
根据git命令的结果,这里会检测代码有没有修改。改动过源码,所以要屏蔽掉,才可以编译。
2.编译二进制文件
- 确保go版本>= 1.14
执行
# 编译本地二进制工具 peer orderer 等等
make native
可以看到.build/bin 中有如下工具
.build/bin/
├── chaintool
├── configtxgen
├── configtxlator
├── cryptogen
├── discover
├── idemixgen
├── orderer
└── peer
3.编译docker
make peer-docker
# 出错
go: code.cloudfoundry.org/clock@v1.0.0: Get "https://proxy.golang.org/code.cloudfoundry.org/clock/@v/v1.0.0.mod": dial tcp 172.217.24.209:443: i/o timeout
Reaping losing child 0x55f5a0231170 PID 80565
Makefile:232: recipe for target '.build/docker/bin/peer' failed
我已经配置过GOPROXY了,不知为啥还是出错。
- 解决方式1
# 直接把之前编译好的二进制peer拷过去
cp .build/bin/peer .build/docker/bin/
# 再次执行
make peer-docker
# 成功
需要制作docker的二进制peer是一样的,所以可以这样操作。orderer同理
- 解决方式2
docker run --name test_baseimage -it -d hyperledger/fabric-baseimage:amd64-0.4.22
docker exec -it test_baseimage bash
# 进到容器中 更改GOPROXY
go env -w GOPROXY=https://goproxy.cn,driect
exit
# 提交修改好的容器,替换原始镜像
docker commit -a "作者" -m "注释" test_baseimage hyperledger/fabric-baseimage:amd64-0.4.22
make docker 会遇到缺少 protoc-gen-go
# 使用命令安装
go get -u github.com/golang/protobuf/protoc-gen-go
# 拷贝到相应目录
cp $GOPATH/bin/protoc-gen-go .build/docker/gotools/bin/
这几个都可以打包docker镜像。buildenv ccenv orderer peer tools make 项目名-docker 即可。