Hyperledger Fabric笔记2--运行fabric测试网络
1、获取fabric相关源代码
首先,需要在/opt/gopath中新建目录, mkdir -p /opt/gopath/src/github.com/hyperledger/
其次,下载fabric源码,git clone https://github.com/hyperledger/fabric.git
或者 git clone https://gerrit.hyperledger.org/r/fabric
下载fabric-samples,git clone -b master https://github.com/hyperledger/fabric-samples.git
2、运行first-network 测试网络
1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用
docker ps -a 查看所有容器
docker stop name(name为docker ps -a中的name列)
docker rm $(docker ps -a -q) #删除所有容器
2)cd fabric-samples
git tag #查看有哪几个版本,笔者当前有如下tag
git checkout -b v1.1.0-alpha #该命令会在本地新建一个v1.1.0-alpha的分支,该分支内容即为tag为v1.1.0-alpha的版本内容 ,此处需要注意的是初次clone fabric-sample后,需要使用git checkout -b v1.1.0-alpha,否则本地文件没有改变;第一次成功后就可以直接使用 git checkout v1.1.0-alpha来切换版本了
注:笔者使用默认git clone 的v1.1.0-rc1 出问题了,问题如下:
ERROR! Local Fabric binary version of 1.0.0 does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples.
即:v1.0.0的fabri bin文件夹下的程序和v1.1.0-rc1不匹配,因此可选择使用新版本的fabric或者回退fabric-samples,笔者向前回退发现使用alpha成功了,因此可优先使用v1.1.0-alpha
3)执行fabric/scripts下的bootstrap-1.0.0.sh脚本,以获取一个包含configtxgen、cryptogen和peer等文件的bin目录
cd到fabric/scripts下,执行./bootstrap-1.0.0.sh,该命令不仅会下载bin目录,还会从docker hub中拉取必要的fabric网络运行所需的docker镜像
如果fabric/scripts下没有对应的sh文件,则需要 git checkout -b v1.0.0 #该命令在本地新建一个v1.0.0的分支,v1.0.0的scripts目录下包含多种sh文件,我们只需使用bootstrap-1.0.0.sh文件,生成bin命令后,将fabric/scripts/bin目录拷贝到fabric-samples/下
需要注意的是,初次切换到新分支或者tag的时候需要使用git checkout -b v1.0.0来新建tag对应的分支,否则本地script脚本下文件没有改变,后续可以直接使用git checkout v1.0.0 切换到对应的分支
注意:笔者也测试过bootstrap-1.0.0-rc1.sh,其下载的bin文件夹也可以供v1.1.0-alpha 版的fabric-samples使用
4)cd /fabric-samples/first-network
执行./byfn.sh -m generate 产生必要的文件
执行./byfn.sh -m up启动网络,选项为y,成功启动后如下图所示:
执行./byfn.sh -m down 关闭网络
注意:若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器
官方参考文档:http://hyperledger-fabric.readthedocs.io/en/release-1.0/build_network.html
3、运行fabric下e2e_cli 测试网络
1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用
docker ps -a 查看所有容器
docker stop name(name为docker ps -a中的name列)
docker rm $(docker ps -a -q) #删除所有容器
2)git checkout -b v1.0.0
cd fabric/scripts
./bootstrap-1.0.0.sh
该操作会生成fabric 1.0所需的docker images和包含configtxgen、cryptogen和peer等文件的bin目录,在运行fabric-samples的时候需要将其拷贝到fabric-samples目录下
3) cd fabric/examples/e2e_cli
执行./network_setup.sh up 启动网络,启动后界面同first-network一样
执行./network_setup.sh down 关闭网络
若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器
4、注意事项
(1) clearContainers函数删除所有容器的解决方法
在运行./byfn.sh -m down的时候回执行clearContainers() 函数中的CONTAINER_IDS=$(docker ps -aq),这会把所有的容器都删除,偷懒的方法是使用的时候需要确保宿主机上没有重要的容器,或者将容器数据备份一下!
比较靠谱的方法是更改一下byfn.sh脚本,使命令行只删除除了需要保存的容器之外的所有容器,为此笔者做了如下改进脚本如下:
笔者有服务器上同时启动了mygerrit、mynginx、myjenkins、hello-world等4个容器,需要删掉除了mygerrit mynginx myjenkins之外的容器,运行脚本结果如下所示:
很明显,只删除了hello对应容器,其它容器正常存活,将删除更改添加到fabric各个启动脚本中就可以避免关闭fabric网络的时候删除所有容器的问题
(2)bin文件夹的说明
bin文件夹中包括6个文件: configtxgen configtxlator cryptogen get-byfn.sh get-docker-images.sh peer ;其中configtxgen 用于生成排序服务的创世区块和相关的配置文件,生成的文件在 channel-artifacts 中;cryptogen 用于生成工具证书,其生成的文件在 crypto-config中。
bin文件夹的获取方式:
方法一:执行fabric/scripts下的bootstrap-1.0.0.sh或./bootstrap-1.0.0.-rc1.sh脚本,脚本中有如下下载命令;
bin文件夹通常下载速度很慢,若下载不出来可以用方法二编译生成相关文件
方法二:屏蔽bootstrap-1.0.0***.sh中的curl下载功能,直接去pull 相关的docker镜像,使用fabric/examples/e2e_cli/generateArtifacts.sh 编译生成bin文件,generateArtifacts.sh脚本中有如下函数,该函数会判断$FABRIC_ROOT/release/$OS_ARCH/bin/下是否存在configtxgen文件,若不存在就make - C $FABRIC_ROOT release生成对应的bin文件夹,后续生成创世块和相应配置文件也使用该bin目录下的文件
由于e2e_cli中使用编译生成的bin文件夹内的文件,所以在运行通过network_setup.sh脚本运行e2e_cli时候不需要将生成的bin文件夹拷贝到其它目录,若通过手动命令行运行时最好将其拷贝到同级或上级目录中;而byfn中默认是没有bin文件夹的,且byfn.sh脚本通过export PATH=${PWD}/../bin:${PWD}:$PATH 将bin文件夹导入到临时环境变量中,因此需要通过fabric项目生成相应的bin文件,并将其拷贝到fabric-samples项目目录中。
5、说明
截图系统版本:Ubuntu 16.04.4 Desktop LTS (64-bit), 安装在VM虚拟机上
笔者也在腾讯云 Ubuntu 16.04 Server (64-bit)上测试过,可正常启动测试网络