4. 生成网络配置:使用cryptogen生成证书,使用configtxgen生成创世区块

好,咱们进入实战环节。前面我们把环境搭好了,工具也装齐了。现在要做的,就是让Fabric网络真正跑起来的第一步——生成网络配置。

说白了,这一步就是给网络里的每个成员发“身份证”,再给整个网络写一份“宪法”。身份证由cryptogen来发,宪法由configtxgen来写。我在好几个项目里都见过新手在这步卡住,不是证书路径写错,就是配置文件名打错。嗯,咱们今天把它彻底理清楚。

4.1 为什么需要cryptogen和configtxgen?

你想想看,一个智能家居网络里,有门锁、摄像头、温控器,还有你家人的手机App。这些设备要互相通信,总得有个身份认证吧?不然谁都能冒充你的门锁发指令,那不乱套了。

cryptogen就是干这个的。它根据你写好的配置文件,批量生成每个组织、每个节点的证书和密钥。我习惯把它叫做“证书印刷机”——你给个模板,它哗啦啦印出一堆证书。

那configtxgen呢?它负责生成网络的初始配置。包括:

  • 创世区块——整个区块链的第一块
  • 通道配置——哪些组织能加入哪个通道
  • 锚节点配置——跨组织通信的入口

这两个工具配合起来,就能把一个空白的Fabric网络初始化好。我在做第一个生产项目时,就因为创世区块里的策略写错了,导致后面通道一直创建失败。所以这块内容,咱们得仔细过。

核心概念速览:

  • cryptogen:生成MSP(Membership Service Provider)证书体系
  • configtxgen:生成创世区块和通道配置
  • 两者关系:先有证书,后有配置。证书是身份,配置是规则

4.2 准备配置文件

在动手跑命令之前,得先准备好两个配置文件。一个是crypto-config.yaml,告诉cryptogen要生成哪些组织的证书;另一个是configtx.yaml,告诉configtxgen网络的结构和策略。

我习惯在项目根目录下建一个network文件夹,把所有配置文件放进去。这样结构清晰,后面改起来也方便。

4.2.1 crypto-config.yaml 示例

这个文件定义了组织结构和节点数量。咱们以智能家居场景为例:

# crypto-config.yaml
OrdererOrgs:
  - Name: Orderer
    Domain: homeiot.com
    Specs:
      - Hostname: orderer

PeerOrgs:
  - Name: HomeOwner
    Domain: homeowner.homeiot.com
    Template:
      Count: 2
    Users:
      Count: 1

  - Name: DeviceVendor
    Domain: devicevendor.homeiot.com
    Template:
      Count: 2
    Users:
      Count: 1

这里我定义了一个排序组织(Orderer)和两个参与组织:房主(HomeOwner)和设备厂商(DeviceVendor)。每个参与组织有2个Peer节点和1个普通用户。

我的经验:刚开始做实验时,Users.Count设成1就够了。生产环境里,这个数字要根据实际管理员数量来定。我曾经在一个项目里设了50个用户,结果大部分都用不上,反而增加了管理复杂度。

4.2.2 configtx.yaml 核心配置

这个文件比较长,我挑几个关键部分说:

# configtx.yaml 核心片段
Profiles:
  HomeIoTGenesis:
    Orderer:
      <<: *OrdererDefaults
      Organizations:
        - *OrdererOrg
    Consortiums:
      HomeIoTConortium:
        Organizations:
          - *HomeOwner
          - *DeviceVendor

这个Profile定义了创世区块的结构。注意看Consortiums部分——它指定了哪些组织能加入这个联盟。我见过有人把组织名写错了,结果后面创建通道时一直报“组织未找到”的错误。所以这里一定要和crypto-config.yaml里的组织名保持一致。

4.3 运行cryptogen生成证书

配置文件准备好了,咱们来跑命令。先进入network目录:

cd ~/homeiot/network
cryptogen generate --config=./crypto-config.yaml

命令跑完后,你会看到一个crypto-config目录生成。它的结构是这样的:

crypto-config/
├── ordererOrganizations/
│   └── homeiot.com/
│       ├── orderers/
│       │   └── orderer.homeiot.com/
│       ├── msp/
│       └── users/
└── peerOrganizations/
    ├── homeowner.homeiot.com/
    │   ├── peers/
    │   │   ├── peer0.homeowner.homeiot.com/
    │   │   └── peer1.homeowner.homeiot.com/
    │   ├── msp/
    │   └── users/
    └── devicevendor.homeiot.com/
        └── ...

注意:每次运行cryptogen generate都会重新生成所有证书。如果你之前有旧的crypto-config目录,建议先删掉再生成,避免新旧证书混在一起。我曾经因为没清理旧目录,导致Peer节点启动时加载了过期证书,折腾了半天才找到原因。

4.4 运行configtxgen生成创世区块

证书有了,接下来生成创世区块。先设置环境变量,告诉configtxgen去哪里找配置文件:

export FABRIC_CFG_PATH=$PWD
configtxgen -profile HomeIoTGenesis -outputBlock ./channel-artifacts/genesis.block

这里-profile参数指定了使用configtx.yaml里的哪个Profile。-outputBlock指定了创世区块的输出路径。我习惯把生成的文件放在channel-artifacts目录下,这样结构清晰。

命令成功执行后,你会看到类似这样的输出:

2024/01/15 10:30:00 [INFO] Generating genesis block
2024/01/15 10:30:00 [INFO] Writing genesis block at channel-artifacts/genesis.block

4.5 生成通道配置和锚节点配置

创世区块只是第一步。要让Peer节点能加入通道,还需要生成通道配置和锚节点配置。我通常一起生成:

# 生成通道配置
configtxgen -profile HomeIoTChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID homeiotchannel

# 生成锚节点配置
configtxgen -profile HomeIoTChannel -outputAnchorPeersUpdate ./channel-artifacts/HomeOwnerMSPanchors.tx -channelID homeiotchannel -asOrg HomeOwnerMSP

configtxgen -profile HomeIoTChannel -outputAnchorPeersUpdate ./channel-artifacts/DeviceVendorMSPanchors.tx -channelID homeiotchannel -asOrg DeviceVendorMSP

这里HomeIoTChannel是另一个Profile,专门用于通道配置。我在configtx.yaml里定义它时,指定了哪些组织能加入这个通道,以及通道的共识策略。

生成的文件清单:

文件 用途 生成工具
crypto-config/ 所有组织的证书和密钥 cryptogen
genesis.block 排序服务的初始区块 configtxgen
channel.tx 创建通道的配置交易 configtxgen
*MSPanchors.tx 各组织的锚节点配置 configtxgen

4.6 验证生成结果

文件都生成了,怎么确认没问题?我一般做三步检查:

  1. 检查证书目录结构:确保每个组织都有msp、peers、users目录
  2. 检查创世区块大小:用ls -lh channel-artifacts/genesis.block,正常应该在几KB到几十KB
  3. 检查配置文件一致性:对比crypto-config.yaml和configtx.yaml里的组织名、域名是否一致

我曾经在一个项目里,因为configtx.yaml里把组织名写成了复数形式,而crypto-config.yaml里是单数,结果Peer节点启动时一直报MSP错误。所以这个一致性检查,千万别跳过。

4.7 整体流程回顾

咱们用一张图来总结整个流程:

网络配置生成流程 crypto-config.yaml configtx.yaml cryptogen generate configtxgen crypto-config/ 组织证书、节点证书、用户证书 channel-artifacts/ genesis.block, channel.tx, 锚节点配置 先跑cryptogen,再跑configtxgen,顺序不能乱

从图上可以看得很清楚:crypto-config.yaml喂给cryptogen,产出证书目录;configtx.yaml喂给configtxgen,产出创世区块和通道配置。这两个流程是串行的——必须先有证书,因为创世区块里要引用证书路径。

我的习惯:每次生成完配置,我都会把channel-artifacts目录备份一份。万一后面操作失误把配置搞乱了,可以直接恢复,不用重新生成。特别是创世区块,一旦排序服务启动后就不能改了。

好了,证书和创世区块都准备好了。下一步就是启动网络节点,让这些配置真正生效。记住,配置生成只是开始,后面还有更多细节等着我们。但有了这个坚实的基础,后面的路就好走多了。