说明:本文主要参考了CSDN上作者为可乐少加冰的记录一次fabric国密版本节点搭建过程 这篇文章。同时也感谢CSDN上小张小张,从不慌张在部署过程中的无私解答与帮助;最后感谢CSDN上dddengyunjie放出了一个国密改造版本及在平常工作中的帮助。
按照Fabric Hyperledger官方文档的要求安装好git、docker、docker-compose、go等,这里不再叙述。
注意:go语言版本最好1.14.1以上,不然有可能会出问题
注意:docker安装不要yum install安装,这样安装的版本太低(必须在17.06以上)。如果已经安装,下面有一篇文章讲怎么删了重装,当然没有安装也可以看该文章安装。
CSDN上的Docker安装太慢,使用国内镜像服务快速安装
推荐使用阿里云数据源。
或者使用curl -fsSL https://get.docker.com/ | sh
安装docker(国内不推荐,速度慢)。
打包镜像时需要使用bzip2
工具,如果没有安装,运行yum -y install bzip2
要设置GOPATH,本文假定设置为/root/gopath
。注意 GO111MODULE
环境变量让它默认为auto
就好,不要改成on
。
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/dddengyunjie/fabric
注意:国内下载比较慢,可以直接从别处复制一个下载好后的打包文件(如果打包复制过依赖库的更佳,这里我们就不做了)。
打包,解包推荐使用tar
命令。
注意:这个改造其实是对Hyperledger Fabric v1.4.2进行的国密改造。
注意:目录结构是固定的,工程目录必须为$GOPATH/src/github.com/hyperledger/fabric
这里演示一下如何下载一些缺少的依赖及构建一下部分工具。
这里需要下载如下两个库:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/crypto.git
git clone https://github.com/golang/sys.git
同时这也是一个下载演示示例。
cd $GOPATH/src
mkdir golang
cd golang
git clone https://github.com/golang/protobuf.git
cd protobuf/protoc-gen-go/
go build
go install
ls $GOPATH/bin
这里同样也是演示一个示例,用于国内服务器等无法直接构建时。当然有更简单的方法,比如直接从别处复制(推荐方法)。
mkdir -p $GOPATH/src/github.com/vektra
cd $GOPATH/src/github.com/vektra
git clone --branch v1.1.2 https://github.com/vektra/mockery.git
cd mockery/cmd/mockery
go install mockery.go
ls $GOPATH/bin
这里mockery工具单独构建是有用意的。
切换到工程目录
cd $GOPATH/src/github.com/hyperledger/fabric
vim Makefile
需要将CHAINTOOL_URL
的值替换为:
https://hyperledger.jfrog.io/hyperledger/fabric-maven/org/hyperledger/fabric-chaintool/$(CHAINTOOL_RELEASE)/fabric-chaintool-$(CHAINTOOL_RELEASE).jar
原因:原来的网址已经不维护了,所以要进行替换。
关于这个Makefile的详情,见Go语言充电站的文章:通过Fabric 1.4 的Makefile,轻松掌握Fabric构建 。
vim gotools.mk
将go.fqp.mockery := github.com/vektra/mockery/cmd/mockery
这一行改为go.fqp.mockery := github.com/vektra/mockery/cmd
。去掉最后的mockery,因为它在github上的目录已经发生了改变。然而此处更改只能让它在make时不中断,并不能实际构建出mockery
工具。具体细节后面make docker时再讲
chmod +x scripts/*.sh
make release
make
时会提示少一些golang的工具库,少什么库通过前面3.1中的方法进行下载,也可以从别处拷贝。注意看提示,它是从本工程vendor、GOPATH和GOROOT目录中查找的。下载好后也可以将缺少的依赖库复制到vendor
目录中对应的位置(下一步make docker要使用)。
本次make时缺少的包有(这里不一一列举):
golang.org/x/crypto/chacha20poly1305
golang.org/x/sys/cpu
......
这里只需要按上面的方法安装crypto
及sys
包就可以了。
然后我们重新make
:
cd $GOPATH/src/github.com/hyperledger/fabric
make release
tree release
如果没有安装tree
命令,就一层一层ls
好了。
生成的文件在 release/linux-amd64/bin
目录下。
注意:先将该目录复制别处去,因为如果执行make clean
会删除这个目录,虽然我们一般不会执行,但万一有时需要呢。
cp -r release/linux-amd64/bin ~/
ls ~/bin
可以看到,我们已经复制成功了。
make docker
第一步,它会下载一些基础镜像,漫长的等待…不推荐使用代理镜像仓库,让它自己下完就好。
第二步,它首先编译peer,然后会提示少一些依赖库。如果该依赖库在make release时未复制到项目vendor目录下,这里需要先复制。注意这查找依赖的顺序是本地vendor,后面的两个是虚拟目录,不是本机的GOPATH与GOROOT。
少什么其它库同样通过前面3.1中的方法进行下载,然后复制到vendor中对应的目录去。当然,也可以从别的机器使用scp命令复制。注意,这里少什么库就复制什么库,同一目录下的其它库不用复制。
由于在前面我们已经进行过golang.org/x/下的crypto
及sys
包的下载,所以我们本次操作中缺少的库就从本机$GOPATH目录中复制就好:
mkdir -p vendor/golang.org/x/crypto/internal/
cp -r $GOPATH/src/golang.org/x/crypto/chacha20poly1305 vendor/golang.org/x/crypto/
cp -r $GOPATH/src/golang.org/x/crypto/curve25519 vendor/golang.org/x/crypto/
cp -r $GOPATH/src/golang.org/x/crypto/chacha20 vendor/golang.org/x/crypto/
cp -r $GOPATH/src/golang.org/x/crypto/internal/subtle vendor/golang.org/x/crypto/internal/
cp -r $GOPATH/src/golang.org/x/crypto/poly1305 vendor/golang.org/x/crypto/
cp -r $GOPATH/src/golang.org/x/sys/cpu vendor/golang.org/x/sys/
接着make docker
构建peer-image
成功。
第三步,它会构建order-image
。
第四步,它会构建gotools工具。 有时会因为网络问题在构建第一个工具counterfeiter
或者其它工具时会提示获取依赖库连接超时,这个我们后面会讲怎么手动解决该问题。此时为了节省时间,可以直接ctrl + c 关掉它。
如果没有失败,则会构建成功。然后会跳到第五步。
如果中间构建某个工具失败了,请接着往下看:
运行ls -a
,可以看到工程目录下多了.build
目录。该目录初始时并不存在,脚本运行到此处时会自动创建,构建好的工具生成在.build/docker/gotools/bin/
目录。
重点来了:
可乐少加冰的记录一次fabric国密版本节点搭建过程 这篇文章中提到了一个方法,就是将缺少的工具使用前面的示例方法(比如 mockery,protoc-gen-go工具)进行手构建,然后复制到.build/docker/gotools/bin/
目录中去。但是这个方法我多次尝试后,发现存在一个问题:
复制过去后接着make docker它会跳过gotools中部分工具的构建(这样做也能运行),直接会跳到第五步。因此,推荐的做法是:从别处复制已经构建好的全部工具(比如在香港服务器上构建好,作为复制源)而不是只复制其中一个工具。下面的示例操作一次性从别的服务器上复制了所有的工具:
cd .build/docker/gotools/bin/
scp useranme@hostname:/opt/gopath/src/github.com/hyperledger/fabric/.build/docker/gotools/bin/* ./
输入密码后等待复制完成。
这个所有构建好的工具我计划放在gitee
上让大家下载,等做好了再将仓库地址补充进来。
仓库地址为: https://gitee.com/TianCaoJiangLin/gotools-bin
第五步,接着运行make docker
,它会出现下载chaintool工具的界面,国内下载速度很慢。这时可以ctrl + c 关掉它,将别处构建发的工具复制到对应的.build/bin/
目录。具体操作不再叙述。
注:这个工具我那个仓库也放进去了。
第六步,接着再运行make docker
,它会编译build-env
和image-tool
等等,一般不会有问题,直至最后成功。
此时,使用docker images
会列出所有镜像,会看到一些没有名字或者名字为的镜像,应该是失败的过程中产生的一些无用镜像,我们可以使用下面的命令进行删除:
docker rmi image_id -f
这里image_id是指镜像ID,记住不要轻易使用make clean
。
这里有一个不完美的地方:
构建完成之后我们运行
tree .build/docker/gotools/bin/
会发现只列出了10个工具,而不是gotools.mk
中的11个工具,少了一个mockery
,怎么办?大致原因我在替换失效URL中提到了,然而具体详请我也不清楚(能力有限)。
这里少一个mockery
并不影响实际运行,但如果你是完美主义者,这里肯定是过不去了,怎么办?
将 .build/docker/gotools/bin
中所有工具复制出去,再将前面构建的mockery
工具加进去。然后重新构建,手动复制构建工具:
mkdir -p ~/docker/gotools
cp -r .build/docker/gotools/bin ~/docker/gotools
cp $GOPATH/bin/mockery ~/docker/gotools/bin/
tree ~/docker/gotools/bin
make clean
make docker
在构建gotools
时 ctrl + c
关掉它,然后:
cp ~/docker/gotools/bin/* .build/docker/gotools/bin/
make docker
注意:这里再次构建同样需要检查一些没有名字或者名字为的镜像,然而删除它。
因为我们以后可能使用CA(虽然本文并未涉及CA的国密版本),我们使用 fabric-sample v1.4.2版本测试。fabric-sample v1.4.1示例网络中启动脚本不包含CA,要自己写,比较麻烦。
cd ~
git clone --branch v1.4.2 https://github.com/hyperledger/fabric-samples.git
将make release
这一步生成的已经拷贝到根目录的bin目录复制到fabirc-sample目录下,可以使用下面的命令
cp -r bin fabric-samples
configtx.yaml
因为该国密版本的order节点不支持OrdererCapabilities V1_4_2
,所以我们将其修改为和fabric-sample v1.4.1
相同的设置:
vim first-network/configtx.yaml
Capabilities
部分的Channel
的V1_4_2: true
改为V1_3: true
。Capabilities
部分的Orderer
的V1_4_2: true
改为V1_1: true
。Capabilities
部分的Application
的V1_4_2: true
注释掉。Capabilities
部分的Application
的V1_3: false
改为V1_3: true
。cd fabirc-sample/first-network
./byfn.sh up
如果这过程中报错peer节点一直崩溃无法运行(有的机器上或者centos版本上会有这种情况),有可能是因为当前版本存在一些问题,在某些centos版本(或者服务器设置)下需要设置一个peer的环境变量。具体详情见阿里云的一篇文章:阿里云环境部署Hyperledger Fabric之SIGSEGV问题分析和解决经验分享
这里要更改base/peer-base.yaml
,在节点的环境变量设置中增加:- GODEBUG=netdns=go
。
然后:
./byfn.sh down
./byfn.sh up
如果需要在多台机器上部署改造后国密版本,不可能每台机器都按这这个步骤来,太浪费时间。个人设想是将编译好的镜像导出为本地文件,复制到另一台机器后再导入镜像,同时还需复制上面make release
生成的bin
文件夹。
参考文章:docker 拷贝镜像文件
这个设想别人已经实现了,可行的,速度比make快多了。
最后:由于部署测试是个步骤很多的操作,因此写的比较简略,并且有些步骤也语焉不详,特别是构建工具的那个步骤。如果文章有什么错误或者大家操作中遇到什么问题,欢迎留言一起交流探讨。