Published on

fabric 1.4.10 国密改造

Authors

拉取源码

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 即可。