目录
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 参考文献
说在前面:本文为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管理工具,所以很显然需要提前安装这几种组件。下面开始具体的安装过程介绍。
注意:
1)以下过程都是在一台虚机上操作,环境搭建好之后会根据这台克隆出另外两台,如果你没有KVM环境,我也建议在一台机器上安装成功后在另外的机器上进行安装。
2)安装过程使用的用户不需要是root账户,而且不要随便切换为root用户进行操作,但是有的过程需要root权限,sudo进行即可。如果使用root账户也是可以的但是不推荐这么做,容易操作失误很不安全。
3)本文搭建的fabric集群是最简单的集群没有使用kafka共识机制。
sudo apt-get install golang-go
运行go version, 看到如下输出说明安装成功:
go version go1.6.2 linux/amd64
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权限
sudo groupadd –g 999 docker
sudo usermod -aG docker dutoe
dutoe为我的用户名,根据实际情况修改。
运行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
执行如下命令安装docker-compose,如果你没安装pip,预先执行:
sudo apt-get install python-pip
然后:
pip install docker-compose
运行命令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
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会看到如下结果:
3)建立网络
cd /fabric/examples/e2e_cli
sudo ./network_setup.sh up
最后会看到如下结果:
运行docker ps 命令会看到如下结果:
4)停止网络
运行sudo ./network_setup down
此命令会删除相关的容器和相关的文件夹包括channel-artifacts和crypto-config,这两个文件夹分别存储channel配置文件、创世块等,证书文件等。两个目录的具体内容如下所示:
至此,单机版搭建完成,接下来克隆两台虚机搭建集群。
本人共有三台虚拟机,每台的基本环境和上面的搭建过程一致。下面介绍如何利用三台虚拟机搭建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通说明主机通信配置成功。
注意:由于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容器)
下面对几个重要配置项进行解释:
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,其内容如下:
以下操作在fabric-node3上进行
首先复制一份模板文件
sudo cp docker-compose-cli.yaml docker-compose-orderer.yaml
修改docker-compose-orderer.yaml,其内容如下:
orderer节点可以不配置extra_hosts项。
首先在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步骤同上,不在赘述。
停止集群可以通过以下两种方式:
第一种通过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
虽然官方提供了案例的完整脚本存放在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目录,里面是证书文件。其内容如下:
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"]}'
12)在node1查询:
13)在node2查询:
自此,整个案例就结束了。本文为笔者用了三个小时仓促整理有错误之处还望批评指正。
对于常见错误请参考:
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问题,也可以通过这个方法解决。
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/