上一篇博客分析了crypto-config配置文件的主要内容和各个属性的意义,现在我们来看一看更加复杂的configtx.yaml文件,官方给的模板文件很长,注释很多,这里我就不粘贴内容了,直接拿出一个实际的配置过的文件来分析一下(可以先看分析回头再看这段配置代码):
Profiles:
OrdererGenesis: # 网络启动时,必须首先创建Orderer系统通道
Policies:
Readers:
Type: ImplicitMeta
Rule: ANY Readers
Writers:
Type: ImplicitMeta
Rule: ANY Writers
Admins:
Type: ImplicitMeta
Rule: MAJORITY Admins
Capabilities:
V1_3: true
Orderer: # orderer信息
OrdererType: kafka # 指定启用的排序算法
Addresses: # 提供服务的地址
- orderer0.1243574274jyworderer:7050
BatchTimeout: 1s # 区块生成超时时间
BatchSize:
MaxMessageCount: 10 # 区块消息数量
AbsoluteMaxBytes: 99 MB # 区块绝对最大字节数
PreferredMaxBytes: 512 KB # 一个区块的建议字节数,如果一个交易消息的大小超过了这个值, 就会被放入另外一个更大的区块中
Kafka:
Brokers: # kafka的 brokens 服务地址 允许有多个
- kafka0.1243574274jywkafka:9092
- kafka1.1243574274jywkafka:9092
- kafka2.1243574274jywkafka:9092
- kafka3.1243574274jywkafka:9092
EtcdRaft:
Consenters: []
Policies:
Readers:
Type: ImplicitMeta
Rule: ANY Readers
Writers:
Type: ImplicitMeta
Rule: ANY Writers
Admins:
Type: ImplicitMeta
Rule: MAJORITY Admins
BlockValidation:
Type: ImplicitMeta
Rule: ANY Writers
Organizations:
- Name: Orderer # 组织名称
ID: OrdererMSP # MSP ID
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/ordererOrganizations/1243574274jyworderer/msp # msp目录
Policies:
Readers:
Type: Signature
Rule: OR('OrdererMSP.member')
Writers:
Type: Signature
Rule: OR('OrdererMSP.member')
Admins:
Type: Signature
Rule: OR('OrdererMSP.admin')
AnchorPeers: [] #该组织的锚节点
Capabilities:
V1_1: true
Consortiums: # 以上orderer组织所服务的联盟信息
SampleConsortium:
Organizations:
- Name: O1
ID: O1MSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo1/msp
Policies:
Readers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.peer', 'O1MSP.client')
Writers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.client')
Admins:
Type: Signature
Rule: OR('O1MSP.admin')
AnchorPeers:
- Host: peer0.1243574274jywo1
Port: 7051
- Name: O2
ID: O2MSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo2/msp
Policies:
Readers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.peer', 'O2MSP.client')
Writers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.client')
Admins:
Type: Signature
Rule: OR('O2MSP.admin')
AnchorPeers:
- Host: peer0.1243574274jywo2
Port: 7051
OrgsChannel: # 应用通道模板
Consortium: SampleConsortium # 该应用通道所关联联盟的名称
Application:
Policies:
Readers:
Type: ImplicitMeta
Rule: ANY Readers
Writers:
Type: ImplicitMeta
Rule: ANY Writers
Admins:
Type: ImplicitMeta
Rule: MAJORITY Admins
Organizations: # 组织机构配置
- Name: O1 # orderer组织名字
ID: O1MSP # orderer组织ID
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo1/msp
Policies:
Readers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.peer', 'O1MSP.client')
Writers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.client')
Admins:
Type: Signature
Rule: OR('O1MSP.admin')
AnchorPeers: # 配置锚节点
- Host: peer0.1243574274jywo1
Port: 7051
- Name: O2
ID: O2MSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo2/msp
Policies:
Readers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.peer', 'O2MSP.client')
Writers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.client')
Admins:
Type: Signature
Rule: OR('O2MSP.admin')
AnchorPeers:
- Host: peer0.1243574274jywo2
Port: 7051
Capabilities:
V1_3: true
V1_2: false
V1_1: false
配置代码很长,但是我们把它的子标签收起来,大概是这个样子:
Profiles:
OrdererGenesis:
OrgsChannel:
首先我们明确,这个配置文件是可以由两大部分组成的,一部分是OrdererGenesis,我理解为系统通道的配置,另一部分是OrgsChannel,我理解为应用通道的配置,在下文我也会这样称呼,这样使得整个文件更加清晰和简单。但是在经过在百度上查阅了一些资料和理解后,我觉得这个配置文件应该可以写的更加条理清晰:
- profile / 配置的入口,我们可以把整个文件主要配置定义为以下内容:
Profiles:
OrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
OrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
以上yaml文件中所使用的到的以下符号释义:
使用符号 | 符号意义 |
---|---|
<< | 合并数据结果 |
& | 锚点(使用上可以看成是类似变量的定义) |
* | 引用一个定义好的锚点 |
分析以上配置文件我们发现在系统通道和应用通道中我们分别需要两个信息:
配置项 | 需要的配置信息 |
---|---|
系统通道 | Orderer 、Consortiurns |
应用通道 | Application 、Consortium |
关于yaml文件的特殊符号语法可以参考:参考文章
2. Organizations / 组织机构配置
这部分的配置信息被以上的profile所引用:
Organizations:
- &OrdererOrg
Name: Orderer
ID: OrdererMSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/ordererOrganizations/1243574274jyworderer/msp
Policies:
Readers:
Type: Signature
Rule: OR('OrdererMSP.member')
Writers:
Type: Signature
Rule: OR('OrdererMSP.member')
Admins:
Type: Signature
Rule: OR('OrdererMSP.admin')
AnchorPeers: []
- &Org1
Name: O1
ID: O1MSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo1/msp
Policies:
Readers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.peer', 'O1MSP.client')
Writers:
Type: Signature
Rule: OR('O1MSP.admin', 'O1MSP.client')
Admins:
Type: Signature
Rule: OR('O1MSP.admin')
AnchorPeers:
- Host: peer0.1243574274jywo1
Port: 7051
- &Org2
Name: O1
ID: O1MSP
MSPDir: /data/HduFabric/baasmanager/baas-nfsshared/baas-artifacts/1243574274/jyw/crypto-config/peerOrganizations/1243574274jywo2/msp
Policies:
Readers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.peer', 'O2MSP.client')
Writers:
Type: Signature
Rule: OR('O2MSP.admin', 'O2MSP.client')
Admins:
Type: Signature
Rule: OR('O2MSP.admin')
AnchorPeers:
- Host: peer0.1243574274jywo2
Port: 7051
我们来分析一下这部分的子配置文件,首先定义了Organizations标签,然后其内部是三个数组,分别代表了三个组织的具体配置信息。其中一个是排序组织,另外两个组织是正常的组织,里面的一些属性甚至可以再定义锚点然后引用来简化配置信息,这里就不再细分了,下面用一个表格展示各个标签的具体含义:
属性名称 | 属性意义 |
---|---|
Name | 组织名称 |
ID | 组织 ID |
MSPDir | MSP所在文件夹 |
Policies | 访问控制规则 |
AnchorPeers | 锚节点相关配置 |
- Orderer / 排序节点配置
Orderer:&OrdererDefaults
OrdererType: kafka
Addresses:
- orderer0.1243574274jyworderer:7050
BatchTimeout: 1s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
Kafka:
Brokers:
- kafka0.1243574274jywkafka:9092
- kafka1.1243574274jywkafka:9092
- kafka2.1243574274jywkafka:9092
- kafka3.1243574274jywkafka:9092
EtcdRaft:
Consenters: []
Policies:
Readers:
Type: ImplicitMeta
Rule: ANY Readers
Writers:
Type: ImplicitMeta
Rule: ANY Writers
Admins:
Type: ImplicitMeta
Rule: MAJORITY Admins
BlockValidation:
Type: ImplicitMeta
Rule: ANY Writers
Capabilities:
V1_1: true
这部分的配置信息主要配置了排序节点采用的共识算法以及对应相关参数
属性 | 意义 |
---|---|
OrdererType | orderer类型,包括solo和kafka |
Addresses | 服务地址 |
BatchTimeout | 区块生成超时时间 |
MaxMessageCount | 区块消息数量 |
AbsoluteMaxBytes | 区块绝对最大字节数 |
PreferredMaxBytes | 一个区块的建议字节数,如果一个交易消息的大小超过了这个值, 就会被放入另外一个更大的区块中 |
Kafka | 定义了kafka的broken域名 |
EtcdRaft | Raft相关配置参数 |
Capabilities | 类似于版本支持的一个属性 |
- Application / 应用配置
Application: &ApplicationDefaults
Policies:
Readers:
Type: ImplicitMeta
Rule: ANY Readers
Writers:
Type: ImplicitMeta
Rule: ANY Writers
Admins:
Type: ImplicitMeta
Rule: MAJORITY Admins
Organizations:
Capabilities:
V1_3: true
V1_2: false
V1_1: false
属性 | 意义 |
---|---|
Organizations | 加入通道中的组织信息 |
经过了以上的分析之后,其实这个文件配置的基本内容应该可以有个大概的印象了,由两大部分组成,那两大部分中包含了一些组织、规则等信息,如果使用锚点和引用不仅增加了配置文件的可读性,而且使得子配置被复用,使得代码更加简洁。但是学到现在对于配置文件中的一些小细节还是有部分不理解,了解了这个配置文件的内容之后,我们可以从配置文件的功能区更好地总结这个配置文件,同时也可以理解为什么可以实现那个功能。