Hyperledger fabric1.2集群搭建

 

目录

1基础环境介绍

2单机配置过程

2.1安装go

2.1.1安装go

2.1.2验证

2.2安装docker

2.2.1安装docker

2.2.2 验证

2.3安装docker-compose

2.3.1安装docker-compose

2.3.2 验证

2.4安装fabric

3 fabric集群搭建

3.1 主机规划

3.2配置peer启动文件

3.3配置orderer的启动文件

3.4启动网络

3.5停止集群

3.6集群案例测试

4 常见错误

5 参考文献


1基础环境介绍

说在前面:本文为Hyperledger fabric1.2集群搭建教程,在开始下面的搭建过程前需要您具备一定的理论知识,掌握相关的概念如genesis block, orderer, peer, organization等等,建议首先阅读官网,在充分了解相关概念后可以尝试搭建单机版。(其实要想快速的搭建单机版可以参考本文第二部分,但是并不有助于您理解区块链技术。)另外笔者会在文末附上几篇比较好的中文参考资料。文中提到的官网链接如下:

https://hyperledger-fabric.readthedocs.io/en/latest/key_concepts.html

https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html

由于物理机有限,本人采用虚拟机搭建fabric集群。虚拟机的管理环境为KVM,采用KVM可以方便的创建、删除以及克隆虚拟机。搭建fabric集群的整体思路为首先在一台虚拟机上配置好基础环境然后直接克隆两台虚拟机。我的系统为ubuntu 16.04 LTS,每台虚机的内存分配为8GB,磁盘为20GB。

fabric技术主要依赖的组件有go, docker, docker-compose,所以需要首先安装这些组件,然后在安装fabric源码。下面简单介绍一下上面几种技术的关系,首先Fabric是用go开发的,Fabric的节点是封装在docker中,docker-compose是docker管理工具,所以很显然需要提前安装这几种组件。下面开始具体的安装过程介绍。

2单机配置过程

注意:

1)以下过程都是在一台虚机上操作,环境搭建好之后会根据这台克隆出另外两台,如果你没有KVM环境,我也建议在一台机器上安装成功后在另外的机器上进行安装。

2)安装过程使用的用户不需要是root账户,而且不要随便切换为root用户进行操作,但是有的过程需要root权限,sudo进行即可。如果使用root账户也是可以的但是不推荐这么做,容易操作失误很不安全。

3)本文搭建的fabric集群是最简单的集群没有使用kafka共识机制。

2.1安装go

2.1.1安装go

sudo apt-get install golang-go

2.1.2验证

运行go version, 看到如下输出说明安装成功:

go version go1.6.2 linux/amd64

2.2安装docker

2.2.1安装docker

1)由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:

sudo apt-get remove docker docker-engine docker-ce docker.io

2)更新apt包索引:

sudo apt-get update

3)安装以下包以使apt可以通过HTTPS使用存储库(repository):

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

4)添加docker官方的GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

5)使用下面的命令来设置stable存储库:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

6)再更新一下apt包索引:

sudo apt-get update

7)安装最新版本的docker ce:ce代表community edition(社区版)

sudo apt-get install -y docker-ce

8)安装完成之后,需要将当前用户添加到docker用户组,然后为该用户添加sudo权限

  • 若没有创建docker用户组,可以使用如下命令创建一个GID为999,组名为docker的用户组

sudo groupadd –g 999 docker

  • 将当前用户(ubuntu)添加到docker用户组并分配sudo权限

sudo usermod -aG docker dutoe

dutoe为我的用户名,根据实际情况修改。

2.2.2 验证

运行docker version,会看到如下输出:

Client: Docker Engine - Community

 Version:           19.03.1

 API version:       1.40

 Go version:        go1.12.5

 Git commit:        74b1e89e8a

 Built:             Thu Jul 25 21:21:35 2019

 OS/Arch:           linux/amd64

 Experimental:      false

 

Server: Docker Engine - Community

 Engine:

  Version:          19.03.1

  API version:      1.40 (minimum version 1.12)

  Go version:       go1.12.5

  Git commit:       74b1e89e8a

  Built:            Thu Jul 25 21:20:09 2019

  OS/Arch:          linux/amd64

  Experimental:     false

 containerd:

  Version:          1.2.6

  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb

 runc:

  Version:          1.0.0-rc8

  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f

 docker-init:

  Version:          0.18.0

  GitCommit:        fec3683

2.3安装docker-compose

2.3.1安装docker-compose

执行如下命令安装docker-compose,如果你没安装pip,预先执行:

sudo apt-get install python-pip

然后:

pip install docker-compose

2.3.2 验证

运行命令docke-compose version会看到如下输出:

docker-compose version 1.24.1, build 4667896

docker-py version: 3.7.3

CPython version: 2.7.12

OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016

2.4安装fabric

1)创建源码文件夹并下载源码

sudo mkdir /opt/gopath/src/github.com/hyperledgercd hyperledger

cd /opt/gopath/src/github.com/hyperledgercd hyperledger

git clone https://github.com/hyperledger/fabric.git branch v1.2.0

我这里下载的是v1.2.0版本,这里说一下,各个版本的区别,首先通过本人实验发现1.2.0及以后的版本是比较稳定的,其次1.2.0有e2e_cli官方案例之后的版本没有。

2)下载镜像

sudo ./fabric/scripts/bootstrap.sh

此命令会下载需要的docker镜像,下载过程缓慢请耐心等待,然后运行docker images会看到如下结果:

Hyperledger fabric1.2集群搭建_第1张图片

3)建立网络

  cd /fabric/examples/e2e_cli

sudo ./network_setup.sh up

最后会看到如下结果:

 

运行docker ps 命令会看到如下结果:

Hyperledger fabric1.2集群搭建_第2张图片

4)停止网络

运行sudo ./network_setup down

此命令会删除相关的容器和相关的文件夹包括channel-artifacts和crypto-config,这两个文件夹分别存储channel配置文件、创世块等,证书文件等。两个目录的具体内容如下所示:

Hyperledger fabric1.2集群搭建_第3张图片

 

至此,单机版搭建完成,接下来克隆两台虚机搭建集群。

3 fabric集群搭建

3.1 主机规划

本人共有三台虚拟机,每台的基本环境和上面的搭建过程一致。下面介绍如何利用三台虚拟机搭建fabric集群。

hostname

ip

功能分配

fabric-node1

192.168.1.9

peer0.org1.example.com

peer1.org1.example.com

cli

fabric-node2

192.168.1.10

peer0.org2.example.com

peer1.org2.example.com

cli

fabric-node3

192.168.1.11

orderer.example.com

说明:为了简便说明搭建过程,笔者是直接在官方案例基础上进行配置,为了降低风险和出错概率没有修改案例的peer的个数,所以node1和node2两台机器上有两个peer。)

下面贴出我的/etc/hosts的内容(注意:其中kafka和zookeeper的内容可以忽略,本教程中没有使用kafka共识机制,是笔者为后续搭建留用。)

在配置完hosts表后,如果各个主机之间可以ping通说明主机通信配置成功。

Hyperledger fabric1.2集群搭建_第4张图片

3.2配置peer启动文件

注意:由于1.2.0版本的e2e_cli案例使用了kafka共识机制,现在我们切换到目录:

cd /opt/gopath/src/github.com/hyperledger/fabric/fabric-samples/first-network,以下操作都是在这个目录当中进行。

1)org1的peer配置

首先复制一份模板文件

sudo cp docker-compose-cli.yaml docker-compose-peer.yaml(yaml是一种配置文件,用于docker容器)

Hyperledger fabric1.2集群搭建_第5张图片

Hyperledger fabric1.2集群搭建_第6张图片

下面对几个重要配置项进行解释:

extra_hosts:是用于各个节点通信的关键配置,你会注意到peer0当中extra_hosts只有orderer节点,而peer1当中除了orderer还有peer0,因为peer0是锚节点。

volumes:是容器的一种将主机的目录挂载到容器的目录的机制。所以你会看到volumes的配置项有:分割的前后两个部分,其含义就是将前面的主机目录挂载到后面的容器目录。

2)org2的peer配置

以下操作是在fabric-node2上进行。

首先复制一份模板文件:

sudo cp docker-compose-cli.yaml docker-compose-peer.yaml

修改docker-compose-peer.yaml,其内容如下:

Hyperledger fabric1.2集群搭建_第7张图片

Hyperledger fabric1.2集群搭建_第8张图片

3.3配置orderer的启动文件

以下操作在fabric-node3上进行

首先复制一份模板文件

sudo cp docker-compose-cli.yaml docker-compose-orderer.yaml

修改docker-compose-orderer.yaml,其内容如下:

Hyperledger fabric1.2集群搭建_第9张图片

orderer节点可以不配置extra_hosts项。

 

3.4启动网络

首先在fabric-node3上启动orderer服务:

docker-compose -f docker-compose-orderer.yaml up

输出信息很多包括如下creating信息:

 

不报错情况下运行docker ps会看到如下输出:

然后在fabric-node1上启动peer:

docker-compose -f docker-compose-peer.yaml up

最后会停留在如下界面:

运行docker ps会看到如下信息:

在fabric-node2上启动peer步骤同上,不在赘述。

3.5停止集群

停止集群可以通过以下两种方式:

第一种通过docker命令:

docker stop $(docker ps -q)

docker rm $(docker ps -aq);docker volume prune

首先在每台虚机上停止所有的容器,如第一条命令,然后删除容器和卷。

第二种通过docker-compose方式:

docker-compose -f docker-compose-peer.yaml down –volumes

docker-compose -f docker-compose-orderer.yaml down –volumes

3.6集群案例测试

虽然官方提供了案例的完整脚本存放在script/script.sh,但是它是单机环境的,集群情况下不能顺利运行。所以以下步骤全部手动执行。

注意当前目录为

fabric-node1:

/opt/gopath/src/github.com/hyperledger/fabric/fabric-samples/first-network

1)第一步生成证书。

./bin/cryptogen generate --config=./crypto-config.yaml

注意:你的目录下可能没有bin,它是在 fabric下release/linux-amd64/bin/,我把它复制到了当前目录。cryptogen是官方提供的用于生成证书的工具。执行完以上命令在当前目录会生成crypto-config目录,里面是证书文件。其内容如下:

Hyperledger fabric1.2集群搭建_第10张图片

 

2)第二步生成创世块

./bin/configtxgen -profile TwoOrgsOrdererGenesis  -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block

3)第三步生成channel配置文件

./bin/configtxgen -profile TwoOrgsChannel -channelID mychannel -outputCreateChannelTx ./channel-artifacts/channel.tx

输出信息如下:

 

4)生成anchor配置文件

./bin/configtxgen -profile TwoOrgsChannel -channelID mychannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -asOrg Org1MSP

./bin/configtxgen -profile TwoOrgsChannel -channelID mychannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -asOrg Org2MSP

在运行3、4、5三步之后在当前的目录下会生成channel-artifacts目录里面的内容如下

注意在执行完4、5两步骤之后需要将生成的两个目录分别复制到另外两台虚机上。例把crypto-config复制到node3上。

scp -r crypto-config root@fabric-node3:/opt/gopath/src/github.com/hyperledger/fabric/fabric-samples/first-network

 

5)创建channel

首先需要重新启动集群,并进入cli容器:

docker exec -it cli bash

然后运行:

peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/channel.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

6)将peer加入channel

peer channel join -b mychannel.block

7)更新锚节点

peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org1MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

peer channel update -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/Org2MSPanchors.tx --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

注意:这两个命令分别在node1和node2上执行。都执行完之后在进行下一步。

8)安装链码

peer chaincode install -n con0201 -v 1.0 -p github.com/hyperledger/fabric/examples/chaincode/go/example02/cmd

输出信息如下:

注意:这两个命令分别在node1和node2上执行。都执行完之后在进行下一步。

在node2上运行此命令报错没有genesis.block,需要运行如下命令将genesis.block取来:

peer channel fetch 0 mychannel.block -o orderer.example.com:7050 -c mychannel --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem

然后就可以运行了。

9)实例化

peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n con0201 -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -P "OR    ('Org1MSP.member','Org2MSP.member')"

10)交易查询

peer chaincode query -C mychannel -n con0201 -c '{"Args":["query","a"]}'

11)交易转账

peer chaincode invoke --tls --cafile/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n con0201 -c '{"Args":["invoke","a","b","10"]}'

 

Hyperledger fabric1.2集群搭建_第11张图片

12)在node1查询:

13)在node2查询:

Hyperledger fabric1.2集群搭建_第12张图片

自此,整个案例就结束了。本文为笔者用了三个小时仓促整理有错误之处还望批评指正。

4 常见错误

对于常见错误请参考:

https://stackoverflow.com/questions/45726536/peer-channel-creation-fails-in-hyperledger-fabric

https://stackoverflow.com/questions/54716671/failed-to-reach-implicit-threshold-of-1-sub-policies-required-1-remaining-perm

其中最常见错误为证书问题,包括Error: Got unexpected status: BAD_REQUEST -- Error authorizing update: Error validating DeltaSet: Policy for [Groups] /Channel/Application not satisfied: Failed to reach implicit threshold of 1 sub-policies, required 1 remaining

其原因是你重新生成证书,而你开启了原来的容器,解决方法是按照步骤3.5停止网络。

还有其它例如版本version 0/version 1问题,也可以通过这个方法解决。

 

5 参考文献

https://www.cnblogs.com/aberic/p/7541470.html

https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html

http://www.taohui.pub/2018/05/26/%E5%8C%BA%E5%9D%97%E9%93%BE%E5%BC%80%E6%BA%90%E5%AE%9E%E7%8E%B0hyperledger-fabric%E6%9E%B6%E6%9E%84%E8%AF%A6%E8%A7%A3/

你可能感兴趣的:(区块链)