本章我们从
fabric v1.0
的e2e_cli
示例开始分析整个启动过程以及在过程中的一些配置文件
首先呢,还是确保你的基本环境已经搭建完成,v1.0源码和镜像也都下载完毕
一.fabric启动过程中的相关脚本文件解析
1.1 network_setup.sh脚本文件
在源码目录下的network_setup.sh
文件是官方提供的快速部署测试的一个自动化脚本,接下来我们看一下在启动这个文件时都做了什么:
在上图中我们只是截取了启动函数,在这个函数中可以清楚的看出在启动中调用了generateArtifacts.sh
和docker-compose-cli.yaml
两个文件,这两个文件的作用分别是:
generateArtifacts.sh:生成所需的证书(crypto-config文件夹)和通道相关的配置文件(channel-artifacts文件夹)
docker-compose-cli.yaml:描述的是这个示例网络的拓扑结构
1.2 generateArtifacts.sh脚本文件
我们继续分析在network_setup.sh
中调用generateArtifacts.sh
文件具体又做了什么呢
在generateArtifacts.sh
中一共有3个函数:replacePrivateKey()
、generateCerts()
和generateChannelArtifacts()
generateCerts():
在上图中可以看到这个函数使用工具cryptogen和crypto-config.yaml
文件来生成所需的证书文件和公私钥。
我们可以看一下crypto-config.yaml
文件:
Name和Domain是指该org的名字和域名,Template.Count是指该org中的节点数量,Users.Count是指该org中包含的user数量.
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
# ---------------------------------------------------------------------------
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 2
Users:
Count: 1
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
Template:
Count: 2
Users:
Count: 1
generateChannelArtifacts():
在上图中可以看到这个函数使用工具configtxgen
和configtx.yaml
文件来生成创世区块以及通道相关的配置文件。而configtx.yaml
文件里主要是一些org的配置项信息,如ID、Host、Port等,除此之外还指明了orderer
的共识方式为solo
等一些的基础的配置项信息。
1.3 docker-compose-cli.yaml脚本文件
docker-compose-cli.yaml
文件描述了这个示例网络的拓扑结构,如下,包含:
- orderer:1个
- org1:peer0(锚节点),peer1
- org2:peer0(锚节点),peer1
- cli:对上面的容器节点进行管理
- 为什么cli能够对上面的容器进行管理呢?
因为cli是经过网络中其他节点进行授权认可的,而认可的凭证就是公私钥
#command: /bin/bash -c './scripts/script.sh ${CHANNEL_NAME}; sleep $TIMEOUT'
文件中上面这一行是笔者故意注释掉的,使docker-compose-cli.yaml
文件启动时不会自动去执行script.sh
脚本,而这个脚本就是自动创建、加入通道以及链码相关操作的自动化脚本,而在下面,我们将自己动手来一步步完成这些步骤,从而加深对fabric启动过程的理解。
version: '2'
services:
orderer.example.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.example.com
container_name: orderer.example.com
peer0.org1.example.com:
container_name: peer0.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org1.example.com
peer1.org1.example.com:
container_name: peer1.org1.example.com
extends:
file: base/docker-compose-base.yaml
service: peer1.org1.example.com
peer0.org2.example.com:
container_name: peer0.org2.example.com
extends:
file: base/docker-compose-base.yaml
service: peer0.org2.example.com
peer1.org2.example.com:
container_name: peer1.org2.example.com
extends: