Network
Wei Jieyang Lv4

前言

本部分主要讲解生产网络的部署

因为所有的节点等都是在docker容器中跑的,所以

网络配置

相关部分

证书颁发机构

作为整体决策的一部分

  • 必须决定peer(总共多少,每个通道上有多少)以及ordering service(有多少个节点,谁将拥有这些节点)
  • 必须决定组织的CA将如何被部署。

生产网络应使用传输层安全性(TLS),这将需要设置TLS CA并使用它来生成TLS证书。

  • 在enrollment CA之前,需要先部署TLS CA。
  • 详细在“设置CA”部分

Organization

一些组织可能发现有必要建立组织单位,以在某些身份和单个CA创建的MSP之间建立隔离(例如,制造商可能希望其一个组织单位用于其运输部门,而另一个组织单位用于其质量控制部门)。请注意,这与“节点OU”的概念是分开的,在“节点OU”中,身份可以具有编码到其中的角色(例如,“ admin”或“ peer”)。

Database

网络中的某些通道可能要求以状态数据库可以理解的方式对所有数据进行建模,而其他网络可能会优先考虑速度,从而决定所有对等方都将使用LevelDB。请注意,通道上不应有同时使用CouchDB和LevelDB的对等体,因为CouchDB对键和值施加了一些数据限制。在LevelDB中有效的键和值在CouchDB中可能无效。

System Channel

订购节点可以使用称为“系统通道”(可从中创建应用程序通道)的管理通道的配置块来加载,也可以简单地根据需要启动并加入到应用程序通道中。推荐的方法是在没有配置块的情况下进行引导,这是本部署指南假定采用的方法。有关创建系统通道创始块并使用它引导引导节点的更多信息,请参见Fabric v2.2文档中的“部署生产网络”。

Channel and Private Data

某些网络可能会认为,通道是确保某些交易的私密性和隔离性的最佳方法。其他人可能会决定,更少的通道(必要时补充私人数据集)可以更好地满足他们的隐私需求。

Container

不同的用户还可能对他们的容器编排做出不同的决定,为他们的对等进程,日志记录,CouchDB,gRPC通信和链代码创建单独的容器,而其他用户可能决定合并其中的一些过程。

Chaincode

用户可以选择使用build-in build和run support,使用外部构建器和启动器进行自定义的构建和运行,或者使用Chaincode作为外部服务来部署其链代码。

firewall

在生产部署中,属于一个组织的组件可能需要访问其他组织的组件,因此必须使用防火墙和高级网络配置。例如,使用Fabric SDK的应用程序需要访问所有组织的所有endorsing peer以及所有通道上的ordering service。同样,对等方需要从他们接收新块的通道上访问ordering service。

步骤

设置资源集群

推荐:Kubernetes

无论您选择在何处部署组件,都需要确保有足够的资源来使组件有效运行。您需要的大小将在很大程度上取决于您的用例。如果您打算将单个对等方加入到多个大容量通道,则比仅计划加入一个通道时,它需要更多的CPU和内存。粗略估计,在计划分配给单个订购节点时,计划将大约三倍的资源专用于对等方(如下所示,建议在订购服务中至少部署三个,最好部署五个节点) 。同样,与对等端一样,CA大约需要十分之一的资源。您还需要将存储添加到您的群集中(某些云提供商可能会提供存储),因为如果没有先与您的云提供商一起设置存储,就无法配置持久卷和持久卷声明。持久性存储的使用可确保MSP,分类帐和已安装链码之类的数据不存储在容器文件系统中,从而防止在销毁容器时将其销毁。

管理基础架构

用来管理后端的确切方法和工具将取决于所选择的后端。但请注意:

  • 使用机密对象将重要的配置文件安全地存储在群集中。有关Kubernetes机密的信息,请查看Kubernetes机密。您还可以选择使用硬件安全模块(HSM)或加密的永久卷(PV)。同样,在部署Fabric组件之后,您可能希望在自己的后端连接到容器,例如在Docker Hub之类的服务中使用私有仓库。在这种情况下,您将需要以Kubernetes机密的形式对登录信息进行编码,并在部署组件时将其包含在YAML文件中。
  • 群集注意事项和节点大小。在上面的步骤中,我们讨论了有关如何考虑节点大小的总体概述。您的用例以及稳健的开发周期是您真正了解对等方,订购节点和CA的大小的唯一方法。
  • 您如何选择挂载卷。最佳做法是将与您的节点相关的卷挂载到部署节点的外部。这将使您以后可以引用这些卷(例如,重新启动已崩溃的节点或容器),而不必重新部署或重新生成加密材料。
  • 您将如何监视资源。建立用于监视各个节点使用的资源以及通常部署到群集的资源的策略和方法至关重要。当您将同伴加入更多渠道时,可能需要增加其CPU和内存分配。同样,您将需要确保有足够的存储空间用于状态数据库和区块链。

设置CA

CA和MSP

创建CA后,可以使用它们为与组织(由MSP表示)相关的标识和组件创建证书。对于每个组织,至少需要:

  1. register and enroll an admin identity and create an MSP
    • 创建与组织相关联的CA,rigister a user and then enroll an identity (生成用于网络所有实体的证书对)
      1. 由CA管理员分配用于标识身份的用户名和密码。属性和从属关系也可以被提供给身份(例如,一个roleadmin,这是必要的组织管理员)
      2. enroll identity之后可以用用户名和密码来register
    • CA将为此身份生成两个证书,用于对身份采取的操作进行签名
      • 网络其他成员已知的公共证书(也称为“ signcert”或“公共证书”)
      • 私钥(存储在keystore文件夹)。
    • CA还将生成一组文件夹,称为“ MSP”,其中包含颁发证书的CA的公共证书以及该CA的信任根(可能是相同的CA,也可能不是同一CA)。
      • 该MSP可以认为是定义与管理员身份相关联的组织。
      • 如果组织的管理员也将是节点的管理员(这是典型的),则必须在创建节点的本地MSP之前创建组织的管理员身份,因为在之后情况下必须使用节点管理员的证书创建本地MSP
  1. Register and enroll node identities
    • 必须同时使用 enrollment CA和TLS CA(后者生成用于保护通信的证书)register和enroll 节点的身份。而不是给节点一个admin或者user的角色
    • 在向 enrollmentCA注册该节点时,给它一个peerorderer的角色。与管理员一样,也可以分配此身份的属性和从属关系。
    • 节点的MSP结构称为“本地MSP”,因为分配给身份的权限仅在本地(节点)级别相关。此MSP是在创建节点标识时创建的,并在引导节点时使用。

部署peer和orderer

部署节点前先定义其配置文件

  • peer:config/core.yaml
  • ordering node:config/orderer.yaml

三个主要选项可用于调整配置。

  1. 编辑与二进制文件捆绑在一起的YAML文件。
    • 优点:每当关闭并重新启动节点时,都将保留更改
    • 缺点:在升级到新的二进制版本时,必须将自定义的选项移植到新的YAML(升级到新版本时,应使用最新的YAML)。
  2. 部署时使用环境变量替代。
  3. 在CLI命令上指定标志。

可以使用所有大写字母,相关短语之间的下划线和前缀,从相关YAML文件中的参数推断环境变量。例如:

  • peer配置变量称为peer.localMSPid(它是localMSPid内侧可变peer结构部分)在core.yaml将被呈现为所谓的环境变量CORE_PEER_LOCALMSPID
  • 而订购服务环境变量General.LocalMSPIDorderer.yaml配置文件的General所述的部分将被呈现为所谓的环境变量ORDERER_GENERAL_LOCALMSPID

peer

创建

peer由属于渠道成员的组织所有(因此,有时将这些组织称为“对等组织”)。它们连接到订购服务和其他对等方,安装了智能合约,并且是分类帐的存储地。

在创建对等节点之前,必须了解这些角色,因为它们会影响您的自定义和部署决策。要查看您将需要做出的各种决策,请查看规划生产对等体

对等方在config/core.yaml文件中的配置值必须自定义或使用环境变量覆盖。此配置文件与对等映像捆绑在一起,并且也包含在可下载的二进制文件中。有关如何下载产品的core.yaml和对等映像的信息,请查看Deploy the peer

尽管默认的core.yaml中有许多参数,我们只需要自定义其中的一小部分即可。通常,如果不需要更改调整值,请保留默认值。

  • Identifiers:这些标识符不仅包括指向相关本地MSP和传输层安全性(TLS)证书的路径,而且还包括对等方的名称(称为“peer ID”)和拥有对等方的组织的MSP ID。
  • Addresses and paths:因为对等点本身并不是实体,而是与其他对等点和组件交互,所以必须在配置中指定一系列地址。这些地址包其他组件可以用来找到对等点本身的地址,以及可以找到链码的地址(例如,如果您使用外部链码)。同样,您将需要指定分类帐的位置(以及状态数据库类型)和外部构建器的路径(同样,如果您打算使用外部链码)。其中包括“operations”和“metrics”,它们可以设置用于通过配置端点来监视对等方的运行状况和性能的方法。
  • Gossip:Fabric网络中的组件使用“Gossip”协议相互通信。通过此协议,发现服务可以发现它们,并将区块和私有数据相互传播。请注意,Gossip通信使用TLS进行保护。

有关core.yaml其特定参数的更多信息,请查看production peer的清单

当对对等方的配置方式,卷的安装方式以及后端配置感到满意时,可以运行命令来启动对等方(此命令将取决于您的后端配置)。

部署

order

创建

注意:虽然可以在订购服务中添加其他节点,但是这些教程仅介绍创建订购服务的过程。

ordering service负责将已认可的交易按字面意义“订购”到块中,然后对等方验证并提交到其分类帐。

对等方和订购服务之间的主要区别在于

  • 在生产网络中,多个订购节点共同协作以形成通道的“订购服务”(这些节点也称为“消费者集”)。这将创建一系列需要在节点级别和集群级别上做出的重要决策。
  • 其中一些群集决策不是在单个排序节点配置文件orderer.yaml中做出的,而是在configtx.yaml用于生成应用程序通道的创世纪块的文件中做出的。
  • 要查看需要做出的各种决定,请查看规划订购服务

config/orderer.yaml配置文件必须对定制节点文件中的配置值进行自定义或使用环境变量覆盖它们。

此配置文件与订购者映像捆绑在一起,并且还包含在可下载的二进制文件中。有关如何下载产品orderer.yaml订购者映像的信息,请查看“部署订购服务”

尽管默认的orderer.yaml中有许多参数,我们只需要自定义其中的一小部分即可。通常,如果不需要更改调整值,请保留默认值:

  • Identifiers:这些标识符不仅包括指向相关本地MSP和传输层安全性(TLS)证书的路径,还包括拥有订购节点的组织的MSP ID。
  • Addresses and paths:由于订购节点与其他组件交互,因此必须在配置中指定一系列地址。这些地址包其他组件以及operations和Metrics可以在其中找到订购节点本身的地址,这些地址让我们可以设置方法来通过配置端点来监视订购节点的运行状况和性能。

有关orderer.yaml其特定参数的更多信息,请查看生产订购节点的清单

注意:本教程假定引导orderer时将不使用系统通道生成块。取而代之的是,这些节点(或其中的一个子集)将使用创建通道的过程加入到通道中。有关如何创建将通过系统通道创始块自举的订购程序的信息,请参阅Fabric v2.2文档中的“部署订购服务”。

部署

test-network

network up

  • checkPreps
  • CreateOrgs
    • organizations/cryptogen
      • cryptogen generate --config=./organizations/cryptogen/crypto-config.yaml --output="organizations"
      • ./organizations/ccp-generate.sh
    • organizations/fabric-ca
      • docker-compose -f docker/docker-compose-ca.yaml_CA up -d 2>&1
      • . organizations/fabric-ca/registerEnroll.sh –> createOrg
        • enroll ca admin:fabric-ca-client enroll
        • Registering peer0:fabric-ca-client register
        • Registering user:fabric-ca-client register
        • Registering the org admin:fabric-ca-client register
        • Generating the peer0 msp:fabric-ca-client enroll
        • Generating the peer0-tls certificates:fabric-ca-client enroll
        • Generating the user msp:fabric-ca-client enroll
        • Generating the org admin msp:fabric-ca-client enroll
      • ./organizations/ccp-generate.sh
  • docker-compose ${COMPOSE_FILES} up -d 2>&1
    • COMPOSE_FILES:docker目录下,
      • docker-compose-ca:上面的ca模式使用,开启ca的docker
      • docker-compose-couch:-s couchdb 模式下使用,开启couchdb的docker
      • docker-compose-ca:除了couchdb,其他模式均使用

network createChannel

scripts/createChannel.sh

代码工具

下面两个二进制执行文件是使用fabric源码生成的

下载fabric源码之后,进入根目录,编译生成下面的二进制文件

1
2
3
$ cd fabric
$ make cryptogen
$ make configtxgen
  • make生成的可执行文件均在目录 fabric/build/bin

cryptogen

用于生成区块链网络中相应用户的相关证书文件,即组织结构身份文件

  • 编写配置文件 crypto-config.yaml,根据其生成相关的证书等,放在目录 crypto-config 下面

从crypto-config.yaml配置文件中生成用户相应的秘钥和证书文件

1
$ cryptogen generate --config=./crypto-config.yaml --output="organizations"
  • 文件将会生成在 crypto-config.yaml 文件所在路径的文件夹 organizations
    • 一般会创建两种文件peerOrganizationsordererOrganizations
  • 不指定 --output 属性会默认在当前文件夹下建立一个 crypto-config文件夹,并将相关的证书放在该文件夹下

configtxgen

configtxgen模块用来生成orderer的初始化文件channel的初始化文件, 配合cryptogen生成的组织结构身份文件使用,离线生成跟通道有关的配置信息

  • configtxgen模块的配置文件 configtx.yaml 包括Fabric系统初始块、channel初始块文件等信息。
  • 命令参数:
    • -asOrg string #所属组织,也就是为某个特定组织生成配置
    • -channelIDstring #channel名称,如果不指定默认是”testchainid”
    • -inspectBlock string #打印指定区块文件中配置内容
    • -inspectChannelCreateTx string #打印指定创建通道交易的配置文件
    • -outputAnchorPeersUpdate string #生成一个更新锚点的更新channel配置信息
    • -outputBlock string #输出区块文件路径
    • -outputCreateChannelTx string #指定一个路径,来生成channel配置文件
    • -profile string #配置文件中的节点,用于生成相关配置文件,默认是 “SampleInsecureSolo”)
    • -version #显示版本信息

用于生成通道配置的命令:

  1. 生成Orderer服务启动的初始区块(即系统通道的创世区块文件)

    1
    2
    3
    4
    $ configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./config/genesis.block

    # 查看通道配置
    $ configtxgen -profile TwoOrgsOrdererGenesis -inspecBlock ./config/genesis.block
  1. 生成新建应用通道的配置文件(即用于创建应用通道的配置交易文件)

    1
    2
    3
    4
    $ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./config/channel.tx -channelID mychannel

    # 查看配置文件内容
    $ configtxgen -profile TwoOrgsChannel -inspectChannelCreateTx ./config/channel.tx
  1. 生成锚节点配置更新文件

    1
    $ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./config/Org1MSPanchors.tx -channelID mychannel -asOrg Org1MSP

configtxgen的输出很大程度上受控于配置文件 configtx.yaml 的内容,该文件的搜索路径由 环境变量 FABRIC_CFG_PATH 指定。

Fabric CA 命令行

https://www.jianshu.com/p/2159f9043102

Hyperledger Fabric CA由server和client两部分组成。
设置两个环境变量:

1
2
export FABRIC_CA_SERVER_HOME=${PWD}/test-network/organizations/fabric-ca/server
export FABRIC_CA_CLIENT_HOME=${PWD}/test-network/organizations/fabric-ca/client
  • 注意在 fabric-sample 样例中
    • FABRIC_CA_SERVER_HOME = /fabric-ca/orgn
    • FABRIC_CA_CLIENT_HOME = fabric-ca

fabric-ca-server

主要有两个操作 - 初始化server服务、启动server服务

1、初始化server服务

在server启动之前,需要至少有一个自我认证的身份存在,这个步骤主要会创建这个自我认证的身份。

1
2
#${FABRIC_CA_SERVER_HOME} 目录下执行
${FABRIC_CA_SERVER_HOME}fabric-ca-server init -b admin:adminpw

命令执行完成后生成如下4个文件:

  • server配置文件:
    • ${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml
  • server内部存储数据库文件
    • ${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db
    • 是一个sqlite文件,包含三个表
  • 自我认证身份的证书文件
    • ${FABRIC_CA_SERVER_HOME}/ca-cert.pem
  • 自我认证身份的私钥(private key)文件
    • ${FABRIC_CA_SERVER_HOME}/msp/keystore/*d_sk

2、启动server服务

1
${FABRIC_CA_SERVER_HOME}/fabric-ca-server start -b admin:adminpw
  • 启动过程使用默认的配置文件,即在初始化阶段生成的${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml,如果需要使用非默认配置文件,只需要通过命令行参数 --config 指定文件名即可。

另,我们看到server端的主要操作有两步完成,第一步初始化,第二步启动;实际上两步可以合并成一步,即直接执行第二步启动就可以,因为在启动过程中如果发现还没有进行过初始化,那么会自动执行初始化的操作;

那为什么需要分成两步呢?因为初始化完成之后用户可能需要对配置文件进行修改,调整参数和配置,然后在启动,而如果直接执行第二步就没有机会修改和调整配置了。

启动完之后可以发送如下命令检查时候工作正常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ curl -i -uadmin:adminpw -X POST -H "Content-type:application/json" http://localhost:7054/cainfo
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 10 Oct 2017 05:42:16 GMT
Content-Length: 1127

{
"success":true,
"result":{
"CAName":"",
"CAChain":"LS0tLS1CRUdJT......tLS0K"
},
"errors":[],
"messages":[]
}

fabric-ca-client

管理身份(包括属性管理)和证书(包括续订和回收)

3、完成自证管理员身份认证

自证管理员是在server启动的时候就内置进去的;后面的很多操作都需要管理员的身份,所以这一步先要获取管理员的身份资格,才能往下操作,比如添加新的角色身份,添加新的管理员等等。

1
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

4、

5、

配置文件

configtx.yaml

crypto-config.yaml

fabric 网络用户拓扑关系配置文件

生成 crypto-config.yaml 的模版:

1
$ ./bin/cryptogen showtemplate > crypto-config.yaml
  • 会在当前目录下生成 crypto-config.yaml 的模版示例

内容

1

  • Domain:相应组织的顶级域名
  • EnableNodeOUs:启用节点OU划分
  • Template.Count:表示组织下有几个节点,默认名字为peer0、peer1依次类推
  • Users.Count:表示组织下有几个User,默认有一个Admin,User命名从User1开始

docker-compose.yml

  • Post title:Network
  • Post author:Wei Jieyang
  • Create time:2021-03-22 18:15:31
  • Post link:https://jieyang-wei.github.io/2021/03/22/fabric-Deploying Network/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.