您好,登录后才能下订单哦!
# fabric示例e2e_cli中network_setup.sh流程详解
## 目录
1. [脚本概述](#脚本概述)
2. [环境准备阶段](#环境准备阶段)
3. [证书生成过程](#证书生成过程)
4. [创世区块与通道配置](#创世区块与通道配置)
5. [节点启动流程](#节点启动流程)
6. [通道创建与加入](#通道创建与加入)
7. [链码安装与实例化](#链码安装与实例化)
8. [测试验证阶段](#测试验证阶段)
9. [常见问题分析](#常见问题分析)
10. [脚本优化建议](#脚本优化建议)
<a id="脚本概述"></a>
## 1. 脚本概述
`network_setup.sh`是Hyperledger Fabric示例项目`e2e_cli`中的核心自动化脚本,位于`fabric-samples/first-network`目录下。该脚本完整实现了从零开始搭建Fabric网络的全过程,包括:
- 证书颁发机构(CA)的配置
- 排序服务(Orderer)的启动
- 对等节点(Peer)的部署
- 通道(Channel)的创建与管理
- 链码(Chaincode)的安装与实例化
```bash
#!/bin/bash
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# 主要函数调用流程
function networkUp() {
generateCerts
replacePrivateKey
generateChannelArtifacts
...
}
脚本首先通过scripts/utils.sh
加载环境变量:
# 引入工具函数
. scripts/utils.sh
# 设置默认值
: ${CONTNER_CLI:="docker"}
: ${CONTNER_CLI_COMPOSE:="${CONTNER_CLI}-compose"}
: ${TIMEOUT:="60"}
e2e_cli示例网络包含以下组件:
组件类型 | 数量 | 组织归属 | 服务端口 |
---|---|---|---|
Orderer节点 | 1 | OrdererOrg | 7050 |
Peer节点 | 4 | Org1/Org2 | 7051-7054 |
CLI客户端 | 1 | 无 | 无 |
CouchDB | 4 | 与Peer节点对应 | 5984-5987 |
脚本会验证必要的工具是否安装:
# 检查cryptogen工具是否存在
which cryptogen
if [ "$?" -ne 0 ]; then
echo "cryptogen tool not found. exiting"
exit 1
fi
使用cryptogen
根据crypto-config.yaml
生成所有节点的证书和密钥:
function generateCerts() {
if [ -d "crypto-config" ]; then
rm -Rf crypto-config
fi
set -x
cryptogen generate --config=./crypto-config.yaml
res=$?
set +x
...
}
生成的crypto-config
目录包含:
crypto-config/
├── ordererOrganizations
│ └── example.com
│ ├── ca
│ ├── msp
│ └── orderers
└── peerOrganizations
├── org1.example.com
│ ├── ca
│ ├── msp
│ ├── peers
│ └── users
└── org2.example.com
├── ca
├── msp
├── peers
└── users
由于Docker Compose模板中使用固定路径引用私钥,需要进行动态替换:
function replacePrivateKey() {
# 为Orderer组织替换私钥
CURRENT_DIR=$PWD
cd crypto-config/ordererOrganizations/example.com/ca/
PRIV_KEY=$(ls *_sk)
cd "$CURRENT_DIR"
sed $OPTS "s/CA1_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml
...
}
生成Orderer服务所需的创世区块和通道配置:
function generateChannelArtifacts() {
if [ -d "channel-artifacts" ]; then
rm -Rf channel-artifacts
fi
mkdir channel-artifacts
# 生成创世区块
set -x
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
res=$?
set +x
...
}
使用的configtx.yaml
定义了网络拓扑:
Profiles:
TwoOrgsOrdererGenesis:
Orderer:
<<: *OrdererDefaults
Organizations:
- *OrdererOrg
Consortiums:
SampleConsortium:
Organizations:
- *Org1
- *Org2
TwoOrgsChannel:
Consortium: SampleConsortium
Application:
<<: *ApplicationDefaults
Organizations:
- *Org1
- *Org2
文件名 | 用途 | 生成命令参数 |
---|---|---|
genesis.block | 排序服务创世区块 | -profile TwoOrgsOrdererGenesis |
channel.tx | 通道配置交易 | -profile TwoOrgsChannel |
Org1MSPanchors.tx | Org1的锚节点更新 | -asOrg Org1MSP |
Org2MSPanchors.tx | Org2的锚节点更新 | -asOrg Org2MSP |
网络使用三个Compose文件:
docker-compose-e2e.yaml
- 基础服务docker-compose-couch.yaml
- CouchDB扩展docker-compose-cli.yaml
- CLI客户端version: '2'
services:
orderer.example.com:
container_name: orderer.example.com
image: hyperledger/fabric-orderer:$IMAGE_TAG
environment:
- ORDERER_GENERAL_LOGLEVEL=debug
ports:
- 7050:7050
volumes:
- ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
- ./crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp:/var/hyperledger/orderer/msp
# 启动网络
function networkUp() {
...
${CONTNER_CLI_COMPOSE} -f docker-compose-cli.yaml up -d 2>&1
${CONTNER_CLI} logs -f cli
}
# 创建通道
peer channel create -o orderer.example.com:7050 -c $CHANNEL_NAME -f ./channel-artifacts/channel.tx
# 各Peer加入通道
for org in 1 2; do
for peer in 0 1; do
CORE_PEER_ADDRESS=peer${peer}.org${org}.example.com:7051 \
peer channel join -b mychannel.block
done
done
# 更新Org1的锚节点
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME \
-f ./channel-artifacts/Org1MSPanchors.tx
# 更新Org2的锚节点
peer channel update -o orderer.example.com:7050 -c $CHANNEL_NAME \
-f ./channel-artifacts/Org2MSPanchors.tx
# 在Org1的Peer0上安装链码
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
# 在Org2的Peer0上安装链码
CORE_PEER_ADDRESS=peer0.org2.example.com:7051 \
peer chaincode install -n mycc -v 1.0 -p github.com/chaincode/chaincode_example02/go/
peer chaincode instantiate -o orderer.example.com:7050 -C $CHANNEL_NAME \
-n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' \
-P "AND ('Org1MSP.peer','Org2MSP.peer')"
# 查询a的余额
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
# 预期结果: 100
# a向b转账10
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode invoke -o orderer.example.com:7050 -C $CHANNEL_NAME \
-n mycc -c '{"Args":["invoke","a","b","10"]}'
现象:cryptogen
执行报错
原因:crypto-config.yaml
格式错误
解决:检查YAML文件缩进和语法
现象:端口已被占用
解决:
# 清理旧容器
docker rm -f $(docker ps -aq)
# 清理网络
docker network prune
现象:实例化命令长时间挂起
原因:Peer节点未正确加入通道
解决:检查各Peer的日志确认通道加入状态
# 等待Peer节点就绪
function waitForPeer() {
local peer=$1
while ! docker exec $peer peer channel list >/dev/null 2>&1; do
sleep 1
done
}
扩展脚本以支持创建多个通道:
# 添加通道名称参数
CHANNEL_NAME=${1:-mychannel}
# 统一收集日志
function collectLogs() {
mkdir -p logs
for container in $(docker ps -q); do
docker logs $container > logs/${container}.log 2>&1
done
}
总结:network_setup.sh
作为Fabric网络部署的经典示例,完整展示了从证书生成到链码部署的全流程。通过分析该脚本,开发者可以深入理解Fabric网络的组成和运作机制,为实际项目部署提供重要参考。
“`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。