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 验证生成结果
文件都生成了,怎么确认没问题?我一般做三步检查:
- 检查证书目录结构:确保每个组织都有
msp、peers、users目录 - 检查创世区块大小:用
ls -lh channel-artifacts/genesis.block,正常应该在几KB到几十KB - 检查配置文件一致性:对比
crypto-config.yaml和configtx.yaml里的组织名、域名是否一致
我曾经在一个项目里,因为configtx.yaml里把组织名写成了复数形式,而crypto-config.yaml里是单数,结果Peer节点启动时一直报MSP错误。所以这个一致性检查,千万别跳过。
4.7 整体流程回顾
咱们用一张图来总结整个流程:
从图上可以看得很清楚:crypto-config.yaml喂给cryptogen,产出证书目录;configtx.yaml喂给configtxgen,产出创世区块和通道配置。这两个流程是串行的——必须先有证书,因为创世区块里要引用证书路径。
我的习惯:每次生成完配置,我都会把channel-artifacts目录备份一份。万一后面操作失误把配置搞乱了,可以直接恢复,不用重新生成。特别是创世区块,一旦排序服务启动后就不能改了。
好了,证书和创世区块都准备好了。下一步就是启动网络节点,让这些配置真正生效。记住,配置生成只是开始,后面还有更多细节等着我们。但有了这个坚实的基础,后面的路就好走多了。