我们是光大科技有限公司智能化平台团队区块链项目组,致力于构建集团区块链基础设施平台,提供区块链技术在金融行业的完备解决方案,降低区块链的开发、运维难度,助力集团数字化转型。我们团队拥有经验丰富的区块链领域技术专家和研发工程师,将不定期分享区块链及相关领域的技术文章和解决方案,和大家共同探索金融行业区块链技术的落地实践和发展趋势。
引言
Fabric网络中,从为Fabric中各节点产生证书到链上通道的创建,再到每个节点启动,均需要配置,这些配置信息为Fabric网络提供稳定的运行状态,本文将从搭建Fabric网络的角度出发,分别对Fabric中的证书配置、通道配置以及各节点启动配置进行解析。本文中采用Fabric2.x的LTS版本作为解读背景,读者通过本文的学习将掌握fabric2.x网络中各节点配置文件中的各个配置项的作用,以及通过修改各个配置来搭建满足需求的Fabric网络。
一、简介
作为fabric的使用者,可以通过修改配置来限定各个fabric节点的行为,也可以通过修改配置来管理包括节点身份,通道配置等多种资源,配置的了解在fabric使用过程中是必不可少的一环。
二、为Fabric节点生成组织身份信息
对于访问成员,Fabric网络通过该成员的证书与密钥来对该成员进行认证与管理,Fabric基于其联盟链的身份,网络中用户结构由联盟中的各个组织到组织下的各个节点,再到节点下的各个用户成员组成,各个组织节点以及节点下用户的证书及密钥可以通过使用fabric官方提供的二进制工具cryptogen(crypto genertor)以及配置文件来生成,这里一般生成的节点下用户信息是有限个数的,节点下用户的证书信息可以通过fabric提供的PKI服务(fabric-ca)来为后续联盟节点下用户申请证书。
2.1 生成联盟组织身份的配置文件解析
搭建Fabric网络第一步就是要为联盟节点生成证书以及密钥,首先需要配置生成联盟组织身份的配置文件,然后配合二进制工具cryptogen来生成证书,配置文件内容如下代码块所示,每行配置上均附上配置说明。
OrdererOrgs: #orderer集群的节点所属组织
- Name: Orderer #组织的名称
Domain: example.com #组织的命名域
Specs: #这里指定orderer组织的规格
- Hostname: orderer #这里指定orderer组织内包含的节点名字
- Hostname: orderer1
- Hostname: orderer2
PeerOrgs: #peer集群的节点所属组织
- Name: Org1 #组织名称
Domain: org1.example.com#组织命令域
EnableNodeOUs: true #是否根据证书中的OU字段来判断访问者的角色
Template: #当前peer组织的模版配置
Count: 2 #当前peer组织的模版数量,这里为2个peer节点
Users: #当前peer组织的用户证书配置,
Count: 2 #当前peer组织产生证书的用户个数,这里为产生两个用户的证书
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 2
以上配置文件创建的联盟链包含三个组织,一个orderer组织,两个peer组,orderer组织内包含三个节点,分别为orderer,orderer1,orderer2,peer组织为Org1,Org2两个组织,每个组织下均包含两个节点为peer0,peer1。
●EnableNodeOUs字段为true时,启动NodeOU,会在该组织证书目录下的msp目录下生成config.yaml文件,文件内指定了该节点的ca证书的位置,并根据该ca证书来判断该节点的OU类型,这时Fabric网络中访问者的身份可以通过证书中OU字段来判断,OU种类有client,peer,admin以及orderer,Fabric通过访问者的身份来决定访问者的权限,比如在安装链码或者实例化链码时,需要访问者的角色为peer;而涉及到对通道进行配置管理的时候,需要访问者的角色为admin。
●peer与orderer组织的规格可以使用Specs或者Template来进行配置,两者的区别为,Specs可以规定每个节点的名称,而Template只能指定节点的个数,比如peer组织指定template为2,则两个节点为peer0,peer1,根据数量依次后排。
●关于为peer组织产生用户数量的字段Users,这里指定的为产生节点用户的数量,这里的数量并不包含admin用户,admin用户是默认产生的,后面如果user的个数不够用,可以使用fabric提供的PKI服务(fabric-ca)来生成。
2.2 二进制工具cryptogen的使用
cryptogen主要用来为Fabric联盟生成身份信息,主要的应用场景有两方面,一方面是启动一个新的联盟链时,为联盟成员生成身份信息;另一方面是针对已有的联盟链,需要拓展整个联盟,比如为联盟添加新组织,为旧组织添加新的节点等,可以在不影响已有的联盟链证书情况下,使用cryptogen工具为联盟添加的新组织生成身份信息。
cryptogen支持的子命令如下代码块所示:
usage: cryptogen [<flags>] <command> [<args> ...]
Utility for generating Hyperledger Fabric key material
Flags:
--help Show context-sensitive help (also try --help-long and --help-man).
Commands:
help [<command>...]. #查看cryptogen的帮助信息
Show help.
generate [<flags>] #子命令生成身份信息
Generate key material
showtemplate # 在当前目录下生成模版配置文件
Show the default configuration template
version #查看当前cryptogen二进制工具的版本
Show version information
extend [<flags>] #继承已有的网络为新的节点生成身份信息
Extend existing network
为联盟成员生成身份信息需要用到generate子命令,这个命令中需要指定配置文件的位置以及生成证书目录的位置,配置文件的位置是必须的,如果不指定,会根据模版文件进行生成身份信息;生成证书目录的位置不是必要的,不指定的话,会在当前目录生成crypto-config的目录,生成身份信息的命令示例如下:
cryptogen generate --config ./crypto-config.yaml --output crypto-config
为已有联盟添加的新成员生成身份信息需要用到extend子命令,这个命令需要指定已有的证书目录以及最新的配置文件的位置,这两者均是必要的,命令示例如下:
cryptogen extend --config ./crypto-config.yaml --input crypto-config
三、为Fabric网络
生成通道配置相关文件
Fabric联盟中的成员是通过通道来进行共享数据的,不同联盟之间也通过通道来进行数据隔离,在Fabric网络节点启动前,需要配置通道文件,配合二进制工具configtxgen来生成通道配置块,创世区块以及组织的锚节点更新文件,这里从通道配置文件解析以及二进制工具configtxgen的使用两方面来展开叙述。
3.1 通道配置文件解析
搭建Fabric网络,在为联盟成员生成身份信息后,接下来要进行通道配置相关文件的生成,首先配置通道配置文件,配合二进制工具configtxgen来生成通道相关文件文件,通道配置文件文件内容如下代码块所示,每行配置均附上配置说明。
Organizations: #通道内包含的组织的配置信息,peer组织以及orderer的配置
- &OrdererOrg
Name: OrdererOrg #排序组织组织名称
ID: OrdererMSP #MSPID
MSPDir: crypto-config/ordererOrganizations/example.com/msp #排序组织的MSP本地路径
Policies: #组织内权限配置
Readers: #读权限
Type: Signature #策略类型为非组合签名策略
Rule: \\\"OR(\\\'OrdererMSP.member\\\')\\\" #满足排序组织任意成员的签名
Writers: #写权限
Type: Signature
Rule: \\\"OR(\\\'OrdererMSP.member\\\')\\\"
Admins: #管理权限
Type: Signature
Rule: \\\"OR(\\\'OrdererMSP.admin\\\')\\\" #满足排序
组织任意管理员签名
OrdererEndpoints: #这里指定了orderer组织的endpoint节点,这个节点将在你进行通道相关操作的时候,主动提供服务,比如创建通道,你不指定orderer节点,它自动会找ordererendpoints。
- orderer.example.com:7050
- &Org1
Name: Org1MSP #org1组织MSP的名称
ID: Org1MSP #MSPID
MSPDir: crypto-config/peerOrganizations/org1.example.com/msp #Org1组织的MSP本地路径
AnchorPeers: #Org1组织的锚节点配置,用来组织间进行通信
- Host: peer0.org1.example.com #节点名称
Port: 7051 #节点暴露的端口
Policies: #Org1组织的权限配置
Readers:
Type: Signature
Rule: \\\"OR(\\\'Org1MSP.admin\\\',\\\'Org1MSP.peer\\\',\\\'Org1MSP.client\\\')\\\" #满足Org1组织admin,peer,client中任意成员的签名,这里也可以解释为满足Org1组织内非orderer角色的任意成员签名
Writers:
Type: Signature
Rule: \\\"OR(\\\'Org1MSP.admin\\\',\\\'Org1MSP.client\\\')\\\" #满足Org1组织admin,client中任意成员签名
Admins:
Type: Signature
Rule: \\\"OR(\\\'Org1MSP.admin\\\')\\\" #满足只Org1组织任意admin成员的签名
Endorsement: #设置组织的背书策略
Type: Signature #为单一的签名策略
Rule: \\\"OR(\\\'Org1MSP.peer\\\')\\\" #只需要Org1中OU角色为peer的节点签名即可
- &Org2
Name: Org2MSP
ID: Org2MSP
MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
AnchorPeers:
- Host: peer0.org2.example.com
Port: 9051
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\\\')\\\"
Capabilities: #以下定义了关于通道服务,排序服务,应用服务对于orderer以及peer版本的兼容性指定,以下三种配置将在后面被引用
Channel: &ChannelCapabilities #通道范围内对于orderer以及peer版本的兼容性
V2_0: true #对于高于v2.0版本的orderer以及peer的镜像均被兼容,低于v1.3版本将不被兼容
Orderer: &OrdererCapabilities #对于排序节点orderer的版本兼容性指定
V_0: true #低于v2.0版本的orderer在排序服务上不被兼容
Application: &ApplicationCapabilities #对于与应用之间进行交互的peer节点的版本兼容性的指定
V2_0: true #低于v2.0的peer节点在应用上不被兼容
Profiles: #配置模版部分,这部分中大部分会引用上面的配置,根据这里的key来产生通道文件,创世块等
TwoOrgsOrdererGenesis: #这部分为配置orderer的排序服务,用来产生创世区块文件,文件内主要包含orderer的组织配置,orderer的共识选型,这里的共识类型为raft.
<<: *ChannelDefaults #这里引用上述的通道默认配置
Capabilities: #这里引用了上面关于通道服务对peer,orderer版本兼容的配置,这里因为ChannelDefaults中已经引用过ChannelCapabilities,这里并不需要配置,但是如果这里引用其他的配置,会覆盖原有的配置
<<: *ChannelCapabilities
Orderer: #这里指定了系统通道的配置信息
<<: *OrdererDefaults #这里引用了上面关于排序服务的配置
OrdererType: etcdraft #这里是关于排序服务的共识类型的配置,由于OrdererDefaults中选择的共识为solo,这里再此配置,则将会把solo的配置覆盖掉
Organizations: #系统通道中包含的组织
- *OrdererOrg #引用了上面orderer组织的配置
Capabilities:
<<: *OrdererCapabilities #引用了排序服务对peer,orderer节点版本的兼容配置
Application: #指定应用通道的配置
<<: *ApplicationDefaults #引用了上面应用通道的配置
Organizations: #指定应用通道包含的组织以及联盟
- <<: *OrdererOrg #引用orderer组织的配置
Consortiums: #指定应用通道下的联盟
SampleConsortium: #这里配置的为应用通道联盟
Organizations:
- *Org1 #引用Org1组织的配置
- *Org2. #引用Org2组织的配置
TwoOrgsChannel: #应用通道配置
Consortium: SampleConsortium #引用通道上面配置的联盟
<<: *ChannelDefaults #通道默认配置
Application: #应用通道的配置信息
<<: *ApplicationDefaults #默认的应用配置
Organizations: #应用通道的组织信息
- *Org1
- *Org2
Capabilities:
<<: *ApplicationCapabilities #引用的应用服务对于peer,orderer版本兼容性
由于篇幅的原因,对于通道配置,做以下几点补充:
●关于Policies策略部分,在Fabric1.2中实现,官方称之为ACL(Access control list),这些策略均与fabric网络中的各种资源挂钩,用户与Fabric交互,需要通过,系统链码,用户链码以及事件流等,这些均属于访问控制策略下管理的资源,访问控制策略可以通过两种方式构建,一种为Signature策略,另一种为ImplicitMeta策略,Signature为正常的签名策略,会指定组织内的哪些角色或者成员来签名,这里角色指启动NodeOU后的peer,client,admin等,ImplicitMeta策略由多个SIgnature策略作为子策略组成,一般需要多个签名才能满足策略。
●关于Capabilities字段,在Fabric的1.1.0版本中实现,官方主要是为了避免不同不兼容版本的orderer,peer的混用,比如,对于每笔交易的校验时,不兼容的版本peer会产生不同的结果,老版本的peer会因为识别不了交易而导致交易的失败,从而关于这笔交易的键值对在新旧版本的peer的世界状态中就会不同,这里的版本兼容性不不指fabric中的各种特性,如果想要使用fabric中的某一个特性,需要参照官方文档找到合适的版本,比如想使用raft共识,需要使用orderer版本为1.4.1以上的才可以。
3.2 Fabric网络中各节点的配置解析
Fabric网络中包含peer,orderer,fabric-ca等节点,节点的配置决定了节点的行为,想要一个定制化的Fabric网络,了解节点配置的作用是必要的。本节将从orderer, peer的docker启动配置开始,对每个环境变量的作用进行解析。
3.2.1 Orderer节点的docker配置解析
orderer节点的配置解析,下面代码块为orderer1节点的docker配置文件,每行配置均附上解释。
version: \\\'2\\\'
volumes:
orderer1.example.com:
services:
orderer1.example.com: #orderer1服务名称
container_name: orderer1.example.com #orderer1的容器名称
image: hyperledger/fabric-orderer:latest #容器启动使用的基础镜像
environment: #环境变量
- FABRIC_LOGGING_SPEC=INFO #orderer1节点打印日志的级别,常用的有info, debug
- GODEBUG=netdns=go #这里指定了DNS解析使用go解析器,这样DNS请求的阻塞只消耗一个groutine,有效减小消耗资源
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0 #服务绑定的监听地址,一般为全网(0.0.0.0),也可以指定特定的网络接口地址
- ORDERER_GENERAL_GENESISMETHOD=file #指定持久化数据的方式,fabric1.4中一般为file,也可以指定为内存
- ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block #指定创世块文件的位置,创世块文件由configtx.yaml配合二进制工具configtxgen产生
- ORDERER_GENERAL_LOCALMSPID=OrdererMSP #orderer的MSPID,在configtx.yaml中配置
- ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp #orderer的msp路径,
# enabled TLS
- ORDERER_GENERAL_TLS_ENABLED=true #与其他节点通信是否开启tls
- ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key #tls私钥路径
- ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt #tls证书路径
- ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] #根Ca证书列表,用于校验客户端身份
- ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt #双向TLS认证时,作为服务端证书的文件路径
- ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key #双向TLS认证时,作为客户端私钥的文件路径
- ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt] #信任的根证书列表
working_dir: /opt/gopath/src/github.com/hyperledger/fabric #dock er内部工作路径
command: orderer #启动命令
volumes:
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block #将产生的创世块文件映射到docker内部
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/msp:/var/hyperledger/orderer/msp #将orderer1的msp目录映射到docker内部
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer1.example.com/tls/:/var/hyperledger/orderer/tls #将orderer1的tls目录映射到dock er内部
- orderer1.example.com:/var/hyperledger/production/orderer #将orderer产生的配置块文件映射到本地,这里需要注意,重新启动fabric网络时,需要清理本地持久化的文件,否则,旧的文件信息会加载到新的fabric网络中,导致创建通道等操作的失败。
ports:
- 7050:7050 #提供服务的端口
peer节点的配置解析,下面代码块为peer1节点的docker配置文件,每行配置均附上解释。
version: \\\'2\\\'
volumes:
peer1.org1.example.com:
services:
peer1.org1.example.com: #docker服务命令
container_name: peer1.org1.example.com #docker启动容器名
hostname: peer1.org1.example.com #peer1节点域名
image: hyperledger/fabric-peer:latest #docker启动使用的基础镜像
environment:
- CORE_LEDGER_STATE_STATEDATABASE=CouchDB #peer使用的状态数据库类型,有couchdb,leveldb两种,couchdb支持富查询,leveldb只支持组合键
- CORE_LEDGER_STATE_COUCHDBCONFIG_COUCHDBADDRESS=couchdb0:5984 #指定状态数据库couchdb的域名以及端口
# The CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME and CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD
# provide the credentials for ledger to connect to CouchDB. The username and password must
# match the username and password set for the associated CouchDB.
- CORE_LEDGER_STATE_COUCHDBCONFIG_USERNAME= #指定couchdb连接的用户名,这里与couchdb配置保持一致即可,可以为空
- CORE_LEDGER_STATE_COUCHDBCONFIG_PASSWORD= #指定couchdb连接的密码,这里与couchdb配置保持一致即可,可以为空
- CORE_PEER_ID=peer1.org1.example.com #peerID,在fabric网络中唯一标识其身份
- GODEBUG=netdns=go #这里指定了DNS解析使用go解析器,这样DNS请求的阻塞只消耗一个groutine,有效减小消耗资源
- CORE_PEER_ADDRESS=peer1.org1.example.com:7051 #指定pe er服务域名以及端口
- CORE_PEER_CHAINCODELISTENADDRESS=peer1.org1.example.com:7052 #链码启动监听地址
- CORE_PEER_GOSSIP_EXTERNAL
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/33071.html