Total Pageviews

Tuesday, 15 October 2019

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 的配置文件中,修改以下配置:
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 文件,添加以下内容:
{
  "registry-mirrors": ["你的加速器地址"]
}
重启 docker:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

获取 fabric 镜像

这里获取 fabric 官方的镜像:
$ 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 模板文件:
$ git clone https://github.com/yeasy/docker-compose-files
进入 hyperledger/0.6/pbft 目录,以启动 4 个 PBFT 认证节点 + 1 个 CA 节点为例,启动集群:
$ docker-compose -f 4-peers-with-membersrvc.yml up

把链码复制到认证节点中

集群中 VP0 是 Root VP 节点,进入 VP0,可以看到 fabric 路径:
$ docker exec -it pbft_vp0_1 bash
root@vp0:/opt/gopath/src/github.com/hyperledger/fabric#
以示例 02 为例,把链码复制到 VP0 节点:
$ docker cp chaincode_example02/ pbft_vp0_1:/opt/gopath/src/github.com/

通过 REST API 部署链码

注册账户登录:
POST http://127.0.0.1:7050/registrar

{
  "enrollId": "jim",
  "enrollSecret": "6avZQLwcUe9b"
}
登录响应:
{
  "OK": "Login successful for user 'jim'."
}
部署链码:
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
}
部署响应:
{
  "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 节点,自行编译链码.