介绍
我们已经成功启动了一个测试网络,可能过程有点磕磕绊绊,但是结果还是令人满意的。有些人会在这里卡很久,甚至有些人放弃了区块链的学习,但是永远要相信,轻易得到的都没有任何价值。
而我们也要认识到:事实上你自己并没有参与到网络搭建的每一步,只有自己亲自动手去实现一个区块链网络,才能更好的帮助你理解 fabric 网络搭建的每一步是为了做什么、实现什么,以及为什么要这样做?
我们不仅要做到知其然,更重要的是做到知其所以然!所以我们要尝试手动构建自己的第一个网络(BYFN),该网络提供了一个包含两个组织的 Hyperledger Fabric 网络,每个组织包含两个 Peer 节点。
首先我们先关闭已经启动的 fabric 网络,清理网络环境,然后一步步去探索 fabric 网络的搭建流程。这个流程步骤很重要,可以避免出现一些不必要的问题和冲突。比如创建通道时报错通道已经创建,在节点上安装链码时报错链码已经安装等等。
因此,需要养成一个比较好的习惯,每次关闭一个 fabric 网络的时候,都要将无用的挂载清空,以此测试网络为例,接下来的命令会结束掉你所有的容器,移除加密相关的材料和四个构件,并且从 Docker 仓库删除链码镜像。
- 先关闭byfn网络
./byfn down
- 清理无用挂载(输入y确认)
docker volume prune
- 删除已经生成的证书和组件
rm -rf channel-artifacts rm -rf crypto-config
生成加密材料和证书
执行完上述命令后,我们就拥有了一个“干净”的初始环境,下面我们就开始手动搭建fabric 网络的历程了。
首先我们需要知道 fabric 网络中所有成员构成,包括组织、节点、用户都是拥有自己的身份证书文件,以此来证明自己是网络中一员;Fabric 项目提供了 cryptogen 工具(基于 crypto 标准库)实现自动化生成各个组织、节点和用户成员的身份证书。这些证书是身份的代表,在实体之间通信和交易的时候,它们可以通过验证对方的证书来验证对方的身份。
我们简要介绍一下从 cryptogen 是怎么工作的:cryptogen 通过一个包含网络拓扑的文件 crypto-config.yaml,为所有组织和属于这些组织的组件生成一组证书和秘钥。每一个组织被分配一个唯一的根证书(ca-cert),它绑定该组织的特定组件(Peer 节点和排序节点)。
Fabric 中的事务和通信由一个实体的私钥(keystore)签名,然后通过公钥(signcerts)验证。在这个文件里你会发现一个 count 变量。我们通过它来指定每个组织的 Peer 节点数量,如果你设计的网络中需要每个组织中有两个 peer 节点,你需要将它设为 2,那么生成证书时,你就会在加密材料文件夹中发现两个 peer 节点的证书文件,同理,3 个,4 个 peer 节点也是如此。当然,仅做这些改动是不够的,还需要在 docker-compose 文件中进行修改。
在我们运行 cryptogen 工具之后,生成的证书和密钥将保存到一个名为 crypto-config 的文件夹中。注意, crypto-config.yaml 文件在排序组织中设置了五个排序节点。Solo 排序服务只会使用一个排序节点来创建系统通道和通道配置文件,除非使用 Raft 或者 Kafka 排序服务,cryptogen 才会为这五个排序节点生成证书。
cryptogen 工具生成加密材料和证书需要依赖于crypto-config.yaml文件,1.4 版本crypto-config.yaml的模板如下(可以看注释理解):
# 定义 orderer 排序节点组织结构
OrdererOrgs:
# Orderer 排序节点组织的名称
- Name: Orderer
# orderer 排序节点组织的根域名
Domain: example.com
# 根据 “{{.Hostname}}.{{.Domain}}” 格式的模板生成各个排序节点的访问域名和该排序节点各种证书文件
Specs:
# 生成的访问域名为 orderer.example.com
- Hostname: orderer
# 生成的访问域名为 orderer2.example.com
- Hostname: orderer2
# 生成的访问域名为 orderer3.example.com
- Hostname: orderer3
# 生成的访问域名为 orderer4.example.com
- Hostname: orderer4
# 生成的访问域名为 orderer5.example.com
- Hostname: orderer5
# 定义 Peer 节点组织结构
PeerOrgs:
# 第一个组织名称 Org1
- Name: Org1
# 第一个组织的根域名
Domain: org1.example.com
# 如果为 true,则在 MSP 目录下就会生成 config.yaml 文件
EnableNodeOUs: true
# 模板,根据默认的规则在 Org1 下生成 "peer0 ~ peer_(count-1)" 个 peer 节点
Template:
# 根据 count 值生成 peer 节点
# peer0.org1.example.com
# peer1.org1.example.com
Count: 2
# 定义创建普通用户的数量
# 管理员用户(Admin@org1.example.com)会默认创建
Users:
# 创建一个普通用户 (User1@org1.example.com)
Count: 1
# 第二个组织名称 Org2
- Name: Org2
# 第一个组织的根域名
Domain: org2.example.com
EnableNodeOUs: true
Template:
# 定义生成 2 个 peer 节点
# peer0.org2.example.com
# peer1.org2.example.com
Count: 2
Users:
# 创建一个普通用户 (User1@org2.example.com)
Count: 1
如果可以看懂上面的 yaml 配置文件,那么你心里其实应该知道如何扩充组织和节点了,难道是多定义一个组织,然后修改组织配置中的 count 值来增加节点数量?没错,就是这么简单,当然和刚才一样,这一切都需要在 docker-compose.yaml 中进行进一步配置。
分析完用户加密材料和证书的 yaml 配置文件,我们正式开始手动搭建 fabric 生产网络。
- 我们新建一个新的文件夹,名为 my_first_network ;
mkdir my_first_network
- 创建一个新的
crypto-config.yaml配置文件;
touch crypto-config.yaml
- 然后将上述模版内容复制到这个配置文件中,可以使用以下任一命令进行编辑;
vi crypto-config.yaml
vim crypto-config.yaml
gedit crypto-config.yaml
将上述配置模板复制到该文件中,保存后退出。
- vim 命令行
i插入模式- 按
ESC退出当前模式 - 输入
:wq保存并退出:q退出 (仅在没有对配置文件做出修改时才能使用):q!不保存修改并退出
ok,准备好配置文件后,我们使用 fabric 提供的 cryptogen 工具生成网络的加密材料和证书,执行下列命令:
cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
命令执行成功后,结果如下:
我们可以查看当前工作目录下是否有新的文件生成,你可以打开这些目录查看一下,其中包含了各个节点的私钥、证书等信息。当然你可以使用 tree 命令获得更加直观的体验:
tree -L 3
这就是组织数量、节点数量以及加密材料和构件生成的过程了。接下来我们将进入通道配置设置和通道配置生成阶段。