HyperLedger Fabric:单机极简部署
这是 Fabric 文档 Building Your First Network 中提供的做法。Fabric 的示例文件中提供了 一个名为 “byfn.sh” 的脚本 ,这个脚本用 Docker 在本地搭建了一套 Fabric。
用 byfn 搭建的 Fabric 非常不实用,只适合用来学习,但是我发现很多人起步时都采用的这种方式。并且当我们只需要一个简单的 Fabric 环境进行简单验证时,用 byfn 创建比较方便。
实际应用必须采用多节点的方式部署,多节点部署可以参考历史文章:
准备依赖的软件
第一,安装 docker。要掌握用 byfn 搭建 fabric 的方法,必须要对 docker 有基本的了解,到 Docker使用手册 中学习。
第二,安装 git。git 是现在最常用的代码管理工具,我们要用 git 从 github 中拉取 fabric-sample 文件,可以参考 Git使用手册,这里只用 git 获取代码,不需要掌握代码提交、合并等用法,虽然在以后的工作中一定会遇到。
$ yum install -y git # CentOS 系统上
$ apt-get install -y git # Ubuntu 系统上
$ brew install -y git # Mac 系统上
下载 Fabric 文件
先创建一个工作目录,文件都存放在这个目录中:
$ mkdir ~/hyperledger-fabric-1.4.4
$ cd ~/hyperledger-fabric-1.4.4
下载 fabric 文件。fabric 每个版本的 release 文件都发布在 fabric releases 上:
我使用的是 Mac 系统,下载的是 hyperledger-fabric-darwin-amd64-1.4.4.tar.gz:
$ wget https://github.com/hyperledger/fabric/releases/download/v1.4.4/hyperledger-fabric-darwin-amd64-1.4.4.tar.gz
这个下载过程可能很慢,可能需要翻qiang。
下载 byfn 系列脚本:
$ git clone https://github.com/hyperledger/fabric-samples.git
$ cd fabric-samples
$ git checkout -b v1.4.4 # 根据需要切换到对应版本
下载解压后得到 bin 和 config 两个目录,bin 目录中是 fabric 的命令文件,config 中 fabric 的配置示例:
$ tar -xvf hyperledger-fabric-darwin-amd64-1.4.4.tar.gz
$ ls
bin config
把 bin 目录添加到环境变量 PATH:
export PATH=$PATH:~/hyperledger-fabric-1.4.4/bin
准备 first-network 需要的证书和文件
first-network 就是一个最简单 fabric,它的部署文件位于 fabric-samples/first-network:
$ cd fabric-samples/first-network
进入该目录后,用 byfn.sh 创建 first-network 需要的证书文件:
$ ./byfn.sh generate
如果提示错误,"cryptogen tool not found. exiting",那是因为没有把 bin 目录添加到环境变量 PATH 中:
$ ./byfn.sh generate
Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
cryptogen tool not found. exiting # 如果没有把 bin 目录添加到环境变量 PATH 就会遇到这个问题!
执行成功的结果如下。
注意 ## 中的文字,“Generate certificates ...”,这就是为相应组织或者模块生成了证书。
first-network 是由 Org1 和 Org2 两个成员组成的区块链网络,网络中有一个 Orderer,Org1 有两个 Peer,Org2 有两个 Peer:
➜ first-network git:(v1.4.4) ./byfn.sh generate
Generating certs and genesis block for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
/Users/lijiao/hyperledger-fabric-1.4.4/bin/cryptogen
##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
+ cryptogen generate --config=./crypto-config.yaml
org1.example.com
org2.example.com
+ res=0
+ set +x
Generate CCP files for Org1 and Org2
/Users/lijiao/hyperledger-fabric-1.4.4/bin/configtxgen
##########################################################
######### Generating Orderer Genesis block ##############
##########################################################
CONSENSUS_TYPE=solo
+ '[' solo == solo ']'
+ configtxgen -profile TwoOrgsOrdererGenesis -channelID byfn-sys-channel -outputBlock ./channel-artifacts/genesis.block
2019-11-26 22:23:26.404 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2019-11-26 22:23:26.527 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 002 orderer type: solo
2019-11-26 22:23:26.527 CST [common.tools.configtxgen.localconfig] Load -> INFO 003 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:26.638 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 004 orderer type: solo
2019-11-26 22:23:26.638 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 005 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:26.643 CST [common.tools.configtxgen] doOutputBlock -> INFO 006 Generating genesis block
2019-11-26 22:23:26.644 CST [common.tools.configtxgen] doOutputBlock -> INFO 007 Writing genesis block
+ res=0
+ set +x
#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
2019-11-26 22:23:26.686 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2019-11-26 22:23:26.794 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:26.899 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
2019-11-26 22:23:26.899 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:26.899 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 005 Generating new channel configtx
2019-11-26 22:23:26.905 CST [common.tools.configtxgen] doOutputChannelCreateTx -> INFO 006 Writing new channel tx
+ res=0
+ set +x
#################################################################
####### Generating anchor peer update for Org1MSP ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP
2019-11-26 22:23:26.943 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2019-11-26 22:23:27.049 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:27.165 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
2019-11-26 22:23:27.165 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:27.165 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update
2019-11-26 22:23:27.166 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update
+ res=0
+ set +x
#################################################################
####### Generating anchor peer update for Org2MSP ##########
#################################################################
+ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID mychannel -asOrg Org2MSP
2019-11-26 22:23:27.206 CST [common.tools.configtxgen] main -> INFO 001 Loading configuration
2019-11-26 22:23:27.347 CST [common.tools.configtxgen.localconfig] Load -> INFO 002 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:27.473 CST [common.tools.configtxgen.localconfig] completeInitialization -> INFO 003 orderer type: solo
2019-11-26 22:23:27.473 CST [common.tools.configtxgen.localconfig] LoadTopLevel -> INFO 004 Loaded configuration: /Users/lijiao/hyperledger-fabric-1.4.4/fabric-samples/first-network/configtx.yaml
2019-11-26 22:23:27.473 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 005 Generating anchor peer update
2019-11-26 22:23:27.474 CST [common.tools.configtxgen] doOutputAnchorPeersUpdate -> INFO 006 Writing anchor peer update
+ res=0
+ set +x
启动 first-network
启动过程中要拉取 fabric 的 docker 镜像,在国内可能特别慢,建议先给 docker 配置镜像源 :
first-network 启动命令:
$ ./byfn.sh up
Starting for channel 'mychannel' with CLI timeout of '10' seconds and CLI delay of '3' seconds
Continue? [Y/n] y
proceeding ...
Unable to find image 'hyperledger/fabric-tools:latest' locally
latest: Pulling from hyperledger/fabric-tools
7ddbc47eeb70: Pulling fs layer
c1bbdc448b72: Pulling fs layer
...省略...
90
===================== Query successful on peer1.org2 on channel 'mychannel' =====================
========= All GOOD, BYFN execution completed ===========
_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/
出现 All GOOD 后,启动成功。
first-network 的组成
用 docker ps 可以正在运行的容器,最后一列是容器的名称:
➜ first-network git:(v1.4.4) ✗ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2d7c1e32b74 dev-peer1.org2.example.com-mycc-1.0-26c2ef3283 "chaincode -peer.add…" 5 minutes ago Up 5 minutes dev-peer1.org2.example.com-mycc-1.0
4e3b06b72953 dev-peer0.org1.example.com-mycc-1.0-384f11f484 "chaincode -peer.add…" 5 minutes ago Up 5 minutes dev-peer0.org1.example.com-mycc-1.0
6aebf7da1213 dev-peer0.org2.example.com-mycc-1.0-15b571b3ce "chaincode -peer.add…" 6 minutes ago Up 6 minutes dev-peer0.org2.example.com-mycc-1.0
bb5b01488fe5 hyperledger/fabric-tools:latest "/bin/bash" 7 minutes ago Up 7 minutes cli
7781e5181954 hyperledger/fabric-peer:latest "peer node start" 7 minutes ago Up 7 minutes 0.0.0.0:7051->7051/tcp peer0.org1.example.com
d5ae822f095a hyperledger/fabric-orderer:latest "orderer" 7 minutes ago Up 7 minutes 0.0.0.0:7050->7050/tcp orderer.example.com
844929c28283 hyperledger/fabric-peer:latest "peer node start" 7 minutes ago Up 7 minutes 0.0.0.0:10051->10051/tcp peer1.org2.example.com
5ff858ab54cc hyperledger/fabric-peer:latest "peer node start" 7 minutes ago Up 7 minutes 0.0.0.0:9051->9051/tcp peer0.org2.example.com
7ab6831f4530 hyperledger/fabric-peer:latest "peer node start" 7 minutes ago Up 7 minutes 0.0.0.0:8051->8051/tcp peer1.org1.example.com
组成 first-network 的容器:
orderer.example.com 形成维护共识的 orderer
peer0.org1.example.com org1 的第一个 peer
peer1.org1.example.com org1 的第二个 peer
peer0.org2.example.com org2 的第一个 peer
peer1.org2.example.com org2 的第二个 peer
下面三个容器是 byfn.sh 脚本创建的一个名为 mycc 的智能合约,fabric 的智能合约是用 docker 运行的:
dev-peer1.org2.example.com-mycc-1.0
dev-peer0.org1.example.com-mycc-1.0
dev-peer0.org2.example.com-mycc-1.0
cli 容器用来查看、管理 first-network,用下面的方法进入:
$ docker exec -it cli /bin/bash
root@bb5b01488fe5:/opt/gopath/src/github.com/hyperledger/fabric/peer#
在容器内执行 ls,可以看到创建 first-network 时用到文件:
$ ls -lh
total 28K
drwxr-xr-x 7 root root 224 Nov 26 14:23 channel-artifacts
drwxr-xr-x 4 root root 128 Nov 26 14:23 crypto
-rw-r--r-- 1 root root 3 Nov 26 14:34 log.txt
-rw-r--r-- 1 root root 21K Nov 26 14:31 mychannel.block
drwxr-xr-x 10 root root 320 Nov 25 14:52 scripts
first-network 是怎么回事?
这个问题三言两语还真是说不清楚。别看创建 first-network 特别简单,但是 byfn.sh 背后的工作有很多!用 docker-compose 和 一堆脚本。强烈建议通过下面教程学习 fabric 的组成。这个教程使用的是 fabric 1.1 (两年前的版本),但基本原理不变,把每个组件的用途和配置方法都讲清楚了: