
第1章 Hyperledger Fabric认知与环境搭建
1.1 全面认识超级账本
目标
1.了解超级账本的由来及特点。
2.清楚超级账本的分类。
3.了解Hyperledger Fabric的特点。
1.1.1 超级账本由来
当你拿起这本书开始阅读时,说明你对区块链技术已经有了相关的了解,而且想通过自己的努力或团队合作的方式开发出一款真正基于区块链技术的落地应用。那么恭喜你,你的选择是正确且明智的。
超级账本,即Hyperledger项目是区块链技术中第一个面向企业应用场景的开源分布式账本平台。
2015年12月由Linux基金会主导并牵头,IBM、Intel、Cisco等制造和科技行业的巨头共同宣布了Hyperledger联合项目成立。
Hyperledger将区块链技术引入联盟链的应用场景中,为未来基于区块链技术打造高效率的商业网络打下基础,为透明、公开、去中心化的企业级分布式账本技术提供开源参考实现,目前已加入的成员超过260家,国外的如IBM、Intel、Cisco、Oracle、RedHat、Samsung、Fujitsu、Airbus等;国内的如百度、小米、腾讯、联想、华为、浪潮、京东、迅雷、房掌柜、中国民生银行、招商银行、保全网等。
Hyperledger官网地址:https://www.hyperledger.org。
1.1.2 超级账本分类
在Hyperledger这个大家庭中,项目可以分为两大类别。
框架项目:区块链应用开发平台,提供企业级应用程序开发环境及相关的SDK。
实用工具:区块链应用测试、部署、管理等工作的相关工具。
1.框架项目
Fabric:用模块化架构作为开发区块链程序或解决方案的基础,支持一些组件(如共识算法和成员服务)的即插即用。
Iroha:由Soramitsu、Hitachi、NTT Data和Colu提供,使用C++编写,采用拜占庭容错一致性算法实现共识,是为了将分布式账本技术更容易地与基础架构型项目集成而设计的一个区块链框架项目。应用程序可以使用Python、Java、JavaScript、C++在Android和iOS移动平台编写。
Sawtooth:一个创建、部署和运行分布式账本的模块化平台。它包含一个新奇的共识算法——PoET(Proof of Elapsed Time,经历时间证明),面向大型分布式验证器群,消耗最少的资源。
Burrow:由Monax提供,由Intel公司共同赞助,是一个支持许可的智能合约机,该系列的第一个版本发表于2014年12月。Burrow提供了一个模块化的区块链客户端,内置一个经许可的智能合约解释器,它部分是按照以太坊虚拟机(Ethereum Virtual Machine,EVM)规范而开发的。
Indy:一种特别为去中心化的身份而建立的分布式账本。它提供了基于区块链或者其他分布式账本互操作以创建与使用独立数字身份的工具、代码库和可重用组件。
2.实用工具
Explorer:由IBM、Intel及DTCC提供;可以查看、调用、部署或查询区块、交易、网络信息、链码和交易序列,以及账本中的其他相关信息。
Composer:一个构建区块链商业网络的协作工具,用来加速智能合约的开发及分布式账本的部署;使用JavaScript构建。
Cello:由IBM提供,赞助商来自Soramitsu、华为和Intel,旨在为区块链生态系统带来按需部署服务的模式,减少创建、管理、终止区块链的难度。
Caliper:由华为、Hyperchain、Oracle、Bitwise、Soramitsu、IBM和布达佩斯技术与经济大学的开发人员提供,是一个区块链基准工具,内置一套预定义的测试用例,让使用者可以测试特定区块链执行的性能。
1.1.3 认识Hyperledger Fabric
Hyperledger Fabric是一个区块链的实现,由Digital Asset和IBM提供,是Linux基金会托管的Hyperledger项目之一。Hyperledger Fabric从诞生之初就立志要成为超级账本中最优秀的项目(现实也确实如此)。
作为开发具有模块化架构的应用程序或解决方案的基础,Hyperledger Fabric实现了组件(如共识、成员服务)的即插即用。Hyperledger Fabric利用容器技术来托管称为“链码”的智能合约,其中包含系统的应用程序逻辑。
与其他区块链技术类似,Hyperledger Fabric使用智能合约操作账本,并且是一个通过所有参与者管理交易的系统。Hyperledger Fabric与其他公有区块链系统最大的不同主要体现在以下两个方面。
1)私有:Hyperledger Fabric提供了建立通道(Channel)的功能,允许参与者为交易新建一个单独的账本。参与者并不希望所有的交易信息(如提供给部分客户的特定价格信息)都对网络中所有参与者公开。只有在同一个通道中的参与者,才会拥有该通道中的账本,而其他不在此通道中的参与者则无权查看这个账本的相关信息。
2)许可:与开放无须许可的网络系统允许未知身份的参与者加入网络不同(需要通过工作量证明协议来保证交易有效并维护网络的安全),Hyperledger Fabric通过MSP(Membership Service Provider)来登记所有的成员。
Hyperledger Fabric项目GitHub网址:https://github.com/hyperledger/fabric。
1.2 迈出第一步:搭建环境
目标
1.检查操作系统。
2.检查并安装所需工具。
3.可选安装Node及NPM。
1.2.1 操作系统
推荐使用的操作系统为64位的Ubuntu 16.04 LTS,系统内核为GNU/Linux 4.13.0-36-generic x86_64。
硬件资源要求:内存最低为2GB,最好在3GB以上;磁盘空间为30GB或更高。
如果计算机默认为Windows操作系统,可以在Windows系统中安装一个VMware虚拟机应用程序,然后在VMWare虚拟机中安装Ubuntu 16.04系统,最后在Windows操作系统中安装一个远程连接工具(如XShell或SecureCRT),以便连接并操作Ubuntu系统。
如果使用的是Mac电脑,同样建议以安装、使用虚拟机的方式来学习。
1.2.2 安装所需工具
1.安装git
git是一个非常优秀的开源版本管理控制工具,使用git工具可以方便地下载官方(Golang、Hyperledger Fabric等)在GitHub网站上发布的相关源代码或其他内容。
安装git工具使用如下命令:
$ sudo apt update $ sudo apt install git
Mac OS系统中默认已安装该工具。如果未安装该工具,则可以在git-scm官方网站(https://git-scm.com/downloads)下载相应系统的安装包并安装。
2.安装cURL
使用如下命令安装cURL:
$ sudo apt install curl
其他系统的cURL安装包可以在https://curl.haxx.se/download.html页面中下载并安装。
3.安装Docker
查看系统中是否已经安装Docker:
$ docker --version
使用如下命令安装Docker的最新版本:
$ sudo apt update $ sudo apt install docker.io
查看Docker版本信息:
$ docker --version
输出类似如下的Docker版本信息:
Docker version 17.03.2-ce, build f5ec1e2
4.安装docker-compose
确定系统中是否已安装docker-compose工具:
$ docker-compose --version
如果系统提示未安装,则使用如下命令安装docker-compose工具:
$ sudo apt install docker-compose
安装成功后,查看docker-compose版本信息:
$ docker-compose --version
输出类似如下的docker-compose版本信息:
docker-compose version 1.8.0, build unknown
5.安装Golang
Fabric 1.0.0版本要求Golang 1.7以上版本,Fabric 1.1.0版本要求Golang 1.9以上版本,Fabric 1.2.0版本要求Golang 1.10以上版本,我们使用Fabric 1.2.0版本,所以从官方下载最新版本的Golang。
(1)下载Golang
使用wget工具下载Golang的最新版本压缩包文件go1.10.3.linux-amd64.tar.gz:
$ wget https:// dl.google.com/go/go1.10.3.linux-amd64.tar.gz
下载Golang压缩包文件,需要操作系统能够保证正常访问Golang官方网站。下载过程可能耗时较长(取决于具体网络情况),请耐心等待。
其他系统可以在Golang官方网站https://golang.org/dl/下载页面中下载相应的安装包并安装。
下载完成后,文件会保存在当前目录下。可以使用ll命令查看:

7.tif
(2)解压文件
使用tar命令将下载后的压缩包文件解压到指定的/usr/local/路径下:
$ sudo tar -zxvf go1.10.3.linux-amd64.tar.gz -C /usr/local/
注意,在解压过程中可能出现如下错误:
gzip: stdin: unexpected end of f ile tar: Unexpected EOF in archive tar: Unexpected EOF in archive tar: Error is not recoverable: exiting now
或如下错误信息:
gzip: stdin: unexpected end of f ile tar: 归档文件中异常的 EOF tar: 归档文件中异常的 EOF tar: Error is not recoverable: exiting now
如果出现上述错误提示信息,则说明下载的压缩包文件有问题,如果没有下载完整或压缩包数据损坏,可将其删除后重新下载并解压至指定的目录中。
(3)配置环境变量
将压缩包文件解压至指定目录后,Golang可以让系统的所有用户正常使用,这里使用vim文件编辑工具打开系统的profile文件进行编辑:
$ sudo vim /etc/prof ile
如果只想让当前登录用户使用Golang,而其他用户不能使用Golang,则编辑当前用户$HOME目录下的.bashrc或.profile文件,在该文件中添加相应的环境变量即可。
在profile文件最后添加如下内容:
export GOPATH=$HOME/go export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH
使用source命令,使刚刚添加的配置信息生效:
$ source /etc/prof ile
通过go version命令验证是否成功:
$ go version
输出如下的Golang版本信息:
go version go1.10.3 linux/amd64
如果系统中有旧版本的Golang,则使用如下命令卸载旧版本的Golang,然后重新安装并配置:
$ su - # apt-get remove golang-go --purge && apt-get autoremove --purge && apt-get clean
6.安装NVM与npm
(1)安装NVM
NVM(Node Version Manager)是Node.js的版本管理软件,可以根据不同的需求场景随时在Node.js的各个版本之间进行切换。
由于Node.js版本更新较快,且各版本之间差异较大,直接从Node官网安装可能需要很长时间,而且中间可能会因为网络访问及数据传输原因造成下载中断或失败等问题。为了方便安装及后期管理Node.js的版本,需要先在系统中安装NVM管理工具。使用如下命令安装NVM:
$ sudo apt update $ curl -o- https:// raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash $ export NVM_DIR="$HOME/.nvm" $ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
(2)安装Node
NVM工具安装并配置成功后,可以直接使用nvm命令安装Node,且Node安装成功后,NVM会自动对npm工具进行安装。使用如下命令安装Node:
$ nvm install v8.11.1
安装Node时需要注意,安装版本为8.9.x或以上的Node.js,Fabric目前不支持9.x系列的Node.js版本。安装成功输出如下内容:

9.tif
(3)检查Node及npm版本
$ node -v && npm -v
输出内容如下:
v8.11.1 5.6.0
FAQ
1.Hyperledger Fabric只支持Ubuntu系统吗?
Hyperledger Fabric支持常见的Linux相关系统(如Debian、Cent OS等)和Mac OS。
由于不同操作系统或各系统的不同版本可能会造成一些问题,所以在此推荐使用的操作系统为64位的Ubuntu 16.04 LTS。
2.cURL是什么?有什么作用?
cURL是一个可以在终端命令行下使用URL语法执行的开源文件传输工具。它可以支持基于HTTP/Socket的代理;cURL还支持使用SSL证书,支持HTTP POST、HTTP PUT,支持FTP上传,以及基于HTTP表单的上传;支持Cookie,可以使用用户名+密码的方式实现认证(Basic、Plain、Digest、CRAM-MD5、NTLM、Negotiate和Kerberos)等。
3.为什么要安装Docker及docker-compose?
Docker是一个开源的应用容器引擎,可以为应用创建一个轻量级的、可移植的容器。Hyperledger Fabric环境依赖于Docker提供的容器服务,所以必须安装Docker环境;推荐使用1.13或更高版本。
Compose是一个用于定义和运行多个容器的Docker应用程序的工具,可以使用YAML文件配置相关的指定服务,运行该服务时只需要一个简单的命令即可。
4.能否不使用Golang而换作其他语言环境?
Hyperledger Fabric的很多组件使用Golang实现,并且我们会使用Golang来编写链式代码的应用程序,所以需要在系统中安装并设置Golang环境。
5.一定要安装Node与npm吗?
Node与npm工具为可选安装工具。如果后期使用Node.js的Hyperledger Fabric SDK开发Hyperledger Fabric应用程序,则需要安装;否则无须安装。
1.3 安装Hyperledger Fabric
目标
1.顺利下载Hyperledger Fabric。
2.明确bootstrap.sh脚本做了哪些工作。
1.3.1 下载fabric-samples与二进制文件
为了方便后期管理,在当前登录用户的HOME目录下创建一个空目录并进入该目录:
$ mkdir hyfa && cd hyfa
新建文件bootstrap.sh并添加内容:
$ vim bootstrap.sh
将https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh中的内容复制、保存后退出。
该bootstrap.sh可执行脚本文件的作用如下。
1)如果当前目录中没有hyperledger/fabric-samples,则从github.com克隆hyperledger/fabric-samples存储库。
2)使用checkout签出对应指定的版本标签。
3)将指定版本的Hyperledger Fabric平台特定的二进制文件和配置文件安装到fabric-samples存储库的根目录中。
4)下载指定版本的Hyperledger Fabric Docker镜像文件。
5)将下载的Docker镜像文件标记为“latest”。
创建的bootstrap.sh脚本文件并不能立即执行,必须对其赋予可执行权限才能够运行。执行如下命令对bootstrap.sh脚本文件赋予可执行权限:
$ chmod +x bootstrap.sh
执行bootstrap.sh:
$ sudo ./bootstrap.sh 1.2.0
确定网络稳定,否则会导致各种问题,例如,下载到一半时网络超时,下载失败等;由于Docker的各种镜像文件下载时间较长,所以请耐心等待。
下载完成后,查看相关输出内容。如果有下载失败的镜像,可再次执行如下命令重新下载。
$ sudo ./bootstrap.sh 1.2.0
对于已下载的Docker镜像文件,再次执行脚本命令不会重新下载。
安装完成后终端自动输出:
===> List out hyperledger docker images hyperledger/fabric-ca 1.2.0 66cc132bd09c 4 weeks ago 252 MB hyperledger/fabric-ca latest 66cc132bd09c 4 weeks ago 252 MB hyperledger/fabric-tools 1.2.0 379602873003 4 weeks ago 1.51 GB hyperledger/fabric-tools latest 379602873003 4 weeks ago 1.51 GB hyperledger/fabric-ccenv 1.2.0 6acf31e2d9a4 4 weeks ago 1.43 GB hyperledger/fabric-ccenv latest 6acf31e2d9a4 4 weeks ago 1.43 GB hyperledger/fabric-orderer 1.2.0 4baf7789a8ec 4 weeks ago 152 MB hyperledger/fabric-orderer latest 4baf7789a8ec 4 weeks ago 152 MB hyperledger/fabric-peer 1.2.0 82c262e65984 4 weeks ago 159 MB hyperledger/fabric-peer latest 82c262e65984 4 weeks ago 159 MB hyperledger/fabric-zookeeper 0.4.10 2b51158f3898 5 weeks ago 1.44 GB hyperledger/fabric-zookeeper latest 2b51158f3898 5 weeks ago 1.44 GB hyperledger/fabric-kafka 0.4.10 936aef6db0e6 5 weeks ago 1.45 GB hyperledger/fabric-kafka latest 936aef6db0e6 5 weeks ago 1.45 GB hyperledger/fabric-couchdb 0.4.10 3092eca241fc 5 weeks ago 1.61 GB hyperledger/fabric-couchdb latest 3092eca241fc 5 weeks ago 1.61 GB
添加环境变量(可选执行命令):
$ export PATH=<path to download location>/bin:$PATH
<path to download location>表示fabric-samples文件目录所在路径,例如:
$ export PATH=$HOME/hyfa/fabric-samples/bin:$PATH
1.3.2 Hyperledger Fabric源码方式编译
在1.3.1节中,我们以提供脚本的方式,可以下载并安装fabric-samples和二进制文件到操作系统中,大大简化了安装过程。
Hyperledger Fabric还有另外一种安装方式,就是以源码的方式进行本地编译安装,此方式相较1.3.1节的方式略微复杂,需要手动编译生成相应的工具,在此逐一介绍。
(1)下载源码
先使用mkdir命令创建相应的目录,然后使用git clone命令将Hyperledger Fabric源码克隆至该目录中:
$ mkdir -p $GOPATH/src/github.com/hyperledger/ $ cd $GOPATH/src/github.com/hyperledger/ $ git clone https:// github.com/hyperledger/fabric.git
注意,也可以使用go get命令下载源码,需要手动创建相应的目录:
$ go get github.com/hyperledger/fabric
下载可能需要几分钟,也可能需要十几分钟,取决于当前的网络环境,请耐心等待。源码下载完成后使用git checkout命令切换至指定的分支:
$ cd $GOPATH/src/github.com/hyperledger/fabric/ $ git checkout -b v1.2.0
源码下载完成之后,并不能直接使用,我们需要对其进行编译,生成所需要的各种节点及相应的工具。我们直接使用源码提供的Makefile来进行编译。首先对Makefile文件进行编辑,指定相应的版本:
$ vim Makef ile
修改文件中BASE_VERSION、PREV_VERSION、CHAINTOOL_RELEASE、BASEIMAGE_RELEASE的值,修改之后的内容如下:
BASE_VERSION = 1.2.1 PREV_VERSION = 1.2.0 CHAINTOOL_RELEASE=1.1.1 BASEIMAGE_RELEASE=0.4.10
(2)编译Orderer
执行以下命令编译Orderer:
$ cd $GOPATH/src/github.com/hyperledger/fabric/ $ make orderer
命令执行后,终端输出如下信息:

(3)编译Peer
编译Peer的命令如下:
$ make peer
命令执行成功后,终端输出如下信息:

使用系统命令ll查看.build/bin目录内容:
$ ll .build/bin/
命令执行后,可以看到.build/bin目录中已生成了如下两个工具:

(4)编译生成相关工具
Hyperledger Fabric中除了Orderer和Peer之外,还提供了在搭建网络环境时所需要的一系列辅助工具。
·configtxgen:生成初始区块及通道交易配置文件的工具。
·cryptogen:生成组织结构及相应的身份文件的工具。
·configtxlator:将指定的文件在二进制格式与JSON格式之间进行转换。
编译生成这些工具同样可以使用make命令:
$ make conf igtxgen $ make cryptogen $ make conf igtxlator
编译之后同样使用ll命令查看.build/bin目录中的内容:

(5)编译生成Docker镜像
将当前用户添加到Docker组:
$ sudo usermod -aG docker kevin
注意
添加成功后必须注销或重启系统。
安装依赖的libltdl-dev库:
$ sudo apt-get install libltdl-dev
(6)获取镜像
编译生成Docker镜像需要用到Golang工具,所以我们需要通过git clone命令从github.com克隆至当前系统中:
$ mkdir -p $GOPATH/src/golang.org/x $ cd $GOPATH/src/golang.org/x $ git clone https:// github.com/golang/tools.git
执行编辑命令后将指定的环境变量设置到用户的环境文件(.bashrc)中:
$ vim ~/.bashrc export PATH=$PATH:$GOPATH/bin
为了能够使配置的环境生效,需要执行source命令:
$ source ~/.bashrc
Hyperledger Fabric源码由Golang构建,所以需要安装Golang相关的工具,以方便开发和调试:
$ mkdir -p $GOPATH/src/golang.org/x $ cd $GOPATH/src/golang.org/x $ git clone https:// github.com/golang/net.git $ git clone https:// github.com/golang/tools.git $ cd $GOPATH $ go get github.com/kardianos/govendor $ go get github.com/onsi/ginkgo/ginkgo $ go get github.com/golang/protobuf/protoc-gen-go $ go get -u github.com/axw/gocov/... $ go get -u github.com/AlekSi/gocov-xml $ go get -u github.com/client9/misspell/cmd/misspell $ go get -u golang.org/x/tools/cmd/goimports $ go get -u github.com/golang/lint/golint
将之前安装的Golang工具复制到Fabric目录:
$ cd $GOPATH/src/github.com/hyperledger/fabric/ $ mkdir -p .build/docker/gotools/bin $ cp ~/go/bin/* .build/docker/gotools/bin
使用make docker命令编译生成相关的Docker镜像:
$ cd $GOPATH/src/github.com/hyperledger/fabric/ $ make docker
(7)获取镜像方式二
可以直接从Docker Hub拉取镜像,使用docker pull命令拉取指定的Docker镜像。
$ export FABRIC_TAG=1.2.0 $ export CA_TAG=1.2.0 $ export THIRDPARTY_IMAGE_VERSION=0.4.10 $ docker pull hyperledger/fabric-peer:$FABRIC_TAG \ && docker pull hyperledger/fabric-orderer:$FABRIC_TAG \ && docker pull hyperledger/fabric-ca:$CA_TAG \ && docker pull hyperledger/fabric-tools:$FABRIC_TAG \ && docker pull hyperledger/fabric-ccenv:$FABRIC_TAG \ && docker pull hyperledger/fabric-baseimage:$THIRDPARTY_IMAGE_VERSION \ && docker pull hyperledger/fabric-baseos:$THIRDPARTY_IMAGE_VERSION \ && docker pull hyperledger/fabric-couchdb:$THIRDPARTY_IMAGE_VERSION \ && docker pull hyperledger/fabric-kafka:$THIRDPARTY_IMAGE_VERSION \ && docker pull hyperledger/fabric-zookeeper:$THIRDPARTY_IMAGE_VERSION
将已下载的镜像标记为最新:
$ docker tag hyperledger/fabric-peer:$FABRIC_TAG hyperledger/fabric-peer \ && docker tag hyperledger/fabric-orderer:$FABRIC_TAG hyperledger/fabric-orderer \ && docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca \ && docker tag hyperledger/fabric-tools:$FABRIC_TAG hyperledger/fabric-tools \ && docker tag hyperledger/fabric-ccenv:$FABRIC_TAG hyperledger/fabric-ccenv \ && docker tag hyperledger/fabric-baseimage:$THIRDPARTY_IMAGE_VERSION hyperledger/fabric-baseimage \ && docker tag hyperledger/fabric-baseos:$THIRDPARTY_IMAGE_VERSION hyperledger/ fabric-baseos \ && docker tag hyperledger/fabric-couchdb:$THIRDPARTY_IMAGE_VERSION hyperledger/ fabric-couchdb \ && docker tag hyperledger/fabric-kafka:$THIRDPARTY_IMAGE_VERSION hyperledger/ fabric-kafka \ && docker tag hyperledger/fabric-zookeeper:$THIRDPARTY_IMAGE_VERSION hyperledger/ fabric-zookeeper
之后可以使用docker images命令查看相关的镜像信息:
$ docker images
命令执行后终端输出如下信息:

Hyperledger Fabric中可以用两种方式进行编译安装:第一种是以bootstrap.sh脚本方式进行环境的安装,优点是简单、方便,能够快速上手;第二种是以Fabric源码方式进行编译,适合动手能力较强的人员,优点是可以对Hyperledger Fabric相关组件有深入的理解,但缺点是容易出现各种错误且修正比较麻烦。
注意
为方便起见,本书的Hyperledger Fabric环境采用第一种方式(bootstrap.sh脚本方式)安装构建。
FAQ
1.bootstrap.sh脚本中的内容有什么作用?
脚本执行后将下载并提取设置网络所需的所有特定于平台的二进制文件,并保存在本地仓库中,然后将Docker Hub中的Hyperledger Fabric Docker镜像下载到本地Docker注册表中,并将其标记为“最新”。
2.下载Docker镜像文件速度特别慢,有什么好的解决方式?
可在https://www.daocloud.io/网站中注册一个账号,注册成功后,可以单击加速器图标(如下图所示)以获取Docker加速器。

1)配置Docker加速器。在命令提示符中输入如下图所示的daocloud.io分配的加速器脚本命令(将输入框中的脚本命令复制到命令提示符窗口中执行即可),执行完脚本之后,需要重启Docker服务。

2)重启Docker服务。执行完该命令后,必须重启Docker服务以生效:
$ sudo systemctl restart docker.service
3.下载完成后,添加的环境变量有什么意义?
添加环境变量的意义为在系统中任何路径下使用Fabric相关的命令都可以让系统找到该命令并且顺利执行。后期我们会进入Fabric目录中执行相应的命令,所以也可以不添加该环境变量。
1.4 测试Hyperledger Fabric网络环境
目标
1.熟悉byfn.sh脚本的相关命令。
2.能够自动实现你的第一个Hyperledger Fabric网络环境。
Hyperledger Fabric网络环境的构成较为复杂,由N个节点组成一个分布式网络,每个节点都有自己的实体身份标识;而且Hyperledger Fabric可以通过通道将一个网络分割成不同的私有子网,从而实现不同账本之间数据的隔离性。所以,我们在使用Hyperledger Fabric之前,必须先构建所需的网络环境。
构建Hyperledger Fabric网络环境可以通过两种方式实现。
1.使用自动化脚本实现
使用一个名为byfn.sh的自动化脚本文件自动构建一个简易的Hyperledger Fabric网络环境并引导启动,且自动生成相应的一些配置文件,一般用于测试环境,本节内容主要讲解这种方式。
2.手动实现
为了适应不同的且较为复杂的场景,这时自动化脚本方式就有些力不从心,必须由开发、运维及相关管理人员根据不同的情况,手动输入相关命令构建一个相当复杂的网络环境。这种实现方式参见第3章相关内容。
1.4.1 测试Hyperledger Fabric环境
之前我们介绍过,使用一个名为byfn.sh的脚本实现Hyperledger Fabric网络的自动构建并测试,那么我们来看一下byfn.sh脚本都有哪些命令可以使用。首先进入fabric-samples目录中的first-networkd子目录:
$ cd fabric-samples/f irst-network
在first-network目录下有一个自动化脚本byfn.sh,可以使用--help参数查看相应的可用命令,在命令提示符中输入如下命令:
$ ./byfn.sh --help
命令执行成功后,会在终端输出如下类似内容(为方便起见,笔者已将其说明翻译成中文):
up:启动; down:清除网络; restart:重新启动; generate:生成证书及创世区块; upgrade:将网络从1.1.x升级到1.2.x; -c:用于指定channelName,默认值"mychannel"; -t:CLI timeout时间,默认值10; -d:延迟启动,默认值3; -f:使用指定的网络拓扑结构文件,默认使用docker-compose-cli.yaml; -s:指定使用的数据库,可选 goleveldb/couchdb; -l:指定chaincode使用的语言,可选golang/node; -i:指定镜像tag,默认 "latest"。
1.4.2 构建你的第一个Hyperledger Fabric网络
1.生成证书和密钥
byfn.sh自动化脚本文件为各种Hyperledger Fabric网络实体生成所有证书和密钥,并且可以实现引导服务启动及配置通道所需的一系列配置文件:
$ sudo ./byfn.sh -m generate
命令成功执行后会生成1个Orderer+4个Peer+1个CLI的网络结构,4个Peer包含在2个Org中。
根据提示输入y,之后终端输出类似如下的日志内容:
Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... /home/kevin/hyfa/fabric-samples/f?irst-network/../bin/cryptogen # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Generate certif?icates using cryptogen tool # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + cryptogen generate --conf?ig=./crypto-conf?ig.yaml org1.example.com org2.example.com + res=0 + set +x /home/kevin/hyfa/fabric-samples/f?irst-network/../bin/conf?igtxgen # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # Generating Orderer Genesis block # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + conf?igtxgen -prof?ile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/ genesis.block …… doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update + res=0 + set +x
2.启动网络
生成所需要的证书及密钥之后,需要启动网络来确认Hyperledger Fabric网络环境是否能够正常工作,使用byfn.sh脚本来实现网络的启动,命令如下:
$ sudo ./byfn.sh -m up
命令执行后,终端会输出一个提示信息,根据提示输入y,如果输出如下类似内容,则代表网络启动且测试成功:
Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... LOCAL_VERSION=1.2.0 DOCKER_IMAGE_VERSION=1.2.0 Creating network "net_byfn" with the default driver Creating volume "net_peer0.org2.example.com" with default driver Creating volume "net_peer1.org2.example.com" with default driver Creating volume "net_peer1.org1.example.com" with default driver Creating volume "net_peer0.org1.example.com" with default driver Creating volume "net_orderer.example.com" with default driver Creating peer0.org2.example.com Creating peer0.org1.example.com Creating peer1.org2.example.com Creating orderer.example.com Creating peer1.org1.example.com Creating cli ____ _____ _ ____ _____ / ___| |_ _| / \ | _ \ |_ _| \___ \ | | / _ \ | |_) | | | ___) | | | / ___ \ | _ < | | |____/ |_| /_/ \_\ |_| \_\ |_| Build your first network (BYFN) end-to-end test …… ========Query successful on peer1.org2 on channel 'mychannel'========== ========= All GOOD, BYFN execution completed =========== _____ _ _ ____ | ____| | \ | | | _ \ | _| | \| | | | | | | |___ | |\ | | |_| | |_____| |_| \_| |____/
3.关闭网络
网络测试成功后,为了方便后期的操作,最好将其关闭,以防止后期启动网络时造成的冲突错误,关闭网络可执行如下命令:
$ sudo ./byfn.sh -m down
根据提示输入y,命令执行后终端输出类似如下的日志内容:
Stopping for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds Continue? [Y/n] y proceeding ... Stopping cli ... done Stopping peer1.org1.example.com ... done …… Removing cli ... done Removing peer1.org1.example.com ... done …… 7fb4e7907b3c 708576aff44f 0a8805ff393d Untagged: dev-peer1.org2.example.com-mycc-1.0-26c2ef32838554aac4f7ad6f100aca86 5e87959c9a126e86d764c8d01f8346ab:latest Deleted: sha256:687d517a67c1b236724deb84c50e310fb87f39341de5c66857e3049222a99504 Deleted: sha256:be2477e444d06842e81fb691e4e94f7ed4a547aeb8ba4a963660356a915b61c7 ……
使用byfn.sh脚本关闭网络之后,将关闭容器,且删除加密文件,并从Docker Registry中删除链码图像。
注意
在网络不再使用时,请务必关闭网络,以防止后期启动网络时引起冲突的错误。
FAQ
如果启动网络失败怎么办?
如果启动网络时发生错误,则执行关闭命令后重新生成组织结构及证书,然后再次执行启动网络的命令。