- Peer 配置剖析
本例子是拿fabric-samples 来说的,【如果是 fabric 的话,在 fabric/的根目录下有一个 core.yaml 】在 fabric-samples/config 目录下有一个 core.yaml 文件 该文件就是 peer 节点的各项配置,其中主要包含了:logging (日志)、 peer (节点)、 vm (链码运行环境)、chaincode (链码相关)、ledger (账本) 等 5 大部分
文件内容及各项说明如下所示:
logging: ##
日志级别有:
critical
、
error
、
warning
、
notice
、
info
、
debug
级别由大到小,
级别越小输出越详细
level: info ##
全局的默认日志级别
##
各个模块日志级别,
覆盖全局配置
cauthdsl: warning ##
gossip: warning
grpc: error
ledger: info
msp: warning
policies: warning
peer:
gossip: warning
#
日志的输出格式
format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
###############################################################################
#
# Peer section peer
部分
#
###############################################################################
peer:
id: jdoe ## Peer
节点
ID
networkId: dev ##
网络
ID
listenAddress: 0.0.0.0:7051 ##
节点监听的本地网络接口地址
chaincodeAddress: 0.0.0.0:7052 ##
链码容器连接时的监听地址
如未指定
,
则使用
listenAddress
的
IP
地址和
7052
端口
address: 0.0.0.0:7051 ##
节点对外的服务地址
(对外的地址)【还有人说是
与同组织内其他
peer
通信的地址
;
配置在
cli
节点上表示
peer
与其通信的地址
??】
addressAutoDetect: false ##
是否自动探测服务地址
(
默认
关闭,
如果启用
TLS
时,最好关闭
)
gomaxprocs: -1 ## Go
的进程限制数
runtime.GOMAXPROCS(n)
默认
-1
keepalive: ##
客户端和
peer
间的网络心跳连接配置
minInterval: 60s ##
最小的心跳间隔时间
client: ##
该节点和客户端
的交互配置
interval: 60s ##
和客户端
的心跳间隔
必须
interval >= minInterval
timeout: 20s ##
和客户端
间的网络连接超时时间
deliveryClient: ##
交付客户端用于与订购节点通信的心跳
interval: 60s
timeout: 20s
gossip: ##
节点间通信的
gossip
协议的
P2P
通信
【主要包含了
启动
及
连接】
bootstrap: 127.0.0.1:7051 ##
启动节点后
向哪些节点发起
gossip
连接,以加入网络,且节点相互间都是同一个组织的
useLeaderElection: true ##
是否启动动态选举
组织的
Leader
节点
与
orgLeader
互斥
orgLeader: false ##
是否指定本节点为
组织
Leader
节点
与
useLeaderElection
互斥
endpoint: ##
本节点在组织内的
gossip id
maxBlockCountToStore: 100 ##
保存到内存的区块个数上限
maxPropagationBurstLatency: 10ms ##
保存消息的最大时间,超过则触发转发给其他节点
maxPropagationBurstSize: 10 ##
保存的最大消息个数,超过则触发转发给其他节点
propagateIterations: 1 ##
消息转发的次数
propagatePeerNum: 3 ##
推送消息给指定个数的节点
pullInterval: 4s ##
拉取消息的时间间隔
(unit: second)
必须大于
digestWaitTime + responseWaitTime
pullPeerNum: 3 ##
从指定个数的节点拉取消息
requestStateInfoInterval: 4s ##
从节点拉取状态信息
(StateInfo)
消息间隔
(unit: second)
publishStateInfoInterval: 4s ##
向其他节点推动状态信息消息的间隔
(unit: second)
stateInfoRetentionInterval: ##
状态信息消息的超时时间
(unit: second)
publishCertPeriod: 10s ##
启动后在心跳消息中包括证书的等待时间
skipBlockVerification: false ##
是否不对区块消息进行校验,默认为
false
dialTimeout: 3s ## gRPC
连接拨号的超时
(unit: second)
connTimeout: 2s ##
建立连接的超时
(unit: second)
recvBuffSize: 20 ##
收取消息的缓冲大小
sendBuffSize: 200 ##
发送消息的缓冲大小
digestWaitTime: 1s ##
处理摘要数据的等待时间
(unit: second)
可以大于
requestWaitTime
requestWaitTime: 1500ms ##
处理
nonce
数据的等待时间
(unit: milliseconds)
可以大于
digestWaitTime
responseWaitTime: 2s ##
终止拉取数据处理的等待时间
(unit: second)
aliveTimeInterval: 5s ##
定期发送
Alive
心跳消息的时间间隔
(unit: second)
aliveExpirationTimeout: 25s ## Alive
心跳消息的超时时间
(unit: second)
reconnectInterval: 25s ##
断线后重连的时间间隔
(unit: second)
externalEndpoint: ##
节点被组织外节点感知时的地址,公布给其他组织的地址和端口
,
如果不指定
,
其他组织将无法知道本
peer
的存在
election: ## Leader
节点的选举配置
startupGracePeriod: 15s ## leader
节点选举等待的时间
(unit: second)
membershipSampleInterval: 1s ##
测试
peer
稳定性的时间间隔
(unit: second)
leaderAliveThreshold: 10s ## pear
尝试进行选举的等待超时
(unit: second)
leaderElectionDuration: 5s ## pear
宣布自己为
Leader
节点的等待时间
(unit: second)
pvtData: ##
这个我还真不知道干嘛的?谁知道告诉我
pullRetryThreshold: 60s
transientstoreMaxBlockRetention: 1000
pushAckTimeout: 3s
btlPullMargin: 10
events: ##
事件配置
address: 0.0.0.0:7053 ##
本地服务监听地址
(
默认在所有网络接口上进心监听,端口
7053)
buffersize: 100 ##
最大缓冲消息数,超过则向缓冲中发送事件消息会被阻塞
timeout: 10ms ##
事件发送超时时间
,
如果事件缓存已满
, timeout < 0,
事件被丢弃
; timeout > 0,
阻塞直到超时丢弃
, timeout = 0,
阻塞直到发送出去
timewindow: 15m ##
允许
peer
和
客户端
时间不一致的最大时间差
keepalive: ##
客户端到
peer
间的事件心跳
minInterval: 60s
sendTimeout: 60s ##
在
GRPC
流上向客户端发送事件的超时时间
tls: ## tls
配置
enabled: false ##
是否开启
TLS
,默认不开启
TLS
clientAuthRequired: false ##
客户端连接到
peer
是否需要使用加密
cert: ##
证书密钥的位置
,
各
peer
应该填写各自相应的路径
file: tls/server.crt ##
本服务的身份验证证书,公开可见,访问者通过该证书进行验证
key:
file: tls/server.key ##
本服务的签名私钥
rootcert:
file: tls/ca.crt ##
信任的根
CA
整数位置
clientRootCAs: ##
用于验证客户端证书的根证书颁发机构的集合
files:
- tls/ca.crt
clientKey: ##
当
TLS
密钥用于制作客户端连接。如果不设置,将使用而不是
peer.tls.key.file
file:
clientCert: ##
在进行客户端连接时用于
TLS
的
X.509
证书。
如果未设置,将使用
peer.tls.cert.file
file:
serverhostoverride: ##
是否制定进行
TLS
握手时的主机名称
authentication: ##
身份验证包含与验证客户端消息相关的配置参数
timewindow: 15m ##
客户端请求消息中指定的当前服务器时间与客户端时间之间的可接受差异
fileSystemPath: /var/hyperledger/production ## peer
数据存储位置
(
包括账本
,
状态数据库等
)
BCCSP: ##
加密库配置
与
Orderer
配置一样
Default: SW ##
使用软件加密方式
(
默认
SW)
SW:
Hash: SHA2 ## Hash
算法类型,目前仅支持
SHA2
Security: 256
FileKeyStore: ##
本地私钥文件路径,默认指向
<mapConfigPath>/keystore
KeyStore:
# Settings for the PKCS#11 crypto provider (i.e. when DEFAULT: PKCS11)
PKCS11: ##
设置
PKCS#11
加密算法
(
默认
PKCS11)
Library: ##
本地
PKCS11
依赖库
Label: ## token
的标识
Pin: ##
使用
Pin
Hash:
Security:
FileKeyStore:
KeyStore:
mspConfigPath: msp ## msp
的本地路径
localMspId: SampleOrg ## Peer
所关联的
MSP
的
ID
client: ## cli
公共客户端配置选项
connTimeout: 3s ##
连接超时时间
deliveryclient: ##
交付服务配置
reconnectTotalTimeThreshold: 3600s ##
交付服务交付失败后尝试重连的时间
connTimeout: 3s ##
交付服务和
orderer
节点的连接超时时间
reConnectBackoffThreshold: 3600s ##
设置连续重试之间的最大延迟
localMspType: bccsp ##
本地
MSP
类型
(默认为
BCCSP
)
profile: ##
是否启用
Go
自带的
profiling
支持进行调试
enabled: false
listenAddress: 0.0.0.0:6060
adminService: ## admin
服务用于管理操作,例如控制日志模块严重性等。只有对等管理员才能使用该服务
handlers:
authFilters:
-
name: DefaultAuth
-
name: ExpirationCheck ##
此筛选器检查身份
x509
证书过期
decorators:
-
name: DefaultDecorator
endorsers:
escc:
name: DefaultEndorsement
library:
validators:
vscc:
name: DefaultValidation
library:
validatorPoolSize: ##
处理交易验证的并发数
,
默认是
CPU
的核数
discovery: ##
客户端使用发现服务来查询有关
peers
的信息,例如
-
哪些
peer
已加入某个
channel
,最新的
channel
配置是什么,最重要的是
-
给定
chaincode
和
channel
,哪些可能的
peer
满足认可
policy
enabled: true
authCacheEnabled: true
authCacheMaxSize: 1000
authCachePurgeRetentionRatio: 0.75
orgMembersAllowedAccess: false
###############################################################################
#
# VM section
链码运行环境配置
目前主要支持
Docker
容器
#
###############################################################################
vm:
endpoint: unix:///var/run/docker.sock ## Docker Daemon
地址,默认是本地
套接字
docker:
tls: ## Docker Daemon
启用
TLS
时的相关证书配置
,
包括信任的根
CA
证书、服务身份证书、签名私钥等等
enabled: false
ca:
file: docker/ca.crt
cert:
file: docker/tls.crt
key:
file: docker/tls.key
attachStdout: false ##
是否启用绑定到标准输出,启用后
链码容器
的输出消息会绑定到标准输出,方便进行调试
hostConfig: ## Docker
相关的主机配置,包括网络配置、日志、内存等等,这些配置在启动链码容器时进行使用
NetworkMode: host
Dns:
# - 192.168.0.1
LogConfig:
Type: json-file
Config:
max-size: "50m"
max-file: "5"
Memory: 2147483648
###############################################################################
#
# Chaincode section
链码相关配置
#
###############################################################################
chaincode:
id: ##
记录链码相关信息,包括路径、名称、版本等等,该信息会以标签形式写到链码容器
path:
name:
builder: $(DOCKER_NS)/fabric-ccenv:latest ##
通用的本地编译环境,是一个
Docker
镜像
pull: false ##
golang: ## Go
语言的链码部署生成镜像的基础
Docker
镜像
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
dynamicLink: false
car: ## car
格式的链码部署生成镜像的基础
Docker
镜像
runtime: $(BASE_DOCKER_NS)/fabric-baseos:$(ARCH)-$(BASE_VERSION)
java: ## java
语言的基础镜像
Dockerfile: |
from $(DOCKER_NS)/fabric-javaenv:$(ARCH)-1.1.0
node: ## node.js
的基础镜像
runtime: $(BASE_DOCKER_NS)/fabric-baseimage:$(ARCH)-$(BASE_VERSION)
startuptimeout: 300s ##
启动链码容器超时,等待超时时间后还没收到链码段的注册消息,则认为启动失败
executetimeout: 30s ## invoke
和
initialize
命令执行超时时间
deploytimeout: ##
部署链码的命令执行超时时间
mode: net ##
执行链码的模式,
dev:
允许本地直接运行链码,方便调试;
net:
意味着在容器中运行链码
keepalive: 0 ## Peer
和链码之间的心跳超市时间,
<= 0
意味着关闭
system: ##
系统链码的相关配置
(
系统链码白名单
??)
cscc: enable
lscc: enable
escc: enable
vscc: enable
qscc: enable
systemPlugins: ##
系统链码插件
logging: ##
链码容器日志相关配置
level: info
shim: warning
format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
###############################################################################
#
# Ledger section - ledger configuration encompases both the blockchain
# and the state
账本相关配置
#
###############################################################################
ledger:
blockchain: ##
设置系统区块链的整体配置,【后面会被丢弃】
state: ##
状态
DB
的相关配置
(
包括
golevelDB
、
couchDB)
、
DN
连接、查询最大返回记录数等
stateDatabase: goleveldb ## stateDB
的底层
DB
配置
(
默认
golevelDB)
couchDBConfig: ##
如果启用
couchdb
,配置连接信息
(goleveldb
不需要配置这些
)
couchDBAddress: 127.0.0.1:5984
username:
o prevent unintended users from discovering the password.
password:
maxRetries: 3 ##
运行时出错重试数
maxRetriesOnStartup: 10 ##
启动时出错的重试数
requestTimeout: 35s ##
请求超时时间
queryLimit: 10000 ##
每个查询最大返回数
maxBatchUpdateSize: 1000 ##
批量更新最大记录数
warmIndexesAfterNBlocks: 1
history:
enableHistoryDatabase: true ##
是否启用历史数据库,默认开启
###############################################################################
#
# Metrics section
服务度量监控配置
#
#
###############################################################################
metrics:
enabled: false ##
是否开启监控服务
reporter: statsd
interval: 1s
statsdReporter:
address: 0.0.0.0:8125
flushInterval: 2s
flushBytes: 1432
promReporter: ## prometheus
普罗米修斯服务监听地址
listenAddress: 0.0.0.0:8080
在 fabric-samples/config 目录下有一个 orderer.yaml 文件 该文件就是 Orderer 节点的各项配置,其中主要包含了:General(日志)、 FileLedger(节点)、 RAMLedger(链码运行环境)、Kafka(链码相关) 等 4 大部分
文件内容及各项说明如下所示:
################################################################################
#
# Orderer Configuration orderer
的配置
#
# - This controls the type and configuration of the orderer.
#
################################################################################
General:
LedgerType: file ##
账本类型,支持
ram
、
json
、
file
三种类型【建议用
file
】,其中
ram
保存在内存中;
json
、
file
保存在本地文件中
(
通常为
/var/hyperledger/production/orderer
下
)
ListenAddress: 127.0.0.1 ##
服务监听地址,一般需要制定为服务的特定网络接口地址
或者全网
(0.0.0.0)
ListenPort: 7050 ##
服务监听端口
默认
7050
TLS: ##
启用
TLS
时的相关配置
(grpc
传输
)
Enabled: false
PrivateKey: tls/server.key ## Orderer
签名私钥
Certificate: tls/server.crt ## Orderer
身份证书
RootCAs:
- tls/ca.crt ##
根证书
ClientAuthRequired: false ##
是否对客户端也进行认证
ClientRootCAs:
Keepalive: ##
设置
GRPC
服务心跳检查
ServerMinInterval: 60s ##
客户端和
orderer
的
最小心跳间隔
ServerInterval: 7200s ##
客户端和
orderer
的心跳间隔时间
ServerTimeout: 20s ##
客户端和
Orderer
的超时时间
LogLevel: info ##
日志等级
##
日志输出格式
LogFormat: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
GenesisMethod: provisional ##
创世块的提供方式
(
系统通道初始区块的提供方式,支持
provisional
或者
file
;前者根据
GenesisProfile
指定默认的
$FABRIC_CFG_PATH/config.yaml
文件中的
profile
生成;后者使用
GenesisFile
指定现成的初始区块文件
)
GenesisProfile: SampleInsecureSolo ##
创世块使用的
Profile
;
GenesisMethod: provisional
才有效
GenesisFile: genesisblock ##
使用现成创世块文件时,文件的路径
[
创世块的位置
] GenesisMethod: file
才有效
LocalMSPDir: msp ##
本地
MSP
文件的路径
【
orderer
节点所需的安全认证文件的位置】
LocalMSPID: SampleOrg ## Orderer
所关联的
MSP
的
ID MSP
管理器用于注册安全认证文件的
ID,
此
ID
必须与配置系统通道和创世区块时
(configtx.yaml
的
OrdererGenesis
部分
)
指定的组织中的某一个组织的
ID
一致
Profile: ##
为
Go pprof
性能优化工具启用一个
HTTP
服务以便作性能分析
(https://golang.org/pkg/net/http/pprof)
Enabled: false ##
不启用
Address: 0.0.0.0:6060 ## Go pprof
的
HTTP
服务监听的地址和端口
BCCSP: ##
加密库配置
具体参照
Peer
配置
Default: SW
SW:
Hash: SHA2
Security: 256
FileKeyStore:
KeyStore:
Authentication:
TimeWindow: 15m
################################################################################
#
# SECTION: File Ledger
基于文件账本
配置
(file
和
json
两种类型
)
#
# - This section applies to the configuration of the file or json ledgers.
#
################################################################################
FileLedger:
Location: /var/hyperledger/production/orderer ##
指定存放文件的位置,一般为
/var/hyperledger/production/orderer,
该目录下的
chains
目录存放各个
chain
的区块,
index
目录存放
索引文件
(
如果这项不指定
,
每次节点重启都将使用一个新的临时位置
)
Prefix: hyperledger-fabric-ordererledger ##
如果不指定
Location
,则在临时目录下创建账本时目录的名称
################################################################################
#
# SECTION: RAM Ledger
基于内存账本
配置
#
# - This section applies to the configuration of the RAM ledger.
#
################################################################################
RAMLedger:
HistorySize: 1000 ##
内存账本所支持存储的区块的数量
,
如果内存中存储的区块达到上限
,
继续追加区块会导致最旧的区块被丢弃
################################################################################
#
# SECTION: Kafka kafka
集群配置
#
# - This section applies to the configuration of the Kafka-based orderer, and
# its interaction with the Kafka cluster.
#
################################################################################
Kafka:
# kafka
是一种基于发布
/
订阅模式的分布式消息系统
# fabric
网络中
, orderer
节点集群组成
kafka
集群
,
客户端是
kafka
集群的
Producer(
消息生产者
), peer
是
kafka
集群的
Consumer(
消息消费者
)
# kafka
集群使用
ZooKeeper(
分布式应用协调服务
)
管理集群节点
,
选举
leader.
Retry: ##
连接时的充实操作
kafka
会利用
sarama
客户端为
chennel
创建一个
producer
负责向
kafka
写数据,一个
comsumer
负责
kafka
读数据
ShortInterval: 5s ##
操作失败后的快速重试间隔时间
ShortTotal: 10m ##
快速重试阶段最对重试多久
LongInterval: 5m ##
快速充实阶段仍然失败后进入
慢重试阶段,慢重试的时间间隔
LongTotal: 12h ##
慢重试最多重试多久
# https://godoc.org/github.com/Shopify/sarama#Config
NetworkTimeouts: ## Sarama
网络超时时间
DialTimeout: 10s
ReadTimeout: 10s
WriteTimeout: 10s
Metadata: ## kafka
集群
leader
选举中的
metadata
请求参数
RetryBackoff: 250ms ## leader
选举过程中元数据请求失败的重试间隔
RetryMax: 3 ##
最大重试次数
Producer: ##
发送消息到
kafka
集群时的超时
RetryBackoff: 100ms ##
向
kafka
集群发送消息失败后的重试间隔
RetryMax: 3 ##
最大重试次数
Consumer: ##
从
kafka
集群接收消息时的超时
RetryBackoff: 2s ##
从
kafka
集群拉取消息失败后的重试间隔
Verbose: false ##
是否开启
kafka
的客户端的调试日志
(orderer
与
kafka
集群交互是否生成日
)
TLS: ##
与
kafka
集群的连接启用
TLS
时的相关配置
Enabled: false ##
是否开启
TLS
,默认不开启
PrivateKey: ## Orderer
身份签名私钥
# File: ##
私钥文件路径
Certificate: ## kafka
的身份证书
# File: ##
证书文件路径
RootCAs: ##
验证
kafka
证书时的根证书
# File: ##
根证书文件路径
Version: ## kafka
的版本,默认为
0.9.0.1
################################################################################
#
# Debug Configuration orderer
节点的调试参数
#
# - This controls the debugging options for the orderer
#
################################################################################
Debug:
BroadcastTraceDir: ##
该
orderer
节点的广播服务请求保存的位置
DeliverTraceDir: ##
该
orderer
节点的传递服务请求保存的位置
我们在【我的区块链之路】- Hyperledger fabric的简单入门(二)中已经知道,在启动网络前,我们需要做一些准备工作,例如: 先使用cryptogen工具及 crypto-config.yaml 配置文件,生成整个fabric网络的组织架构及对应的身份证书;在crypto-config.yaml 文件中我们定义了 整个fabric网络的组织结构,然后工具会根据定义的配置生成对应的组织结构及把对应的身份证书放置对应的目录下以便区分使用;
具体的 crypto-config.yaml 文件内容如下所示:
OrdererOrgs: ##
定义
Orderer
组织结构
- Name: Orderer ## Orderer
的名称
Domain: example.com ##
组织的命名域
# ---------------------------------------------------------------------------
# "Specs" -
有关完整说明,请参阅下面的
PeerOrgs
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer
# ---------------------------------------------------------------------------
# "PeerOrgs" -
管理
Peer
节点的组织的定义
# ---------------------------------------------------------------------------
PeerOrgs:
- Name: Org1 ##
组织名称
组织
1
Domain: org1.example.com ##
组织域
EnableNodeOUs: true ##
如果设置了
EnableNodeOUs
,就在
msp
下生成
config.yaml
文件
Template: ##
允许定义从模板顺序创建的
1
个或多个主机。
默认情况下,这看起来像是从
0
到
Count-1
的
“peer”
。
您可以覆盖节点数(
Count
),起始索引(
Start
)或用于构造名称的模板(
Hostname
)。
Count: 2 ##
表示生成几个
Peer
# Start: 5
# Hostname: {{.Prefix}}{{.Index}} # default
# ---------------------------------------------------------------------------
# "Users"
# ---------------------------------------------------------------------------
# Count:
除
Admin
之外的用户帐户数量
# ---------------------------------------------------------------------------
Users:
Count: 1 ##
表示生成几个
普通
User
# ---------------------------------------------------------------------------
# Org2:
参照
组织
1
# ---------------------------------------------------------------------------
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
紧接着我们就可以使用命令来生成我们的组织结构及对应目录下的身份证书了:
cryptogen generate
--config=./crypto-config.yaml
上述命令默认会在当前目录生成一个名叫 crypto-config 目录,当然也可以在命令中添加 --output 选项来指定输出的目录;在这个目录下就会根据Orderer 和Peer 各自生成两个 文件夹: ordererOrganizations 和 peerOrganizations 分别代表着Orderer 和Peer的组织及对应目录下的证书文件;每个组织树下都有ca、msp、orderers(或者Peers)、users 等4个目录;下面我们来详细的说明下这两个组织下都是些什么:
. ## Orderer
组织配置
├──
ordererOrganizations
│
│
│
└──
example.com
│
│
│
├──
ca ##
存放组织根证书
及
私钥
(
采用
EC
算法
)
证书为【自签名】,组织内的实体将给予该根证书作为证书根
│
│
│
│
├──
56d9c0c46acdda38a174a5ba3ffc44726a2c027e16bb22b460413acbcb9b3a90_sk
│
│
│
│
│
└──
ca.example.com-cert.pem
│
│
│
├──
msp ##
存放该组织身份信息
│
│
│
│
│
├──
admincerts ##
组织管理员
身份验证证书,【被根证书签名】
│
│
│
│
│
│
│
└──
Admin@example.com-cert.pem
│
│
│
│
│
├──
cacerts ##
组织的根证书
【和
CA
目录
里面一致】
│
│
│
│
│
│
│
└──
ca.example.com-cert.pem
│
│
│
│
│
└──
tlscacerts ##
用于
TLS
的
CA
证书,
【自签名】
│
│
│
│
│
└──
tlsca.example.com-cert.pem
│
│
│
│
│
├──
orderers ##
存放所有
Orderer
的身份信息
│
│
│
│
│
└──
orderer.example.com ##
第一个
Orderer
的信息
msp
及
tls
│
│
│
│
│
├──
msp
│
│
│
│
│
│
│
├──
admincerts ##
组织管理员的身份验证证书。
Peer
将给予这些证书来确认交易签名是否为管理员签名
【和
MSP.admincerts
一致】
│
│
│
│
│
│
│
│
│
└──
Admin@example.com-cert.pem
│
│
│
│
│
│
│
├──
cacerts
│
│
│
│
│
│
│
│
│
└──
ca.example.com-cert.pem ##
存放组织根证书,【和
CA
目录
里面一致】
│
│
│
│
│
│
│
├──
keystore ##
本节点的身份私钥,用来签名
│
│
│
│
│
│
│
│
│
└──
2ec1193fe048848eaa8e20666e26c527b791c4fb127d69cae65095bd31b6c80e_sk
│
│
│
│
│
│
│
├──
signcerts ##
验证本节点签名的证书,【被根证书签名】
│
│
│
│
│
│
│
│
│
└──
orderer.example.com-cert.pem
│
│
│
│
│
│
│
└──
tlscacerts ## TLS
连接用的身份证书,
【和
msp.tlscacerts
一致】
│
│
│
│
│
│
│
└──
tlsca.example.com-cert.pem
│
│
│
│
│
└──
tls ## tls
的相关信息
│
│
├──
ca.crt ##
【组织的根证书】
│
│
├──
server.crt ##
验证本节点签名的证书,
【被根证书签名】
│
│
└──
server.key ##
本节点的身份私钥,用来签名
│
│
│
├──
tlsca ##
存放
tls
相关的证书和私钥
│
│
│
│
│
├──
2d66be83c519da67bb36b0972256a3b24357fa7f5b3a61f11405bc8b1f4d7c53_sk
│
│
│
│
│
└──
tlsca.example.com-cert.pem
│
│
│
└──
users ##
存放属于该组织的用户的实体
│
│
│
└──
Admin@example.com ##
管理员用户的信息,其中包括
msp
证书和
tls
证书两类
│
│
│
├──
msp
│
│
│
│
│
├──
admincerts ##
组织根证书作为管理员身份验证证书,【和
MSP.admincerts
一致】
│
│
│
│
│
│
│
└──
Admin@example.com-cert.pem
│
│
│
│
│
├──
cacerts ##
存放组织的根证书,【和
CA
目录
里面一致】
│
│
│
│
│
│
│
└──
ca.example.com-cert.pem
│
│
│
│
│
├──
keystore ##
本用户的身份私钥,用来签名
│
│
│
│
│
│
│
└──
a3c1d7e1bc464faf2e3a205cb76ea231bd3ee7010655d3cd31dc6cb78726c4d0_sk
│
│
│
│
│
├──
signcerts ##
管理员用户的身份验证证书,被组织根证书签名。要被某个
Orderer
认可,则必须放到该
Orderer
的
msp/admincerts
目录下
│
│
│
│
│
│
│
└──
Admin@example.com-cert.pem
│
│
│
│
│
└──
tlscacerts ## TLS
连接用的身份证书,即组织
TLS
证书,【和
msp.tlscacerts
一致】
│
│
│
│
│
└──
tlsca.example.com-cert.pem
│
│
│
│
│
└──
tls ## tls
的相关信息
│
├──
ca.crt
│
├──
client.crt ##
管理员的身份验证证书,【被
组织根证书签名】
│
└──
client.key ##
管理员的身份私钥,用来签名
│
│
│
│
## Peer
组织配置
└──
peerOrganizations
│
├──
org1.example.com ##
第一个组织的所有身份证书
│
│
│
├──
ca ##
存放组织根证书及私钥
(
采用
EC
算法
)
证书为【自签名】,组织内的实体将给予该根证书作为证书根
│
│
│
│
│
├──
496d6a41ae5f66bf120df3eab3a9d2dc4d268b2ab9a22af891d33d323bbdb5c8_sk
│
│
│
│
│
└──
ca.org1.example.com-cert.pem
│
│
│
├──
msp ##
存放该组织身份信息
│
│
│
│
│
├──
admincerts ##
组织管理员
身份验证证书,【被根证书签名】
│
│
│
│
│
│
│
└──
Admin@org1.example.com-cert.pem
│
│
│
│
│
├──
cacerts ##
组织的根证书
【和
CA
目录
里面一致】
│
│
│
│
│
│
│
└──
ca.org1.example.com-cert.pem
│
│
│
│
│
├──
config.yaml ##
记录
OrganizationalUnitIdentitifiers
信息,包括
根证书位置
和
ID
信息
(
主要是
crypto-config.yaml
的
peer
配置中配了
EnableNodeOUs: true
:
如果设置了
EnableNodeOUs
,就在
msp
下生成
config.yaml
文件
)
│
│
│
│
│
└──
tlscacerts ##
用于
TLS
的
CA
证书,
【自签名】
│
│
│
│
│
└──
tlsca.org1.example.com-cert.pem
│
│
│
│
│
├──
peers ##
存放所有
Peer
的身份信息
│
│
│
│
│
├──
peer0.org1.example.com ##
第一个
Peer
的信息
msp
及
tls
│
│
│
│
│
│
│
├──
msp
│
│
│
│
│
│
│
│
│
├──
admincerts ##
组织管理员的身份验证证书。
Peer
将给予这些证书来确认交易签名是否为管理员签名
【和
MSP.admincerts
一致】
│
│
│
│
│
│
│
│
│
│
│
└──
Admin@org1.example.com-cert.pem
│
│
│
│
│
│
│
│
│
├──
cacerts ##
存放组织根证书,【和
CA
目录
里面一致】
│
│
│
│
│
│
│
│
│
│
│
└──
ca.org1.example.com-cert.pem
│
│
│
│
│
│
│
│
│
├──
config.yaml
│
│
│
│
│
│
│
│
│
├──
keystore ##
本节点的身份私钥,用来签名
│
│
│
│
│
│
│
│
│
│
│
└──
0f0c2e1835086161f6a10c4bb38c2d89b2cee4e1128cee0fcda4433feb6eb6f8_sk
│
│
│
│
│
│
│
│
│
│
│
│
│
│
├──
signcerts ##
验证本节点签名的证书,【被根证书签名】
│
│
│
│
│
│
│
│
│
│
│
└──
peer0.org1.example.com-cert.pem
│
│
│
│
│
│
│
│
│
└──
tlscacerts ## TLS
连接用的身份证书,
【和
msp.tlscacerts
一致】
│
│
│
│
│
│
│
│
│
└──
tlsca.org1.example.com-cert.pem
│
│
│
│
│
│
│
│
│
│
│
└──
tls ## tls
的相关信息
│
│
│
├──
ca.crt ##
【组织的根证书】
│
│
│
├──
server.crt ##
验证本节点签名的证书,
【被根证书签名】
│
│
│
└──
server.key ##
本节点的身份私钥,用来签名
│
│
│
│
│
│
│
│
└──
peer1.org1.example.com
│
│
│
│
│
│
│
│
│
├──
tlsca ##
存放
tls
相关的证书和私钥
│
│
│
│
│
├──
3d39ea82dd5343c261b0480bc13d645a3cee13b7e7aa8c54fd2b5162f709671f_sk
│
│
└──
tlsca.org1.example.com-cert.pem
│
│
│
│
│
│
│
└──
users ##
存放属于该组织的用户的实体
│
│
│
├──
Admin@org1.example.com ##
管理员用户的信息,其中包括
msp
证书和
tls
证书两类
│
│
│
│
│
├──
msp
│
│
│
│
│
│
│
├──
admincerts ##
组织根证书作为管理员身份验证证书,【和
MSP.admincerts
一致】
│
│
│
│
│
│
│
│
│
└──
Admin@org1.example.com-cert.pem
│
│
│
│
│
│
│
├──
cacerts ##
存放组织的根证书,【和
CA
目录
里面一致】
│
│
│
│
│
│
│
│
│
└──
ca.org1.example.com-cert.pem
│
│
│
│
│
│
│
├──
keystore ##
本用户的身份私钥,用来签名
│
│
│
│
│
│
│
│
│
└──
2b933c0740d857284be98ff218bf279261e55eff2b89d973e0a1f435f7c7d28b_sk
│
│
│
│
│
│
│
├──
signcerts ##
管理员用户的身份验证证书,被组织根证书签名。要被某个
Peer
认可,则必须放到该
Peer
的
msp/admincerts
目录下
│
│
│
│
│
│
│
│
│
└──
Admin@org1.example.com-cert.pem
│
│
│
│
│
│
│
└──
tlscacerts ## TLS
连接用的身份证书,即组织
TLS
证书,【和
msp.tlscacerts
一致】
│
│
│
│
│
│
│
└──
tlsca.org1.example.com-cert.pem
│
│
│
│
│
└──
tls ## tls
的相关信息
│
│
├──
ca.crt
│
│
├──
client.crt ##
管理员的身份验证证书,【被
组织根证书签名】
│
│
└──
client.key ##
管理员的身份私钥,用来签名
│
│
│
│
│
└──
User1@org1.example.com
│
├──
msp
│
│
├──
admincerts ##
组织根证书作为管理员身份验证证书
│
│
│
└──
User1@org1.example.com-cert.pem
│
│
├──
cacerts ##
存放组织的根证书,【和
CA
目录
里面一致】
│
│
│
└──
ca.org1.example.com-cert.pem
│
│
├──
keystore ##
【参考
admin
】
│
│
│
└──
11ebc5afac42348f84a8882f329d18beee079efd4fd5d9b30389dc82053fc0c9_sk
│
│
├──
signcerts ##
【参考
admin
】
│
│
│
└──
User1@org1.example.com-cert.pem
│
│
└──
tlscacerts ##
【参考
admin
】
│
│
└──
tlsca.org1.example.com-cert.pem
│
└──
tls ##
【参考
admin
】
│
├──
ca.crt
│
├──
client.crt
│
└──
client.key
│
└──
org2.example.com
我们可以知道 cryptogen 工具无非就是在各个资源下生成 组织 和 私钥、证书等等,其中最关键的就是 各个资源下的MSP 目录内容:
- admincerts: 管理员的身份证书文件
- cacerts: 信任的根证书文件
- keystore: 节点的签名私钥文件
- signcerts: 节点的签名身份证书文件
- tlscacerts: TLS连接用的证书
等等 5 种文件
在上一篇文章中我们知道在启动网络之前我们需要做一些准备工作,上面我们已经使用 cryptogen 工具生成了 组织的结构及对应的 身份证书等等。现在我们需要使用 configtxgen 这个工具并使用 在 fabric-samples/config 目录下的 configtx.yaml 这个核心配置文件用来做三件事:【1】生成启动 Orderer 需要的创世块;【2】创建应用通道的 配置交易文件;【3】生成组织锚节点更新配置交易文件 ;在 configtx.yaml 配置中主要包括:Profiles、Organizations、Orderer、Application 等等 4 部分;
具体的 configtx.yaml 内容如下所示:
##
一些列组织的定义,【被其他
部分引用】
##
##
【注意】:本文件中
&KEY
均为
*KEY
所引用;
xx
:
&KEY
均为
<<: *KEY
所引用
##
Organizations:
##
定义
Orderer
组织
【
&OrdererOrg
这类语法类似
Go
的中的指针及对象地址,
此处是被
Profiles
中的
- *OrdererOrg
所引用,以下均为类似做法】
- &OrdererOrg
Name: OrdererOrg ## Orderer
的组织的名称
ID: OrdererMSP ## Orderer
组织的
ID
(
ID
是引用组织的关键)
MSPDir: crypto-config/ordererOrganizations/example.com/msp ## Orderer
的
MSP
证书目录路径
AdminPrincipal: Role.ADMIN ##
【可选项】
组织管理员所需要的身份,可选项
: Role.ADMIN
和
Role.MEMBER
##
定义
Peer
组织
1
- &Org1
Name: Org1MSP ##
组织名称
ID: Org1MSP ##
组织
ID
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp ## Peer
的
MSP
证书目录路径
AnchorPeers: ##
定义组织锚节点
用于跨组织
Gossip
通信
- Host: peer0.org1.example.com ##
锚节点的主机名
Port: 7051 ##
锚节点的端口号
##
定义
Peer
组织
2
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
AnchorPeers:
- Host: peer0.org2.example.com
Port: 7051
################################################################################
#
# SECTION: Capabilities
【注意】:
该部分是
V1.1.0
版本提出来的,
不可以在更早的版本中使用
#
# -
本节定义了
fabric
网络的功能
.
这是
v1.1.0
中的一个新概念,不应在
v1.0.x
的
peer
和
orderers
中使用
.
# Capabilities
定义了存在于结构二进制文件中的功能,以便该二进制文件安全地参与结构网络
.
#
例如,如果添加了新的
MSP
类型,则较新的二进制文件可能会识别并验证此类型的签名,而没有此支持的旧二进制文件将无法验证这些事务
.
#
这可能导致具有不同世界状态的不同版本的结构二进制文件。
相反,为通道定义功能会通知那些没有此功能的二进制文件,
#
它们必须在升级之前停止处理事务
.
对于
v1.0.x
,如果定义了任何功能(包括关闭所有功能的配置),那么
v1.0.x
的
peer
会主动崩溃
.
#
################################################################################
Capabilities:
##
通道功能适用于
orderers and the peers
,并且必须得到两者的支持。
将功能的值设置为
true.
Global: &ChannelCapabilities
## V1.1
的
Global
是一个行为标记,已被确定为运行
v1.0.x
的所有
orderers
和
peers
的行为,但其修改会导致不兼容。
用户应将此标志设置为
true.
V1_1: true
## Orderer
功能仅适用于
orderers
,可以安全地操纵,而无需担心升级
peers
。
将功能的值设置为
true
Orderer: &OrdererCapabilities
## Orderer
的
V1.1
是行为的一个标记,已经确定为运行
v1.0.x
的所有
orderers
都需要,但其修改会导致不兼容。
用户应将此标志设置为
true
V1_1: true
##
应用程序功能仅适用于
Peer
网络,可以安全地操作,而无需担心升级或更新
orderers
。
将功能的值设置为
true
Application: &ApplicationCapabilities
## V1.2 for Application
是一个行为标记,已被确定为运行
v1.0.x
的所有
peers
所需的行为,但其修改会导致不兼容。
用户应将此标志设置为
true
V1_2: true
################################################################################
#
# SECTION: Application
#
# -
应用通道相关配置,主要包括
参与应用网络的可用组织信息
#
################################################################################
Application: &ApplicationDefaults ##
自定义被引用的地址
Organizations: ##
加入通道的组织信息
################################################################################
#
# SECTION: Orderer
#
# - Orderer
系统通道相关配置,包括
Orderer
服务配置和参与
Orderer
服务的可用组织
#
# Orderer
默认是
solo
的
且不包含任何组织
【主要被
Profiles
部分引用】
################################################################################
Orderer: &OrdererDefaults ##
自定义被引用的地址
OrdererType: solo ## Orderer
类型,包含
solo
和
kafka
集群
Addresses: ##
服务地址
- orderer.example.com:7050
BatchTimeout: 2s ##
区块打包的最大超时时间
(
到了该时间就打包区块
)
BatchSize: ##
区块打包的最大包含交易数
MaxMessageCount: 10 ##
一个区块里最大的交易数
AbsoluteMaxBytes: 99 MB ##
一个区块的最大字节数,
任何时候都不能超过
PreferredMaxBytes: 512 KB ##
一个区块的建议字节数,如果一个交易消息的大小超过了这个值
,
就会被放入另外一个更大的区块中
MaxChannels: 0 ##
【可选项】
表示
Orderer
允许的最大通道数,
默认
0
表示没有最大通道数
Kafka:
Brokers: ## kafka
的
brokens
服务地址
允许有多个
- 127.0.0.1:9092
Organizations: ##
参与维护
Orderer
的组织,默认为空
################################################################################
#
# Profile
#
# -
一系列通道配置模板,包括
Orderer
系统通道模板
和
应用通道类型模板
#
################################################################################
Profiles:
## Orderer
的
系统通道模板
必须包括
Orderer
、
Consortiums
两部分
TwoOrgsOrdererGenesis: ## Orderer
系统的通道及创世块配置。通道为默认配置,添加一个
OrdererOrg
组织,
联盟为默认的
SampleConsortium
联盟,添加了两个组织
【该名称可以自定义
??】
Capabilities:
<<: *ChannelCapabilities
Orderer: ##
指定
Orderer
系统通道自身的配置信息
<<: *OrdererDefaults ##
引用
Orderer
部分的配置
&OrdererDefaults
Organizations:
- *OrdererOrg ##
属于
Orderer
的通道组织
该处引用了
【
&OrdererOrg
】位置内容
Capabilities:
<<: *OrdererCapabilities
Consortiums: ## Orderer
所服务的联盟列表
SampleConsortium: ##
创建更多应用通道时的联盟
引用
TwoOrgsChannel
所示
Organizations:
- *Org1
- *Org2
##
应用通道模板
必须包括
Application
、
Consortium
两部分
TwoOrgsChannel: ##
应用通道配置。默认配置的应用通道,添加了两个组织。联盟为
SampleConsortium
Consortium: SampleConsortium ##
通道所关联的联盟名称
Application: ##
指定属于某应用通道的信息,主要包括
属于通道的组织信息
<<: *ApplicationDefaults
Organizations: ##
初始
加入应用通道的组织
- *Org1
- *Org2
Capabilities:
<<: *ApplicationCapabilities
写的是真的累了;好了,到这里我们大致上对Fabric网络的几个主要配置做了讲解,后续我们还会讲解Fabric-CA及往正在运行的fabric网络动态添加新的组织及通道的操作哈~