fabric示例e2e_cli中network_setup.sh流程是怎么样的

发布时间:2021-12-28 17:24:48 作者:小新
来源:亿速云 阅读:263
# 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
    ...
}

2. 环境准备阶段

2.1 环境变量设置

脚本首先通过scripts/utils.sh加载环境变量:

# 引入工具函数
. scripts/utils.sh

# 设置默认值
: ${CONTNER_CLI:="docker"}
: ${CONTNER_CLI_COMPOSE:="${CONTNER_CLI}-compose"}
: ${TIMEOUT:="60"}

2.2 网络拓扑结构

e2e_cli示例网络包含以下组件:

组件类型 数量 组织归属 服务端口
Orderer节点 1 OrdererOrg 7050
Peer节点 4 Org1/Org2 7051-7054
CLI客户端 1
CouchDB 4 与Peer节点对应 5984-5987

2.3 依赖检查

脚本会验证必要的工具是否安装:

# 检查cryptogen工具是否存在
which cryptogen
if [ "$?" -ne 0 ]; then
    echo "cryptogen tool not found. exiting"
    exit 1
fi

3. 证书生成过程

3.1 cryptogen工具调用

使用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
    ...
}

3.2 证书目录结构

生成的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

3.3 私钥替换处理

由于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
    ...
}

4. 创世区块与通道配置

4.1 configtxgen工具使用

生成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
    ...
}

4.2 配置文件解析

使用的configtx.yaml定义了网络拓扑:

Profiles:
    TwoOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2

4.3 生成的主要文件

文件名 用途 生成命令参数
genesis.block 排序服务创世区块 -profile TwoOrgsOrdererGenesis
channel.tx 通道配置交易 -profile TwoOrgsChannel
Org1MSPanchors.tx Org1的锚节点更新 -asOrg Org1MSP
Org2MSPanchors.tx Org2的锚节点更新 -asOrg Org2MSP

5. 节点启动流程

5.1 Docker Compose文件解析

网络使用三个Compose文件:

  1. docker-compose-e2e.yaml - 基础服务
  2. docker-compose-couch.yaml - CouchDB扩展
  3. 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

5.2 容器启动顺序

  1. CA服务容器
  2. Orderer排序服务
  3. Peer节点(4个)
  4. CouchDB容器(可选)
  5. CLI客户端容器
# 启动网络
function networkUp() {
    ...
    ${CONTNER_CLI_COMPOSE} -f docker-compose-cli.yaml up -d 2>&1
    ${CONTNER_CLI} logs -f cli
}

6. 通道创建与加入

6.1 在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

6.2 锚节点更新

# 更新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

7. 链码安装与实例化

7.1 链码安装过程

# 在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/

7.2 链码实例化

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')"

8. 测试验证阶段

8.1 查询测试

# 查询a的余额
CORE_PEER_ADDRESS=peer0.org1.example.com:7051 \
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}'
# 预期结果: 100

8.2 交易测试

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

9. 常见问题分析

9.1 证书生成失败

现象cryptogen执行报错
原因crypto-config.yaml格式错误
解决:检查YAML文件缩进和语法

9.2 容器启动冲突

现象:端口已被占用
解决

# 清理旧容器
docker rm -f $(docker ps -aq)
# 清理网络
docker network prune

9.3 链码实例化超时

现象:实例化命令长时间挂起
原因:Peer节点未正确加入通道
解决:检查各Peer的日志确认通道加入状态

10. 脚本优化建议

10.1 增加健康检查

# 等待Peer节点就绪
function waitForPeer() {
    local peer=$1
    while ! docker exec $peer peer channel list >/dev/null 2>&1; do
        sleep 1
    done
}

10.2 支持多通道场景

扩展脚本以支持创建多个通道:

# 添加通道名称参数
CHANNEL_NAME=${1:-mychannel}

10.3 日志收集改进

# 统一收集日志
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网络的组成和运作机制,为实际项目部署提供重要参考。 “`

推荐阅读:
  1. HyperLedger Fabric 交易流程
  2. Tungsten Fabric安装的示例分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

fabric

上一篇:如何分析Couchdb漏洞CVE-2017-12635和CVE-2017-12636

下一篇:Adobe flash player 28漏洞攻击的分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》