二 部署Hyperledger Fabric
Table of Contents
概述
Hyperledger Fabric v1.0以后, 网络中支持了多通道的特性. 使用一条独立的系统通道负责管理网络中的各种配置信息, 并完成对其他应用通道的创建.
启动Fabric网络的流程
- 预备网络内各项配置, 包括网络中成员的组织结构和对应的身份证书; 生成系统通道的初始配置区块文件; 新建应用通道的配置更新交易文件; (如果需要)主节点配置更新交易文件.
- 使用系统通道的初始配置区块文件启动排序节点, 排序节点启动后自动按照指定配置创建系统通道.
- 不同的组织按照预置角色分别启动Peer节点. 此时网络中不存在应用通道, Peer节点也没有加入网络.
- 使用新建应用通道的配置更新交易文件, 向系统通道发送交易, 创建新的应用通道.
- 让对应的Peer节点加入所创建的应用通道中, 准备接收交易.
- 用户通过客户端向网络中安装注册链码, 链码容器启动成功后, 用户可对链码进行调用, 将交易发送到网络中.
本地部署Hyperledger Fabric
也可以不必自己编译镜像文件, 直接下载即可. 在安装完 Git, Go, Docker 后, 下载 Fabric 源码.
下载Docker镜像文件
cd fabric/scripts # 不下载二进制文件 sed -i 's/curl/#curl/g' bootstrap.sh ./bootstrap.sh
镜像文件下载完成后, 输入 docker images
, 可以看到如下内容:
其中, REPOSITORY
表示镜像的仓库名称, 每个仓库下面都有许多不同版本的镜像文件, TAG
就是这个镜像文件的版本, 一般 TAG
有 latest
和 主机CPU类型-版本号-snapshot-代码库版本号
两种, snapshot
和 代码库版本号
只在本地编译时有, 如果是直接从网上拉取的镜像文件, 则没有这些字段.
部署网络
使用 fabric-samples
中已经生成的配置文件来部署网络:
git clone https://github.com/hyperledger/fabric-samples.git cd fabric-samples/basic-network docker-compose -f docker-compose.yml up -d
网络启动后, 可以通过 docker ps
来查看已经启动的容器. (容器就是镜像文件的一个实例, 类似于类和对象的关系)
创建channel
# 切换到管理员用户 docker exec -it -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com bash peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx
加入channel
peer channel join -b mychannel.block
安装chaincode
# 退出peer0.org1.example.com容器 exit # 进入CLI容器(CLI容器相当于客户端) docker exec -it cli /bin/bash # 安装chaincode peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02/go
实例化chaincode
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v v0 -c '{"Args": ["init", "a", "100", "b", "200"]}'
调用chaincode
实例化chaincode后, 可以查看初始值. 这些操作都是在CLI容器中进行:
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args": ["query", "a"]}'
调用chaincode查询
# 转账 peer chaincode invoke -C mychannel -n mycc -v v0 -c '{"Args":["invoke","a","b","10"]}' peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args": ["query", "a"]}'
可以看到, 转账过后, a的值变成了90, b的值变成了210.
节点的配置参数传递规则
程序在启动的时候, 会读取配置文件和环境变量的值, 如 fabric-samples/basic-network/docker-compose.yml
中的 ORDERER_GENERAL_LOGLEVEL=debug, 这是传递给节点的参数, 传递参数的方法有环境变量, 配置文件, 动态环境变量, 默认值等. 获取参数的流程如下图所示:
每种组件的环境变量都要单独设置, 每个环境变量的名称都有前缀, 如ORDERER_GENERAL_LOGLEVEL的前缀是ORDERER, 它属于Orderer节点; 前缀是CORE的是Peer节点.
yaml配置文件
查看 fabric/examples/e2e_cli/base/docker-compose-base.yaml
配置文件. 此处给出其中一些选项的解释.
选项 | 举例 | 说明 |
---|---|---|
version | version:'2' | 采用version2的语法 |
services | 定义服务列表 | |
orderer.example.com | 根据服务名称自定义 | 自定义的服务名称, 需要唯一 |
container_name | container_name: orderer.example.com | 容器名称 |
image | image:hyperledger/fabric-orderer | 容器使用的镜像文件 |
environment | -CORE_PEER_LOCALMSPID=Org1MSP | 传递给容器的环境变量 |
working_dir | working_dir:/opt/gopath/src/github.com/hyperledger/fabric | 容器启动的工作目录 |
command | command:orderer | 容器启动命令 |
volumes | - var/run:/host/var/run | 宿主机和容器之间的目录映射 |
ports | - 7050:7050 | 宿主机和容器之间的端口映射 |
extends | file: common.yml | 服务扩展, 基于common.yml文件 |
extends | service:peer-base | 服务扩展, 基础服务是peer-base |
配置
简介
每个节点启动时, 可以通过读取本地配置文件来设置参数, 也可以通过环境变量指定的配置来设置参数, 还可以通过命令行参数来设置参数. 这三种方式可以互相结合使用. 如果三种方式都设置了某个参数, 优先级为: 命令行参数 > 环境变量 > 配置文件.
默认情况下, 各个节点的主配置路径为 FABRIC_CFG_PATH
环境变量所指向的路径, 一般该环境变量指向 /etc/hyperledger/fabric
.
在生产环境下, /etc
目录下写文件, 一般要超级权限, 所以更建议指定到 /var/hyperledger/production
.
节点
节点 | 默认配置文件路径 | 配置指定方式 | 主要功能 |
---|---|---|---|
Peer节点 | $FABRIC_CFG_PATH/core.yaml | 配置文件, 环境变量, 命令行参数 | 指定Peer节点运行时的参数 |
Orderer节点 | $FABRIC_CFG_PATH/orderer.yaml | 配置文件, 环境变量, 命令行参数 | 指定Orderer运行时的参数 |
配置管理工具
工具 | 默认配置文件路径 | 主要功能 |
---|---|---|
cryptogen | 通过命令行指定路径 | 负责生成网络中组织结构和身份文件 |
configtxgen | $FABRIC_CFG_PATH/configtx.yaml | 负责生成通道相关配置 |
configtxlator | 转换配置文件成可读的形式 |
Peer节点配置
如果从环境变量中读取配置信息, 需要以 CORE_
前缀打头. 如配置 peer.id
, 环境变量应为 CORE_PEER_ID
.
Peer节点读取配置文件时, 先查找 $FABRIC_CFG_PATH/core.yaml
. 如果没找到, 则查找 ./core.yaml
. 如果没找到, 则查找 /etc/hyperledger/fabric/core.yaml
.
Fabric 也有提供 core.yaml 的参考配置, 在目录 sampleconfig/core.yaml
中.
core.yaml
中一般包括 logging, peer, vm, chaincode, ledger
五个部分.
logging
日志. 有 critcal, error, warning, notice, info, debug 六个级别, 越往后级别越低, 输出的内容也越丰富, 默认情况下为 info 级别.
logging: peer:info cauthdsl:warning gossip:warning ledger:info msp:warning policies:warning grpc:error
日志的输出格式为:
format: '%{color}%{time:2006-01-02 15:04:05.000 MST} [%{module}] %{shortfunc} -> %{level:.4s} %{id:03x}%{color:reset} %{message}'
peer
peer 部分的配置项较多, 可以分为通用配置, gossip, events, tls 等多个部分.
通用配置
id # peer 在网络中的 id networkId # 网络 id, 可以通过 id 指定多个隔离的网络 listenAddress # 服务器监听的本地地址, 如果有多个网卡, 可以指定监听某网卡, 默认情况下监听本地所有网卡(0.0.0.0), 端口号为 7051 chaincodeListenAddress # 链码容器监听的地址, 不指定则为 listenAddress, 在生产环境中, 建议指定, 端口号为 7052 address # 外部访问服务的地址 addressAutoDetect # 是否自动探测服务地址, 如果 peer 的运行环境是动态分配地址的, 该配置可以进行自动探测, 探测将内部地址作为服务地址. 如果启用 TLS, 则建议关闭该配置项 gomaxprocs # 配置运行该 Go 应用的最大进程数
cryptogen
该工具生成组织身份配置.
在Fabric网络中, 需要通过证书和密钥来管理和鉴别成员身份, 所以需要进行证书生成和配置操作. 在开发环境下, Fabric提供了cryptogen工具来提高证书管理的效率. 但是在生产环境中, 我们需要使用PKI服务来手动实现单个证书的签发.
cryptogen可以快速根据配置自动批量生成所需要的密钥和证书文件.
配置文件crypto-config.yaml
crypto-config.yaml
会指定网络的拓扑结构. 主要包括两种组织信息:
OrdererOrgs
: 构成Orderer集群的节点所属组织
PeerOrgs
: 构成Peer集群的节点所属组织
每个组织拥有:
Name
: 组织名称
Domain
: 组织的命名域
CA
: 组织的CA地址, 包括Hostname域
若干节点
: 每个节点包括 Hostname, CommonName, SANS等域. 可以用Specs字段指定一组节点, 或用Template字段指定自动生成节点的个数
User
: 自动生成除admin外的用户个数
每个主机的配置一般可以通过Specs来指定或通过Template来自动顺序生成. 默认通用名为 主机名.组织域
. 如, 域 org1.example.com
中, Peer节点的名称可能为 peer0.org1.example.com
, peer1.org1.example.com
等.
例子
OrdererOrgs: - Name: Orderer Domain: example.com CA: Country: US Province: California Locality: San Francisco Specs: - Hostname: orderer PeerOrgs: - Name: Org1 Domain: org1.example.com EnableNodeOUs: true CA: Country: US Province: California Locality: San Francisco Template: Count: 2 Users: Count: 1 - Name: Org2 Domain: org2.example.com EnableNodeOUs: true CA: Country: US Province: California Locality: San Francisco Template: Count: 2 Users: Count: 1
例子中, Orderer组织通过Specs字段, 指定了主机名为orderer, 加上组织域, 就是orderer.example.com
Peer组织则通过Template来自动生成了Count个数的主机. Users字段下的Count字段会让cryptogen工具以自动顺序生成指定个数的普通用户.
因此, 该例子生成了两个节点和一个普通用户.
生成密钥和证书文件
cryptogen工具生成的文件会放在当前目录下的 crypto-config
目录中. 目录结构如图所示:
fabric v1.1中, 每个组织下都有5个目录: ca, msp, tlsca, users, peers/orderers
.
ca: 存放组织的根证书和对应的私钥文件, 默认采用EC算法, 证书为自签名(一般情况下, 根证书都是自签名). 组织内的实体将基于该证书作为根证书.
msp: 存放代表该组织的身份信息. msp下有 admincerts, cacerts, tlscacerts
三个目录.
- admincerts: 组织管理员的身份验证证书, 被根证书签名.
- cacerts: 组织的根证书, 与ca目录下的文件一样.
- tlscacerts: 用于TLS的CA证书, 自签名.
tlsca: 存放tls相关的私钥和证书.
users: 用户信息, 里面包括msp证书和tls证书.
peers: 存放属于该组织的所有Peer节点.
- peer0: 第1个Peer节点的信息, 包括msp证书和tls证书. msp(这个msp是peers里面的msp): 包括
admincerts, cacerts, tlscacerts
三个目录.admincerts
目录里的内容和外层的msp目录下的admincerts
里的内容一样. 同理, 另外两个目录里的内容也分别和外层的msp目录下相应目录里的内容相同.keystore
目录下存放本节点的身份私钥, 用来签名.signcerts
目录下存放的是验证本节点签名的证书, 该证书被组织的根证书签名. tls: 存放tls相关的证书和私钥. ca.crt: 组织的根证书. server.crt: 验证本节点签名的证书, 被组织根证书签名. server.key: 本节点的身份私钥, 用来签名. - peer1: 与peer0类似.
还有很多证书, 私钥等, 作用类似.
最重要的是msp目录下的内容. 一般包括:
- admincerts: 管理员的身份证书文件
- cacerts: 信任的根证书文件
- keystore: 节点的私钥, 用于签名
- signcerts: 节点的证书, 用于证明自己的身份
- tlscacerts: TLS连接用的证书
- intermediatecerts(可选): 信任的中间证书
- crls(可选): 证书撤销列表
- config.yaml(可选): 记录组织中的实体信息, 包括根证书位置和ID信息
这些身份文件随后分别发送到对应的Orderer节点和Peer节点上, 并放到对应的MSP路径下, 用于签名使用.
Orderer: 需要将 crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com 目录下的内容复制以 Orderer 节点的 /etc/hyperledger/fabric 目录下.
Peer: 需要将 crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com 目录下的内容复制到 Peer0 节点的 /etc/hyperledger/fabric 目录下. 其他 Peer 节点也类似.
CLI: 为方便操作, 将完整的 crypto-config 目录复制到 /etc/hyperledger/fabric 目录下. 即, 客户端需要有其他节点的证书.
可以通过 cryptogen showtemplate 查看默认的配置.
configtxgen
在 Fabric 中, 对 channel 的相关配置进行更新, 也要像应用交易一样, 经过网络中节点的共识确认.
configtxgen 工具是一个很重要的辅助工具, 可以配置 cryptogen 生成的组织结构身份文件使用, 离线生成跟通道有关的配置信息.
主要功能:
- 生成启动 Orderer 需要的创世区块, 并支持检查区块内容;
- 生成创建应用通道需要的配置交易, 并支持检查交易内容;
- 生成 Anchor Peer 的更新配置交易;
configtxgen 工具会依次从 $FABRIC_CFG_PATH 指定的路径, 当前路径, /etc/hyperledger/fabric 路径下查找 configtx.yaml 配置文件, 并读取作为默认的配置.
configtx.yaml 文件
configtx.yaml 文件中的内容主要有 profile, organizations, orderer, application 四个部分.
- profile: 定义了一系列通道配置模板, 包括 Orderer 系统通道模板和应用通道类型模板.
- organizations: 定义了一系列的组织结构, 由其他部分引用.
- orderer: 系统通道相关配置, 包括 orderer 服务配置和参与 ordering service 的组织信息.
- application: 应用通道相关配置.
profiles
每个 profile 代表了某种应用场景下的通道配置模板. 它包括 Orderer 系统通道模板和应用通道模板.
Orderer 系统通道模板包括 Orderer, Consortiums.
- Orderer: 指定系统通道的配置信息, 包括 Ordering Service(solo 还是 kafka, ip, 最大应用通道数量等) 和 属于此系统通道的组织信息.
- Consortiums: Orderer 所服务的联盟列表. 每个联盟下面可包含多个组织.
应用通道模板包括 Application, Consortium.
- Application: 指定属于某应用通道的信息, 如属于此通道的组织信息.
- Consortium: 该应用通道所关联的联盟.
在 YAML 文件中, &KEY 表示该字段的内容可以被引用, <<:KEY 表示导入 &KEY 字段的内容.
organizations
组织主要分成 Orderer 组织(系统组织)和普通的应用组织.
Orderer 组织包括名称, ID, MSP文件路径, 管理员策略; Peer 组织除了这些之外, 还有 Anchor Peer 信息.
一个例子:
Generated by Emacs 25.x(Org mode 8.x)
Copyright © 2014 - Pinvon - Powered by EGO