G2EX

Fabric 多节点部署小结

0x00 说明

上篇文章《Fabric 单节点部署与链码测试》中,总结了单认证节点的 fabric 区块链网络的部署和测试。在 fabric 中,单认证节点的网络不使用共识算法,主要用于测试和调试链码。在实际应用场景的 demo 中,有必要使用多节点进行演示,节点之间使用的是推荐的 PBFT 共识算法。

Fabric 目前尚未发布 1.0 正式版。本文仍然基于 Ubuntu 平台,使用 fabric 的 0.6 版本 docker 镜像,部署有 4 个认证节点的区块链网络。(参考《区块链技术指南》)

0x01 获取 Docker 镜像

参照《Fabric 单节点部署与链码测试》安装 docker 和 docker-compose。

配置 docker

Docker 安装完成后需要进行配置。需要注意的是,Ubuntu 14.04 和 16.04 中,docker 的配置文件不同。

Ubuntu 14.04 中,配置文件位于 /etc/default/docker,Ubuntu 16.04 中,配置文件位于 /etc/systemd/system/docker.service.d/override.conf 中(如果配置文件不存在则创建)。

在 docker 的配置文件中,修改以下配置:

1
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"

加速 docker 镜像

因为网络原因,直接从 docker 官方下载速度缓慢,或时而中断。阿里云容器 Hub 服务提供了加速功能。登录阿里云容器 Hub 服务,在加速器一栏中获取自己的加速器地址。

docker-accelerator

参照阿里云操作文档,修改 docker 的配置。

本文使用的是 Ubuntu 16.04,docker 版本为 1.13,修改方法如下。

创建 /etc/docker/daemon.json 文件,添加以下内容:

1
2
3
{
"registry-mirrors": ["你的加速器地址"]
}

重启 docker:

1
2
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

获取 fabric 镜像

这里获取 fabric 官方的镜像:

1
2
3
4
5
6
$ docker pull hyperledger/fabric-peer:x86_64-0.6.1-preview \
&& docker pull hyperledger/fabric-membersrvc:x86_64-0.6.1-preview \
&& docker pull yeasy/blockchain-explorer:latest \
&& docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-peer \
&& docker tag hyperledger/fabric-peer:x86_64-0.6.1-preview hyperledger/fabric-baseimage \
&& docker tag hyperledger/fabric-membersrvc:x86_64-0.6.1-preview hyperledger/fabric-membersrvc

0x02 启动集群并部署

使用 docker-compse 启动集群

使用 docker-compose 更方便的启动多容器节点,下载 Compose 模板文件:

1
$ git clone https://github.com/yeasy/docker-compose-files

进入 hyperledger/0.6/pbft 目录,以启动 4 个 PBFT 认证节点 + 1 个 CA 节点为例,启动集群:

1
$ docker-compose -f 4-peers-with-membersrvc.yml up

把链码复制到认证节点中

集群中 VP0 是 Root VP 节点,进入 VP0,可以看到 fabric 路径:

1
2
$ docker exec -it pbft_vp0_1 bash
root@vp0:/opt/gopath/src/github.com/hyperledger/fabric#

以示例 02 为例,把链码复制到 VP0 节点:

1
$ docker cp chaincode_example02/ pbft_vp0_1:/opt/gopath/src/github.com/

通过 REST API 部署链码

注册账户登录:

1
2
3
4
5
6
POST http://127.0.0.1:7050/registrar
{
"enrollId": "jim",
"enrollSecret": "6avZQLwcUe9b"
}

登录响应:

1
2
3
{
"OK": "Login successful for user 'jim'."
}

部署链码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
POST http://127.0.0.1:7050/chaincode
{
"jsonrpc": "2.0",
"method": "deploy",
"params": {
"type": 1,
"chaincodeID":{
"path": "github.com/chaincode_example02"
},
"ctorMsg": {
"args":["init"]
},
"secureContext": "jim"
},
"id": 1
}

部署响应:

1
2
3
4
5
6
7
8
{
"jsonrpc": "2.0",
"result": {
"status": "OK",
"message": "28a49ca95eb0e0dbf3ee7e41ff2172c174b13aa1539db3c4977bb0b7a78d26cb4a0ea26252358ddc184f8d44172af1284dc3f914caa13ccd2137611c70059b59"
},
"id": 1
}

记下 message 字段,在后续调用、查询链码的时候填入 name 字段。

0x03 总结

这种部署方法与单 VP 节点节点中编译运行部署差别:

  1. REST API 部署的 JSON 数据 chaincodeID 字段不同,这里为 path,是链码在容器中的路径;单 VP 节点部署时 chaincodeID 内字段为 name,是链码编译后的可执行文件名;
  2. 单 VP 节点部署是为了调试链码,做法是把链码复制到 VP 节点中并编译,通过 CORE_CHAINCODE_ID_NAME=mycc CORE_PEER_ADDRESS=0.0.0.0:7051 ./chaincode_example02 命令运行链码,在终端中查看调试信息,使用 REST API 完成部署操作;本文是把链码复制到 Root VP 节点中,使用 REST API 部署时广播到区块链网络中所有 VP 节点,自行编译链码。