1. Fabric环境搭建
    3.1. 开发环境准备
    在学习区块链知识时,除了对开发语言有所了解外,虚拟机的操作使用也是很重要的。无论搭建网络环境还是运行实战项目,这些都需要在虚拟机里面进行。
    3.1.1. 操作系统配置
    本节示例所采用的软件是VMware Workstation Pro,在进行网络环境搭建前,需要在VMware Workstation Pro软件中安装Ubuntu虚拟机,同时在虚拟机中还使用到了Docker容器,以下会对具体的安装过程进行介绍。
    VMware Workstation Pro以及Ubuntu虚拟机均支持Windows 7以上的操作系统,本示例使用的操作系统是Windows 10版本。
  2. VMware Workstation Pro安装
    在网络上下载VMware Workstation Pro这个软件,具体可参考网址https://www.jianshu.com/p/552179808ebf,本示例系统使用的版本是15.04。
    下载好安装包后,进入安装页面,根据安装向导的提示进行一步一步操作,选择好安装位置后,即可等待安装完毕。
  3. Ubuntu安装
    在VMware Workstation Pro安装结束之后,安装Ubuntu虚拟机。Ubuntu的下载网站为:http://old-releases.ubuntu.com/releases/16.04.3/,使用的版本是16.04.3。
    安装Ubuntu虚拟机,除了正常按照向导进行外,需要注意以下几个方面:
    (1) 在VMware Workstation主界面选择“创建新的虚拟机”
    (2) 选择“典型(推荐)”,然后点击下一步,如图3.1所示:

图3.1选择“典型”配置虚拟机
(3) 之后在安装向导中选择“稍后安装操作系统”,点击下一步
(4) 在安装向导的选择客户机操作系统这一步,选择 Linux 操作系统,版本选择Ubuntu 64位,如图3.2所示:

图3.2 选择客户机操作系统
(5) 自定义选择存储位置和磁盘大小后,点击完成,结束安装。
(6) 在安装好的虚拟机首页单击 “开启虚拟机” 按钮,如图3.3所示:

图3.3 开启虚拟机
(7) 开启虚拟机后,在界面中单击右下角那个CD的小图标,如图3.4所示:

图3.4 点击图标
(8) 选择点击“设置”后,在弹出的对话框中,选择Ubuntu镜像文件(也就是保存Ubuntu的位置),然后点击确定,如图3.5所示:

图3.5 加入ISO映像文件
(9) 点击确定后,同样点击右下角的CD图标,选择“连接”。
(10) 点击虚拟机软件上方的重启选项重启虚拟机,进入安装界面。
(11) 重启虚拟机之后,在主界面选择“安装Ubuntu”,如图3.6所示:

图3.6 安装Ubuntu界面
(12) 安装结束后,点击重启,即可进入Ubuntu正常使用了。
3.1.2. Go语言环境安装
在Ubuntu安装成功之后,还需要在虚拟机中安装Go语言环境,Go语言各个版本的安装包参考网址为:https://studygolang.com/dl,具体安装步骤如下:
(1) 下载安装包
打开终端,在命令行内输入以下命令来下载安装包:wget https://studygolang.com/dl/golang/go1.11.linux-amd64.tar.gz, 如图3.7所示:

图3.7 下载Go语言安装包
(2) 解压安装包,移动到/usr/local目录下
在终端中输入命令:tar -xzf go1.11.linux-amd64.tar.gz对安装包进行解压,再输入命令sudo mv go /usr/local将安装包移动到local文件夹中。
(3) 路径配置
在终端中输入以下命令进行路径的配置。
 export PATH=KaTeX parse error: Unexpected character: '' at position 24: …r/local/go/bin ̲ export GOROOT…HOME/go
 export PATH= P A T H : PATH: PATH:HOME/go/bin
(4) 创建Go目录
在终端输入命令:mkdir –p go/src/github.com/hyperledger/fabric创建分级目录,如图3.8所示:

图3.8 创建Go目录
创建完毕之后,同样在终端中输入命令:sudo chmod –R 777 go给go文件夹以及该文件夹下的所有文件都授予读写和执行权限。
3.1.3. Docker环境配置
Docker是一个开源的应用容器,基于Google公司推出的Go语言实现。它的启动可以在秒级内实现,容器内除了运行的应用外,基本不消耗额外的系统资源,使得应用的性能很高。

  1. 下载Docker-ce
    Docker-ce 是Docker的社区版本,适用于基于Docker研发的应用开发者或者小型团队。本示例安装的是社区版本,通过在终端的命令行中输入以下命令来安装:
     sudo apt-get update
     sudo apt-get install docker-ce
    以上步骤结束后,在终端的命令行输入docker version,若出现以下界面,就说明已经安装成功了,如图3.12所示:

图3.12 Docker安装成功界面
2. Docker-Compose安装
Docker-Compose是一个用于定义和运行多个容器的应用,可以轻松高效地管理容器。在安装Docker-Compose之前,需要安装Python-pip。Python-pip是一个通用的Python包管理工具,它提供了对 Python 包的查找、下载、安装、卸载的功能。在终端命令行输入:sudo apt-get install python-pip,如图3.13所示:

图3.13 Python-pip的安装
安装完Python-pip之后,在命令行中输入sudo pip install docker-compose 来安装Docker-Compose。安装完毕之后,通过输入命令:docker-compose -version来查看版本号以及是否安装成功,如图3.14所示:

图3.14 docker-compose安装成功
3.1.4. 常用工具介绍

  1. Git
    Git是一个开源的分布式版本控制系统,与常用的版本控制工具CVS等不同,Git在没有网络的时候仍然可以使用大部分命令信息操作,在网络恢复的时候再跟服务器进行同步,这样可以更好地实现多人联合编程。
    打开终端,在命令行内输入命令:sudo apt-get install git即可进行安装,如图3.xx所示:

  2. curl
    curl是一个Linux命令行工具,既可以从服务器下载数据,也能往服务器上发送数据。curl命令非常强大,几乎支持所有的协议。
    打开终端,在命令行内输入命令:sudo apt-get install curl即可进行安装,如图3.xx所示:

  3. wget
    wget是在命令行下用来下载文件的工具。它可以用来从指定的URL下载文件。wget非常稳定,在下载过程中如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。
    打开终端,在命令行内输入命令:sudo apt-get install wget即可进行安装,如图3.xx所示:

3.1.5. Fabric安装

  1. 下载fabric.git
    打开终端,在命令行中输入cd go/src/github.com/hyperledger进入到hyperledger目录,再输入命令:git clone https://github.com/hyperledger/fabric.git来进行下载,如图3.15所示:

图3.15 下载fabric.git
2. 下载fabric镜像
在下载镜像之前,进入系统设置,打开Software & Updates,把系统的下载软件源改为http://mirrors.aliyun.com/ubuntu,因为连接国内的下载源在下载镜像时速度会比默认设置快很多,如图3.16所示:

图3.16 切换系统下载源
设置完成之后,在命令行中输入命令:sudo ./fabric/scripts/bootstrap.sh下载镜像文件,如图3.17所示:

图3.17下载镜像文件
下载完成后,在命令行输入docker images,若出现如图3.18所示的内容,即可说明镜像下载成功。

图3.18查看镜像信息
3. 下载fabric-samples
Fabric-samples是GitHub官网上面提供的模板案例,在搭建基础环境时需要用到这些文件。在终端命令行输入命令 cd go/src/github.com/hyperledger/fabric,进入fabric目录中,接着输入以下命令来下载fabric-samples,如图3.19所示:

图3.19 下载fabric-samples
4. 启动基础网络
打开终端,在命令行中输入命令进入first-network目录中:cd go/src/github.com/hyperledger/fabric-samples/first-network,接着输入命令:sudo ./byfn.sh -m generate来生成所需要的配置文件,如图3.20所示:

图3.20 下载fabric-samples
等待文件生成好之后,在命令行继续输入命令:sudo ./byfn.sh up开启网络,若出现如图3.21所示,即启动成功:

图3.21 网络启动成功
启动成功后,在终端命令行输入命令:sudo ./byfn.sh down将网络关闭,至此,准备工作已经全部完成了。
3.2. Fabric网络搭建
3.2.1. 配置Fabric基本网络环境
本示例的Fabric网络搭建包括一个排序服务节点(orderer)和三个组织(org1,org2,org3)。每个组织内含有一个节点,即共包含三个peer节点。网络环境的具体配置步骤如下所示:

  1. 创建目录
    打开虚拟机终端,输入 sudo mkdir go/src/github.com/hyperledger/fabric/cups创建一个名为cups的工作文件夹,文件夹用来保存后续生成的节点及证书等文件。文件夹名可以自己定义,本例子将文件夹命名为cups。
  2. 配置IP地址
    在hosts文件中需要配置orderer节点和peer节点的IP地址,本示例以peer节点为例,进行IP配置。打开终端,输入sudo gedit /etc/hosts 命令来打开hosts文件,在本机的peer 节点上添加整个Fabric网络所有节点的IP地址,以便于通信。如图3.22所示:

图3.22 打开hosts文件
配置IP地址的命令语句主要分为三部分,第一部分输入IP地址。第二部分根据节点角色添加,若作为orderer节点,则输入orderer;若作为peer节点则输入peer。第三部分输入各自的域名。然后点击保存即可,如图3.11所示:

图3.11 配置IP地址
3.2.2. 生成Fabric需要的证书文件
Fabric网络在启动前需要生成相关的证书。生成证书是通过cryptogen模块完成的,cryptogen模块会根据提供的配置文件生成所需要的证书。首先在cups目录下新建一个文件夹,一般命名为crypto-config,生成的证书将保存在这个文件夹中。
在生成证书时需要用到的配置文件为crypto-config.yaml,在fabric-samples文件中可以找到这个文件,将它拷贝到cups文件夹中。它对peer节点和orderer节点进行统一管理,生成公钥,私钥和证书信息。
在配置文件中,需要对排序节点进行命名,本示例命名为orderer,标明所在域为example.com,Hostname也是命名为orderer。如图3.xx所示:
图3.xx
同时,peer组织内也需要进行命名,本示例分别将三个组织命名为org1,org2,org3,域名分别为org1.example.com,org2.example.com,org3.example.com。节点数均为一个,如图3.xx所示:

图3.xx
在终端输入cryptogen generate --config=crypto-config.yaml这条命令,就可以生成Fabric所需要的证书,如图3.xx所示:

图3.xx 生成证书
在通过命令生成证书之后,crypto-config文件夹内的目录如下图3.xx所示:

图3.xx证书文件夹结构
crypto-config文件夹内包含ordererOrganization和peerOrganization两个子文件夹,分别放有orderer组织节点和peer组织节点的证书内容。本示例中设置为一个orderer节点和三个peer节点,所以orderer组织节点下存有一个orderer域名的相关证书文件夹,peer组织节点下存有三个组织域名的文件夹。
在order节点下:

  1. ca文件夹存放组织的根证书;
  2. msp文件夹内存放order管理员的证书,根域名服务器的签名证书以及TLS连接用的身份证书;
  3. orderers文件夹内存放orderer节点相关证书以及和其他节点TLS连接用的身份证书;
  4. tlsca文件夹存放TLS相关的证书和私钥;
  5. users文件夹内存放节点用户相关的证书。
    在peer节点下,以org1为例:
  6. ca文件夹
    ca文件夹中存放的是根节点签名证书。
  7. msp文件夹
    msp文件夹内存放代表该组织的身份信息。包括被根证书签名的组织管理员的身份验证证书,组织的根证书,TLS连接身份证书。
  8. peers文件夹
    peers文件夹内存放该组织下所有peer节点相关的证数。包括组织管理员的身份证书,组织根证书,当前节点的私钥,当前节点签名的数字证书,TLS连接的身份证书,组织的根证书,验证本节点签名的证书以及当前节点用来签名的私钥文件。
  9. tlsca文件夹
    tslca文件夹存放TLS相关的证书和私钥。
  10. users文件夹
    users文件夹内存放属于该组织的用户实体。包括管理员身份验证的信息,用户所属组织的根证书,用户私钥,用户的签名证书,SDK客户端使用的TLS连接通信证书,组织根证书管理员身份证书以及管理员私钥。
    3.2.3. 生成创世区块和通道
    Fabric的每一个账本都有自己的区块链,交易信息都储存在区块中,但是账本区块链的第一个区块不存储交易数据而是存储一些配置的信息,通常第一个区块就被称为创世区块。configtxgen模块专门负责生成系统的创世区块以及通道文件,同样,configtxgen模块运行时需要configtx.yaml配置文件。
    configtx.yaml文件中定义了组织和通道信息,在下载的fabric-samples文件中找到configtx.yaml配置文件,需要进行修改的是Organizations部分,将org1,org2和org3添加进去,其他的配置信息可以不进行更改,如下图所示:

图3.xx
修改完配置文件后,在终端命令行内输入命令:mkdir channel-artifacts用以创建新的文件夹 channel-artifacts 来存储生成的文件,文件夹的名称可以自己命名,但是要和之后的操作命令保持一致。如图3.xx所示:

图3.xx 创建新文件夹
继续输入命令:configtxgen- profile ThreeOrgsOrdererGenesis ‐outputBlock ./channel-artifacts/genesis.block,将生成的创世区块保存到刚才创建的channel-artifacts文件夹中,如图3.xx所示:

图3.xx 生成创世区块
同样在命令行内输入命令:configtxgen -profile ThreeOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel用以生成通道文件,如图3.xx所示:

图3.xx 生成通道文件
3.2.4. 启动orderer节点
Orderer节点负责交易的打包和区块的生成。在启动orderer节点前,先在fabric-samples文件中找到orderer.yaml 配置文件。修改文件名,与之前命名的文件夹名称保持一致即可,如图3.xx所示:

在修改完docker-orderer.yaml 配置文件后,在终端输入docker-compose -f docker-orderer.yaml up –d命令即可启动orderer节点,如图3.xx所示:

图3.xx 启动orderer节点
3.2.5. 启动peer节点
Peer节点是Fabric的核心节点,所有的交易数据经过orderer节点打包之后由peer模块存储在区块链中。和启动orderer节点的方法一样,peer节点也是采用配置文件的方式来启动,具体步骤如下:

  1. 进入到工作目录cups
    切换到peer节点的虚拟机,打开终端在命令行中输入命令:cd go/src/github.com/hyperledger/fabric/cups进入cups目录中,如图3.xx所示:

图3.xx 进入工作目录
2. 远程拷贝
在前面的操作中,已经使用命令生成了crypto-config和channel-artifacts这两个文件夹。方便起见以及避免出错,可以通过远程拷贝的方式,将orderer节点中的crypto-config和channel-artifacts目录拷贝到本机的cups文件夹下。远程拷贝通过src命令实现。
本示例中orderer节点宿主机的IP为:192.168.124.68,用户名为master,因此在终端命令行中分别输入以下命令来进行拷贝,如图3.xx所示:
scp -r master@192.168.124.68:/home/master/cups/channel-artifacts ./
scp -r master@192.168.124.68:/home/master/cups/crypto-config ./

图3.xx 远程拷贝目录
3. 关闭docker容器
在启动peer节点之前,需要先关闭docker容器,避免后续步骤出现错误。在终端中输入命令:docker rm -f $(docker ps -aq)来进行关闭docker,如图3.xx所示:

图3.xx 关闭docker
4. 修改配置文件
同样先在fabric-samples文件中找到docker-peer.yaml配置文件,修改文件的路径以及添加IP地址,如图3.xx所示:

图3.xx 修改配置文件
5. 启动peer节点
在终端输入命令:docker-compose -f docker-peer.yaml up –d用来启动peer节点,如图3.xx所示:

图3.xx 启动peer节点
启动结束后,输入命令:docker ps -a来查看是否启动成功,如图3.xx所示:

图3.xx 查看是否启动成功
3.2.6. 创建并加入通道

  1. 创建应用通道
    首先在终端命令行中输入docker exec -it cli bash命令进入到客户端容器,然后再输入peer channel create -o orderer.example.com:7050 -c mychannel -t 50s -f ./channel-artifacts/channel.tx命令来创建应用通道,如图3.xx所示:

图3.xx 创建应用通道
2. 将运行的peer节点加入通道
通道创建完毕之后,在终端输入peer channel join -b mychannel.block命令来加入到刚才创建的通道中,如图3.xx所示:

图3.xx 加入通道
3.2.7. 部署智能合约
这里我们以官网的智能合约样例模板为例,链码名为chaincode_example02,打开终端,在命令行中输入命令:peer chaincode install -n mychannel -p github.com/hyperledger/fabric/cups/chaincode/go/chaincode_example02 -v1.0即可成功安装链码,如图3.xx所示:

图3.xx 安装链码
安装完毕后,就可以对链码进行实例化和调用了。
3.2.8. 错误总结
至此,Fabric的网络环境搭建已经结束。以下是在搭建环境中遇到的一些常见错误。

  1. 启动orderer节点出现错误
    在启动orderer节点时,经常会出现如图3.xx所示的错误,提示无法连接到docker进程,它是否已在进行。

图3.xx 错误提示
主要原因是docker不是由系统服务方式启动的。解决方案如下:
首先在命令行输入:service docker start启动docker服务。生成自启动服务systemctl enable docker.service 和systemctl status docker.service。此时的服务状态为:active(running),再次启动orderer节点即可成功。
2. peer节点中ca一直退出
在启动peer节点时,最容易出现的问题就是peer节点中的ca一直莫名退出,如图3.3所示:

图3.3 莫名退出错误
这里需要去ca的文件夹中,找到自己生成的秘钥名称来更换peer节点配置文件中的名称即可,如图3.4所示:

图3.4 修改秘钥名称
点击保存之后,清空docker容器的内容,关闭docker容器后,再次启动就可以成功启动ca了,如图3.5所示ca已经成功启动了。

图3.5 成功启动ca界面

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐