网易乐得技术团队

Hyperledger fabric v1.0多机多组织网络构建

部署准备

  • 安装Docker
  • 安装Docker-compose
  • 安装Golang
  • 安装git

部署规划

  • 因考虑部署测试环境,目前只申请了三个虚拟机实例来进行区块链网络的构建(一个order节点+一个org1组织节点+一个org2组织节点),三个虚拟机环境配置保持一致,宿主机环境是Red Hat,版本为Enterprise Linux Server release 7.2。
  • 非root用户安装,注意需要有sudo的权限。
  • 部署情况如下所示。
节点标识 hostname IP 端口 所属组织
order order.lede.com 10.120.240.33 7050 ——
ca0 ca0.lede.com 10.120.240.28 7054 Org1
ca1 ca1.lede.com 10.120.240.29 7054 Org2
sp0 peer0.org1.lede.com 10.120.240.28 7051/7053 Org1
sp2 peer0.org2.lede.com 10.120.240.29 7051/7053 Org2

安装Docker

  • 可以按照官网教程,一步步进行安装。(这里我其实是选择的centos的ce版本安装的)

    • 如果虚拟机中存在旧版本Docker(最好保证在1.12版本以上)首先卸载旧版本的Docker

      1
      sudo yum remove docker docker-common docker-selinux docker-engine
    • 安装必要的依赖包

      1
      sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    • 安装docker版本

      1
      2
      3
      4
      # 1th.
      sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
      # 2th.
      sudo yum install docker-ce
    • 安装完成后,可以查看按照的版本信息

      1
      2
      $ docker --version
      docker-compose version 1.19.0, build 9e633ef
    • 启动服务

      1
      sudo service docker start
    • 设置开机启动(如果需要)

      1
      sudo chkconfig docker on

安装Docker-Compose

  • 如果服务器上没有curl则,执行下面的命令安装
1
sudo yum install curl
  • 根据docker-compose的github中指定的最新稳定版本,根据如下命令下载docker-compose,可参考官方文档。若此方法安装有问题,参见下面的安装方式
1
2
3
4
5
6
7
8
sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 测试是否按照成功
$ sudo docker-compose --version
docker-compose version 1.19.0, build 9e633ef
  • [注意] 若上述步骤下载有问题,可以根据官网提示的选择的用pip来进行安装,pip的安装也可以参见这篇文章。安装好pip之后,就可以用其按照docker-compose。
1
2
3
4
5
6
7
8
9
10
11
12
13
# 安装pip
$ sudo yum install python-pip
# 对安装好的pip进行升级(非必须)
$ sudo pip install --upgrade pip
# 安装docker-compose
$ sudo pip install docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 测试是否按照成功
$ docker-compose --version
docker-compose version 1.19.0, build 9e633ef

安装Golang

  • 参考官网中提供的Linux版本的下载链接,进行下载,建议下载最新版本即可,示例如下,最新版本为1.10。

    1
    sudo curl -O https://storage.googleapis.com/golang/go1.10.linux-amd64.tar.gz
  • 解压至/usr/local目录下

    1
    sudo tar -C /usr/local -xzf go1.10.linux-amd64.tar.gz
  • 配置GO的环境变量,可在/etc/profile下配置一个所有用户生效的环境变量,也可以在自己的$HOME/.bash_profile中配置环境变量,只针对当前用户有效。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    export PATH=$PATH:/usr/local/go/bin
    export GOPATH=/opt/gopath

    # 使配置生效
    $ source .bash_profile

    # 若上述操作没有错误,则可查看当前按照的go版本信息
    $ go version
    go version go1.10 linux/amd64

安装git

  • 直接使用yum进行安装即可
1
2
3
4
sudo yum install git
# 若安装没有错误,则可查看安装版本
$ git version
git version 2.7.4
  • 依次在部署环境的虚拟机中安装好Docker、Docker-compose、Golang及git,即完成部署前的准备工作。

部署Hyper Fabric 网络

平台二进制文件及镜像下载
  • 可参考官网上的安装步骤。在这里我们使用官方提供的命令来进行相关docker镜像及辅助工具的下载,注意这里我们并非下载的最新版本,指定的为1.0.0版本,后续可根据情况替换成最新的稳定版本即可。
1
sudo curl -sSL https://goo.gl/6wtTN5 | bash -s 1.0.0
  • 如果通过上述方法不能下载,比如提示Network is unreachable之类的,那么可以采用下面的方法下载。

    • 方法一:直接访问 https://github.com/hyperledger/fabric/blob/v1.0.0/scripts/bootstrap-1.0.0.sh 地址,然后copy脚本中的内容,自己新建一个脚本文件进行保存,再运行该脚本文件即可。
    • 方法二:从github上下载fabric的源码,在源码路径的scripts文件夹下有一个bootstrap.sh文件,运行它也是可以完成镜像及平台相关二进制文件工具的下载的。这其实是直接把fabric的源码下载下来了,和方法一是一样的(如果网速好的话,可以用这个,因为你还可以看下源码中的一些示例)

      1
      2
      3
      4
      5
      6
      # 我们把源码下载到$GOPATH目录下,在$GOPATH路径下先新建如下目录
      $ sudo mkdir -p src/github.com/hyperledger
      # 进入到创建的目录下
      $ cd $GOPATH/src/github.com/hyperledger
      # 从github上下载源代码
      sudo git clone https://github.com/hyperledger/fabric.git
  • 得到bootstrap.sh文件后,记得添加可执行权限。然后运行该脚本即可。

1
2
3
4
# 添加执行权限
$ chmod +x bootstrap.sh
# 下载平台二进制文件及1.0.0版本镜像文件,网速不好的话可能耗时较长
$ sudo sh bootstrap.sh
  • 通过上述下载后,我们在当前下载目录下会得到一个bin的文件夹,我们可以把bin的路径添加到环境变量中,方便使用。
1
2
3
4
5
$ vim $HOME/.bash_profile
# 在.bash_profile文件最后添加如下代码,替换成你自己的下载路径
export PATH=$PATH:/home/yournamexxx/bin
# 使配置生效
$ source .bash_profile
  • 我们可以通过docker的命令查看下载好的镜像有哪些
1
$ sudo docker images
  • 如果并非root用户的话,如果不想每次命令添加sudo。则可以把当前用户加入到docker组中。具体操作如下:
1
2
3
4
5
6
sudo usermod -aG dockerroot $USER
sudo usermod -aG docker $USER
#可查看是否添加成功
cat /etc/group
# 重启dokcer服务,再退出当前登录,重新登录即可。
sudo systemctl restart docker
环境测试
  • 下载fabric-samples项目并测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 进入$GOPATH/src/github.com/hyperledger目录执行下面的命令
$ sudo git clone https://github.com/hyperledger/fabric-samples.git
# 查看并切换到1.0分支
$ git branch -a
$ sudo git checkout release-1.0
# 下载完毕进入源代码目录
$ cd fabric-samples
# 把之前下载的二进制文件目录拷贝至当前目录下
$ sudo cp -r /home/xxxx/bin/ .
# 进入first-network目录下
$ cd first-network
# 运行示例代码中提供的构建脚本生成网络相关节点的证书
# 可通过./byfn.sh --help 查看所有的命令选项,注意非root用户需要添加sudo,不然会报错的
$ sudo sh byfn.sh -m generate
# 成功执行完毕上述命令,则会在当前目录下生成一个crypto-config文件夹,里面包含了所以的网络节点和组织相关证书和密钥。另外在channel-artifacts目录下会生成默认的通道及创世区块、两个组织的锚节点配置文件,则都是后面启动网络所必须的。
# 开始启动单机双组织双节点网络,并测试网络是否正常,仍然通过提供的脚本自动化实现。
$ ./byfn.sh -m up
  • 根据上述步骤最后启动完网络后,一切正常则会输出如下信息,则表示整个区块链测试网络就没有问题了。
    image
  • 我们查看服务器上启动的docker容器如下所示:
1
$docker ps

image

  • 我们可以查看各容器的日志记录,通过对日志的分析也可以看出整个网络执行的流程,对源码的学习也是很有帮助的
1
2
# eg: docker logs -f orderer.example.com
$ docker logs -f container_name
  • 若需要停止网络则可运行以下命令,则会停止所有的服务,并删除相关生成的节点或组织证书/秘钥等,方便下次环境的启动。
    1
    $ sudo ./byfn.sh -m down
多机网络部署
  • 上面是针对单机双组织单节点的配置。因为我们需要测试多机情况,所以按照文档最开始的部署规划我们开始进行各节点的部署。
  • [注意] 部署环境除非你特别了解相关配置信息,否则建议你每个节点安装在不同的虚拟机上,主要是保证宿主虚拟机和docker的端口映射一致。比如说单机部署的时候,我们的peer节点会映射7051:7051、8051:7051、9051:7051这样的,但在多机部署的时候,建议都使用7051:7051的端口映射,相信我,可以避免很多坑。。。
  • 多机网络的部署还是参照的1.0版本的fabric-samples工程中的first-network示例,可能更新的版本(比如目前最新版本1.1)部署方式会略有不同,大家搭建环境时注意看下。
  • 与first-network中示例不同之处:
    • 多服务器部署
    • 每个组织节点只有一个实例节点
    • 替换域名example.com为lede.com
    • 替换了对应的端口映射,保持宿主机与docker容器端口一致
  • 因为我们已经有过单机部署网络的经验,对主要的配置在此不再赘述。
  • 参照我目前实际的部署情况,整个网络部署的思路大致如下:
    • 在三台虚拟机上分别验证并保证单机部署网络成功,测试通过后把环境清理干净(切记)
    • 在其中一台节点先根据first-network拷贝一份lede-network,接下来的所以变更均在lede-network文件夹中进行
    • 相关上述提到的不同之处(注意仔细核对是否修改有误,避免来回折腾环境)
    • 利用./byfn.sh -m generate生成组件和节点证书、秘钥、通道配置相关的初始配置信息
    • 然后把修改好的lede-network打包分发到其余两台虚拟机上。
    • 再分别启动order节点、sp0节点、sp2节点。
    • 再进入cli容器内部,调用script.sh脚本执行通道创建、节点加入。链码安装、初始化、交易、查询等操作,验证网络是否构建成功。
  • 按照上述思路整理完毕的lede-network整体的目录结构如下所示,其中docker-compose-orderer.yaml、docker-compose-peer0.yaml、docker-compose-peer1.yaml为我们最终分别在三条虚拟机上启动服务的文件。下面我们主要看下这三个配置文件,将某些重要的地方再补充说明下。


    image
docker-compose-orderer.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: '2'

volumes:
orderer.lede.com:

networks:
byfn:
services:
orderer.lede.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.lede.com
container_name: orderer.lede.com
networks:
- byfn
  • 共识类型使用的是SOLO,这个是单独启动的,详细的服务配置存在在docker-compose-base.yaml文件中。
docker-compose-peer0.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
version: '2'

volumes:
peer0.org1.lede.com:

networks:
byfn:
services:
ca0:
image: hyperledger/fabric-ca:$IMAGE_TAG
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org1
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.lede.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/5b285696774f8b48ad30cf4913e90f42b0ae5250e6cf55c048baa3e7d8fbad4e_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.lede.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/5b285696774f8b48ad30cf4913e90f42b0ae5250e6cf55c048baa3e7d8fbad4e_sk -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org1.lede.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg1
extra_hosts:
- "orderer.lede.com:10.120.240.33"
- "peer0.org1.lede.com:10.120.240.28"
- "peer0.org2.lede.com:10.120.240.29"
networks:
- byfn

peer0.org1.lede.com:
container_name: peer0.org1.lede.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.lede.com
extra_hosts:
- "orderer.lede.com:10.120.240.33"
- "peer0.org1.lede.com:10.120.240.28"
- "peer0.org2.lede.com:10.120.240.29"
networks:
- byfn

cli:
container_name: cli
image: hyperledger/fabric-tools:$IMAGE_TAG
tty: true
dns_search: .
environment:
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_LOGGING_LEVEL=DEBUG
- CORE_PEER_ID=cli
- CORE_PEER_ADDRESS=peer0.org1.lede.com:7051
- CORE_PEER_LOCALMSPID=Org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lede.com/peers/peer0.org1.lede.com/tls/server.crt
- CORE_PEER_TLS_KEY_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lede.com/peers/peer0.org1.lede.com/tls/server.key
- CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lede.com/peers/peer0.org1.lede.com/tls/ca.crt
- CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.lede.com/users/Admin@org1.lede.com/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
volumes:
- /var/run/:/host/var/run/
- ./../chaincode/:/opt/gopath/src/github.com/hyperledger/fabric/ledes/chaincode/go
- ./crypto-config:/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/
- ./scripts:/opt/gopath/src/github.com/hyperledger/fabric/peer/scripts/
- ./channel-artifacts:/opt/gopath/src/github.com/hyperledger/fabric/peer/channel-artifacts
extra_hosts:
- "orderer.lede.com:10.120.240.33"
- "peer0.org1.lede.com:10.120.240.28"
- "peer0.org2.lede.com:10.120.240.29"
depends_on:
- peer0.org1.lede.com
networks:
- byfn
  • 通过上面的配置文件可以看到,按部署规划是在10.120.240.28服务器上启动org1组织的节点以及一个组织对应的ca认证节点,在这里还启动了一个cli容器,作为通道创建及链码安装测试的入口。
  • 注意ca0服务中的tls秘钥是实际通过./byfn.sh -m generate生成的相关秘钥信息,实际是拷贝的docker-compose-e2e.yaml中的对应信息。这个文件是通过generate命令根据docker-compose-e2e-template模板文件生成的。
  • 主要配置下各服务容器中的hosts信息,通过设置extra_hosts:即可实现。
docker-compose-peer1.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
version: '2'

volumes:
peer0.org2.lede.com:

networks:
byfn:
services:
ca1:
image: hyperledger/fabric-ca:$IMAGE_TAG
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=ca-org2
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.lede.com-cert.pem
- FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/2df5e223bf0f2086a9444d15c6e4a3a09a906b3aa5a1a962c64e039c8660dbf8_sk
ports:
- "7054:7054"
command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.lede.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/2df5e223bf0f2086a9444d15c6e4a3a09a906b3aa5a1a962c64e039c8660dbf8_sk -b admin:adminpw -d'
volumes:
- ./crypto-config/peerOrganizations/org2.lede.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca_peerOrg2
extra_hosts:
- "orderer.lede.com:10.120.240.33"
- "peer0.org1.lede.com:10.120.240.28"
- "peer0.org2.lede.com:10.120.240.29"
networks:
- byfn

peer0.org2.lede.com:
container_name: peer0.org2.lede.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org2.lede.com
extra_hosts:
- "orderer.lede.com:10.120.240.33"
- "peer0.org1.lede.com:10.120.240.28"
- "peer0.org2.lede.com:10.120.240.29"
networks:
- byfn
  • 这一部分和上述的sp0/ca0的配置类似,只是部署在不同的服务器上,可参考上述的配置过程。
启动环境
  • 启动order节点
1
2
3
4
5
# 把lede-network放置在fabric-sample目录下(10.120.240.33服务器)
$ cd lede-network
$ docker-compose -f docker-compose-orderer.yaml up -d
# 启动完毕可查看启动日志
$ docker logs -f orderer.lede.com
  • 启动sp0/ca0/cli节点
1
2
3
4
5
# 把lede-network放置在fabric-sample目录下(10.120.240.28服务器)
$ cd lede-network
$ docker-compose -f docker-compose-peer0.yaml up -d
# 启动完毕可查看启动日志
$ docker logs -f peer0.org1.lede.com
  • 启动sp0/ca0/cli节点
1
2
3
4
5
# 把lede-network放置在fabric-sample目录下(10.120.240.29服务器)
$ cd lede-network
$ docker-compose -f docker-compose-peer1.yaml up -d
# 启动完毕可查看启动日志
$ docker logs -f peer0.org2.lede.com
  • 运行初始化脚本(10.120.240.28服务器)
1
2
3
$ docker exec -it cli bash
# 执行成功则会发现已进入cli容器。因为我们已经设置了工作目录,相关脚本已经放在了工作目录下。直接执行脚本程序即可,注意,因为我们每个组织只有一个节点,对应的需要修改示例代码中的script.sh中的一些信息。
root@265f891231cc:/opt/gopath/src/github.com/hyperledger/fabric/peer# ./scripts/script.sh mychannel
多机多组织多节点的部署
  • 上述的配置只有两个组织及其对应的单个节点,在实际生产环境中可能需要组织中配置多个节点,参考上述的配置也不难实现,后续的版本中提供了更加方便的动态增加组织和节点的实例,大家可以关注下。
部署代码
  • 代码已放在github上,需要的可以直接查看这里