Pinvon's Blog

所见, 所闻, 所思, 所想

二 部署Hyperledger Fabric

概述

Hyperledger Fabric v1.0以后, 网络中支持了多通道的特性. 使用一条独立的系统通道负责管理网络中的各种配置信息, 并完成对其他应用通道的创建.

启动Fabric网络的流程

  1. 预备网络内各项配置, 包括网络中成员的组织结构和对应的身份证书; 生成系统通道的初始配置区块文件; 新建应用通道的配置更新交易文件; (如果需要)主节点配置更新交易文件.
  2. 使用系统通道的初始配置区块文件启动排序节点, 排序节点启动后自动按照指定配置创建系统通道.
  3. 不同的组织按照预置角色分别启动Peer节点. 此时网络中不存在应用通道, Peer节点也没有加入网络.
  4. 使用新建应用通道的配置更新交易文件, 向系统通道发送交易, 创建新的应用通道.
  5. 让对应的Peer节点加入所创建的应用通道中, 准备接收交易.
  6. 用户通过客户端向网络中安装注册链码, 链码容器启动成功后, 用户可对链码进行调用, 将交易发送到网络中.

本地部署Hyperledger Fabric

安装

也可以不必自己编译镜像文件, 直接下载即可. 在安装完 Git, Go, Docker 后, 下载 Fabric 源码.

下载Docker镜像文件

cd fabric/scripts

# 不下载二进制文件
sed -i 's/curl/#curl/g' bootstrap.sh

./bootstrap.sh

镜像文件下载完成后, 输入 docker images, 可以看到如下内容:

32.png

其中, REPOSITORY 表示镜像的仓库名称, 每个仓库下面都有许多不同版本的镜像文件, TAG 就是这个镜像文件的版本, 一般 TAGlatest主机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 来查看已经启动的容器. (容器就是镜像文件的一个实例, 类似于类和对象的关系)

37.png

创建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

38.png

安装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"]}'

39.png

调用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"]}'

40.png

可以看到, 转账过后, a的值变成了90, b的值变成了210.

节点的配置参数传递规则

程序在启动的时候, 会读取配置文件和环境变量的值, 如 fabric-samples/basic-network/docker-compose.yml 中的 ORDERER_GENERAL_LOGLEVEL=debug, 这是传递给节点的参数, 传递参数的方法有环境变量, 配置文件, 动态环境变量, 默认值等. 获取参数的流程如下图所示:

33.png

每种组件的环境变量都要单独设置, 每个环境变量的名称都有前缀, 如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 目录中. 目录结构如图所示:

70.png

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 生成的组织结构身份文件使用, 离线生成跟通道有关的配置信息.

主要功能:

  1. 生成启动 Orderer 需要的创世区块, 并支持检查区块内容;
  2. 生成创建应用通道需要的配置交易, 并支持检查交易内容;
  3. 生成 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 信息.

一个例子:

Comments

使用 Disqus 评论
comments powered by Disqus