简介
在上一部分中,我们已经介绍了如何使用配置模板(crypto-config.yaml)调用 fabric 的 cryptogen 工具生成指定组织和节点数量的加密材料,本部分我们将使用 configtx.yaml 配置文件调用 fabric 的 configtxgen 工具来创建创世区块、通道配置交易和锚节点(主节点)更新配置文件。
在配置文件中主节点称为 Anchor Peer,所以我们常常称主节点为锚节点。
我们还是先简单介绍一下 configtxgen 工具是怎么工作的,configtxgen 工具需要依赖于 configtx.yaml 文件,1.4 版本 configtx.yaml 的模板如下(可以看注释理解),由于 configtx.yaml 模版很大,我们分开来分析:
组织部分配置
组织部分定义了稍后将在配置中引用的不同组织的标识,详情请看下面配置文件的详细注释。
# 组织相关的配置
Organizations:
# 定义排序服务(Orderer)组织
# &OrdererOrg 这个用法类似指针,此处是被 Profiles 中的 - *OrdererOrg 所引用,下面还有很多类型的用例
- &OrdererOrg
# Orderer 排序节点组织的名称
Name: OrdererOrg
# Orderer 排序节点组织的ID,也就是本地MSP的名称(这是引用组织的关键)
ID: OrdererMSP
# Orderer 排序节点组织的 MSP 证书文件目录路径
MSPDir: crypto-config/ordererOrganizations/example.com/msp
# 定义本层级的应用控制策略,对于排序节点(Orderer)的策略,其权威路径为:/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
Policies:
# 只要是组织中的成员就可读
Readers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
# 只要是组织中的成员就可写
Writers:
Type: Signature
Rule: "OR('OrdererMSP.member')"
# 只有组织中的管理员才拥有管理员 admin 权限
Admins:
Type: Signature
Rule: "OR('OrdererMSP.admin')"
# 定义组织1(Org1)
- &Org1
# 组织1(Org1) 的名称
Name: Org1MSP
# 组织1(Org1) 的ID,也就是 localMSP 的名称
ID: Org1MSP
# 组织1(Org1)的 MSP 证书文件目录路径
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp
# 定义本层级的应用控制策略,对于组织1(Org1)的策略,其权威路径为:/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
Policies:
# 组织 1 的管理员、普通节点和客户端均拥有读权限
Readers:
Type: Signature
Rule: "OR('Org1MSP.admin', 'Org1MSP.peer', 'Org1MSP.client')"
# 组织 1 的管理员、客户端拥有写权限
Writers: # 可写
Type: Signature
Rule: "OR('Org1MSP.admin', 'Org1MSP.client')"
# 组织 1 的管理员拥有全部管理权限
Admins: # 管理员 admin
Type: Signature
Rule: "OR('Org1MSP.admin')"
# 定义组织1的锚节点,用于跨组织进行 Gossip 通信
AnchorPeers:
# 锚节点的主机名(域名)
- Host: peer0.org1.example.com
# 锚节点的端口号
Port: 7051
# 定义组织2(Org2)
- &Org2
# 组织2(Org2) 的名称
Name: Org2MSP
# 组织2(Org2) 的ID,也就是 localMSP 的名称
ID: Org2MSP
# 组织2(Org2)的 MSP 证书文件目录路径
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
# 定义本层级的应用控制策略,对于组织2(Org2)的策略,其权威路径为:/Channel/<Application|Orderer>/<OrgName>/<PolicyName>
Policies:
# 读权限
Readers:
Type: Signature
Rule: "OR('Org2MSP.admin', 'Org2MSP.peer', 'Org2MSP.client')"
# 写权限
Writers:
Type: Signature
Rule: "OR('Org2MSP.admin', 'Org2MSP.client')"
# 管理员权限
Admins:
Type: Signature
Rule: "OR('Org2MSP.admin')"
# 定义组织2的锚节点,用于跨组织进行 Gossip 通信
AnchorPeers:
# 锚节点的主机名(域名)
- Host: peer0.org2.example.com
# 锚节点的端口号
Port: 9051
对于上述配置文件,只需要将核心的几个配置的注释看懂就可以了,比如不同组织是如何配置的、权限策略是如何配置的以及每个组织的锚节点是如何进行设置的。
功能部分 Capabilities(兼容性)
Capabilities 部分是在 v1.1.0 版本之后提出来的,不能用于在更早的版本上面。Capabilities 定义了存在于结构二进制文件中的功能,以便该二进制文件安全的参与网络,如果添加新的 MSP 类型,则较新的二进制文件可能会识别并验证此类型的签名,而没有此支持的旧二进制文件将无法验证这些事务,这可能导致具有不同世界状态的不同版本的结构二进制文件。
为通道定义功能(Capabilities)会通知那些没有此功能的二进制文件,他们必须升级之后才能去处理事务,对于 v1.0.x,如果定义了任何功能(Capabilities)[包括关闭所有的功能配置],那么v1.0.1 的 peer 会主动崩溃(因为无法验证事务)。
Capabilities:
# 通道功能(Capabilities)适用于 orderer 节点和 peer 节点,并且必须得到两者的支持。
# 将功能设置为 true
Channel: &ChannelCapabilities
V1_4_2: true
# Orderer功能(Capabilities)仅适用于排序节点,可以安全地与之前版本的 peers 一起使用
# 将功能设置为 true
Orderer: &OrdererCapabilities
V1_4_2: true
# 应用程序(Application)仅适用于 peer 节点网络,并且可以安全地与之前版本的 orderer 节点一起使用
# 将功能的值设置为 true
Application: &ApplicationCapabilities
# 应用程序(Application)的 v1.4.2 版本启用了 Fabric 1.4.2 的新的非向后兼容功能和修复
V1_4_2: true
V1_3: false
V1_2: false
V1_1: false
Application 配置部分
Application 配置部分定义了配置事务或创世区块应用相关的参数时设置的值,详见下面配置文件注释。
Application: &ApplicationDefaults
# Organizations 是在网络的应用程序端定义为参与者的组织列表
Organizations:
# 定义本层级的应用控制策略,对于应用程序(application)策略,其权威路径为 /Channel/Application/<PolicyName>
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
# 指定能力为上面 Capabilities 部分定义的 ApplicationCapabilities,通过指针引用。
Capabilities:
<<: *ApplicationCapabilities
Orderer 节点配置部分
Orderer 节点配置定义了要为 orderer 节点的配置事务或创世区块的相关参数时设置的值。
Orderer: &OrdererDefaults
# 要启动的 Orderer 节点的共识类型,现在可以选的是
# solo,kafka,etcdraft
# 这里使用的是 solo 模式
OrdererType: solo
# orderer 节点的服务地址,如果是集群,需要设置多个地址
Addresses:
- orderer.example.com:7050
#- orderer.example2.com:8050
#- orderer.example3.com:9050
#- orderer.example4.com:10050
#- orderer.example5.com:11050
# 区块打包的最大超时时间(到了该时间就要打包区块,这可以影响你实验时的 TPS)
BatchTimeout: 2s
# BatchSize 中的参数是你实验时想要提高 TPS 所需要调整的参数
BatchSize:
# 一个区块里最大的交易数(最大到了该数量就要打包区块,这个也会影响实验时的 TPS)
# 如果将该值设置的过小,区块生成速度就会很快,那么交易确认时间就短,但是浪费了很多空间;如果将该值设置的过大,那么区块生成速度就会变慢,每个区块中会装更多的交易,但是交易确认时间会变长,看你自己实验需要进行调整。
MaxMessageCount: 10
# 一个区块的最大字节数(任何时候区块中包含的字节数都不能超过最大字节数,如果到了该大小(<=)就要打包区块)
AbsoluteMaxBytes: 99 MB
# 一个区块的建议字节数,如果一个交易消息的大小超过了该值,就会被放到一个更大的区块中去(影响出块数量)
PreferredMaxBytes: 512 KB
# kafka 共识的相关配置设置
Kafka:
# kafka 的 brokens 服务地址,允许有多个
# 注意: 使用IP:端口(IP:port)表示法
Brokers:
- 127.0.0.1:9092
# 参与维护 Orderer 排序节点的组织,默认为空
Organizations:
# 定义本层级的应用控制策略,对于 Orderer 策略,其权威路径为:/Channel/Orderer/<PolicyName>
Policies:
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
# BlockValidation 配置项指定了哪些签名必须包含在区块中,以便对 peer 节点进行验证(区块验证策略)
BlockValidation:
Type: ImplicitMeta
Rule: "ANY Writers"
Channel 通道配置部分
Channle 通道配置定义了要写入创世区块或配置交易中的通道参数,详情请看下面的配置文件。
Channel: &ChannelDefaults
# 定义本层级的应用控制策略,对于 Channel 策略,其权威路径为: /Channel/<PolicyName>
Policies:
# 谁可以调用出块(Deliver)的 API
Readers:
Type: ImplicitMeta
Rule: "ANY Readers"
# 谁可以调用广播区块(Broadcast)的 API
Writers:
Type: ImplicitMeta
Rule: "ANY Writers"
# 默认情况下,谁可以修改此配置级别的元素(需要得到大部分管理员的同意才可以)
Admins:
Type: ImplicitMeta
Rule: "MAJORITY Admins"
# Capabilities 配置描述应用层级的能力需求,这里直接引用前面 Capabilities 配置段中的 ChannelCapabilities 配置项
Capabilities:
<<: *ChannelCapabilities
Profiles 部分配置
Profile 部分定义了 configtxgen 工具的配置入口,包含联盟(Consortiums)的配置入口。
Profile 部分的配置主要是引入上面五个部分的配置参数。 configtxen 工具通过调用 Profile 参数,可以实现生成特点的区块文件。
Profiles:
# 创建 Orderer 创世区块的相关参数配置(Solo共识),包含 orderer 和联盟(Consortiums)两个部分
TwoOrgsOrdererGenesis:
# 合并引入 Channel 部分的配置(上面 Channel 部分已经定义好的,这里只是引用一下,可以理解为上面五个部分都仅是在声明而未使用,在 Profile 中才是真正的使用,即 configtx 工具实际读取的是 Profile 部分的配置)
<<: *ChannelDefaults
# 合并引入 Orderer 部分的配置
Orderer:
<<: *OrdererDefaults
# 指定组织配置为 OrdererOrg
Organizations:
- *OrdererOrg
# 指定能力为 OrdererCapabilities
Capabilities:
<<: *OrdererCapabilities
# 定义 Orderer 所服务的联盟列表,这就是联盟链中的联盟
Consortiums:
# 指定联盟列表名称为 SampleConsortium
SampleConsortium:
# 定义联盟中的组织,这里为 Org1,Org2
# SampleConsortiem 联盟中包含两个组织
Organizations:
- *Org1
- *Org2
# 照猫画虎,可以定义你自己的联盟,比如三个组织、四个组织,按照配置文件格式增加就行了。
# 创建应用通道(Channel)的配置
TwoOrgsChannel:
# 应用通道关联的联盟列表为 SampleConsortium,即该通道属于联盟 SampleConsortium,不懂的去官网看看 fabric 的架构图,一看你就懂了。
Consortium: SampleConsortium
# 合并引入通道(Channel)配置
<<: *ChannelDefaults
# 合并引入 Application 的相关配置
Application:
<<: *ApplicationDefaults
# 初始加入通道的组织,这里为 Org1,Org2
Organizations:
- *Org1
- *Org2
# 指定能力为 ApplicationCapabilities
Capabilities:
<<: *ApplicationCapabilities
# 创建 Orderer 创世区块的相关参数配置(当 Orderer 集群采用 Kafka 共识)
# 只有在使用 configtxgen 工具生成创世区块时指定了 -profile 参数为 SampleDevModeKafka时,才会使用这个配置项。
SampleDevModeKafka:
<<: *ChannelDefaults
Capabilities:
<<: *ChannelCapabilities
Orderer:
<<: *OrdererDefaults
OrdererType: kafka
Kafka:
Brokers:
- kafka.example.com:9092
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Application:
<<: *ApplicationDefaults
Organizations:
- <<: *OrdererOrg
# 该配置仅适用于联盟 SampleConsortium 中的两个指定的组织(Org1、Org2)
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
# 创建 Orderer 创世区块的相关参数配置(当 Orderer 集群采用 Raft 共识)
# 只有在使用 configtxgen 工具生成创世区块时指定了 -profile 参数为 SampleMultiNodeEtcdRaft,才会使用这个配置项。
SampleMultiNodeEtcdRaft:
<<: *ChannelDefaults
Capabilities:
<<: *ChannelCapabilities
Orderer:
<<: *OrdererDefaults
OrdererType: etcdraft
# 指定参与共识的所有 orderer 节点的地址、端口、和证书文件路径(相对)
EtcdRaft:
Consenters:
# 第一个排序节点的 raft 配置信息
- Host: orderer.example.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/server.crt
# 第二个排序节点的 raft 配置信息
- Host: orderer2.example.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer2.example.com/tls/server.crt
# 第三个排序节点的 raft 配置信息
- Host: orderer3.example.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer3.example.com/tls/server.crt
# 第四个排序节点的 raft 配置信息
- Host: orderer4.example.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer4.example.com/tls/server.crt
# 第五个排序节点的 raft 配置信息
- Host: orderer5.example.com
Port: 7050
ClientTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
ServerTLSCert: crypto-config/ordererOrganizations/example.com/orderers/orderer5.example.com/tls/server.crt
# 5 个排序节点的地址信息,用于 RPC 连接
Addresses:
- orderer.example.com:7050
- orderer2.example.com:7050
- orderer3.example.com:7050
- orderer4.example.com:7050
- orderer5.example.com:7050
Organizations:
- *OrdererOrg
Capabilities:
<<: *OrdererCapabilities
Application:
<<: *ApplicationDefaults
Organizations:
- <<: *OrdererOrg
# 绑定的联盟组织
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
你会发现配置文件中很多部分都存在重复,我们只要修改少量配置项就可以达到增加或删除组织、排序节点数量的目的。实际上配置项并不复杂,分开拆解后就容易理解了。
总结
我们总结一下 configtx.yaml 这个配置文件的内容,它包含了一个完整示例网络的定义。它拥有三个成员:一个排序组织(OrdererOrg)和两个 Peer 组织(Org1 & Org2),这两个 Peer 组织又分别管理和维护两个 Peer 节点。
这个文件还定义了一个联盟——SampleConsortium,包含了我们定义的两个组织(Org1 & Org2)。注意一下文件中 "Profiles" (系统级配置)部分的最下边的几个特别标题,理解他们可以提升你对网络配置的理解。
TwoOrgsOrdererGenesis: 为 Solo 排序服务生成创世区块时使用的配置。SampleMultiNodeEtcdRaft: 为 Raft 排序服务生成创世区块时使用的配置。只有将 -o 参数指定为 etcdraft 时才可用。SampleDevModeKafka: 为 Kafka 排序服务生成创世区块时使用的配置。只有将 -o 参数指定为 kafka 时才可用。TwoOrgsChannel: 为我们的通道 mychannel 生成创世区块是使用的配置。
这些标题很重要,因为在我们创建网络各项构件时,需要将它们作为参数传入(比如指定参数 -o kafka 就会使用 SampleDevModeKafka 中的配置去生成创世区块),在下面的命令中请你多观察一下这些标题。
除此之外,还需要注意到 SampleConsortium 在系统级配置项定义,然后在通道级的配置项中引用。通道位于联盟的范围内,而联盟必须定义在整个网络范围内。
该文件还包含两个值得注意的附加规范。
- 我们为每个组织指定了锚节点(peer0.org1.example.com & peer0.org2.example.com)。
- 我们为每个排序服务成员指定了 MSP 文件所在的位置(身份证明文件),因此排序节点的创世区块中就存储了每个组织的根证书。这是一个关键概念,因为每个和排序服务通信的网络实体都可以通过组织的根证书验证与它们通信的排序节点的数字签名,从而验证排序服务节点的身份。
ok,到此为止,我们就将 fabric 中最重要的配置文件介绍完了,由于这篇字数挺多了,我们放到下一部分继续介绍如何使用 configtxgen 工具生成创世区块和通道配置。