zoukankan      html  css  js  c++  java
  • HyperLedger/Fabric区块连网络 案例流程分析

    fabric示例e2e_cli中network_setup.sh流程分析

    1. 调用generateArtifacts.sh
    2. docker-compose up启动cli
    3. cli容器执行script.sh脚本

    这里写图片描述

    network_setup.sh函数分析

    function validateArgs () {
        #如果参数为空,报错退出
        if [ -z "${UP_DOWN}" ]; then
            echo "Option up / down / restart not mentioned"
            printHelp
            exit 1
        fi
        if [ -z "${CH_NAME}" ]; then
        #如果第二个参数为空,创建默认名称为'mychannel'的channel
            echo "setting to default channel 'mychannel'"
            CH_NAME=mychannel
        fi
    }

    函数networkUp分析

    1. 调用generateArtifacts.sh
    2. 调用docker-compose启动容器
    function networkUp () {
        #判断是否存在crypto-config,如果存在,表示
        #如果不存在,则执行generateArtifacts.sh脚本
        if [ -f "./crypto-config" ]; then
          echo "crypto-config directory already exists."
        else
          #Generate all the artifacts that includes org certs, orderer genesis block,
          # channel configuration transaction
          source generateArtifacts.sh $CH_NAME
        fi
    
        #是否传入了第4个参数为couchdb,如果是启动参数带上couchdb对应的docker-compose模板文件
        #实际命令:CHANNEL_NAME=mychannel TIMEOUT=10000 docker-compose -f docker-compose-cli.yaml -f COMPOSE_FILE_COUCH=docker-compose-couch.yaml up -d 2>&1
        #如果不是couchdb,则不带上couchdb对应的yaml
        #实际命令为:CHANNEL_NAME=mychannel TIMEOUT=10000 docker-compose -f docker-compose-cli.yaml up -d 2>&1
        if [ "${IF_COUCHDB}" == "couchdb" ]; then
          CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE -f $COMPOSE_FILE_COUCH up -d 2>&1
        else
          CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT docker-compose -f $COMPOSE_FILE up -d 2>&1
        fi
    
        #判断执行的返回值,如果不为0,输出错误,并且退出
        if [ $? -ne 0 ]; then
        echo "ERROR !!!! Unable to pull the images "
        exit 1
        fi
    
        #查看容器cli的实时日志
        docker logs -f cli
    }

    generateArtifacts.sh函数分析

    generateCerts
    replacePrivateKey
    generateChannelArtifacts

    ## Generates Org certs using cryptogen tool
    function generateCerts (){
        #ubuntu上OS_ARCH为linux-amd64
        #OS X上OS_ARCH为darwin-amd64
        #fabric目录对应的子目录查找文件cryptogen
        #如果该文件存在
        #如果不存在执行make命令生成。不过这个make
        CRYPTOGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/cryptogen
    
        if [ -f "$CRYPTOGEN" ]; then
                echo "Using cryptogen -> $CRYPTOGEN"
        else
            echo "Building cryptogen"
            make -C $FABRIC_ROOT release
        fi
    
        #实际命令cryptogen generate --config=./crypto-config.yaml
        #TODO待完善
        echo
        echo "##########################################################"
        echo "##### Generate certificates using cryptogen tool #########"
        echo "##########################################################"
        $CRYPTOGEN generate --config=./crypto-config.yaml
        echo
    }
    replacePrivateKey.
    ## Using docker-compose template replace private key file names with constants
    function replacePrivateKey () {
        #如果是OS X系统参数为-it,否则为-i
        #或者-i前面加上"" -i也可以避免在OS X上报错
        ARCH=`uname -s | grep Darwin`
        if [ "$ARCH" == "Darwin" ]; then
            OPTS="-it"
        else
            OPTS="-i"
        fi
    
        #拷贝docker-compose-e2e-template.yaml文件,并且新文件命名为docker-compose-e2e.yaml
        cp docker-compose-e2e-template.yaml docker-compose-e2e.yaml
    
            #获取crypto-config/peerOrganizations/org1.example.com/ca/目录下_sk结尾的文件名
            #把上述文件中的CA1_PRIVATE_KEY替换成上述文件名
            #-i直接修改文本文件内容
            #s替换指定字符,使用后缀 /g 标记会替换每一行中的所有匹配
            CURRENT_DIR=$PWD
            cd crypto-config/peerOrganizations/org1.example.com/ca/
            PRIV_KEY=$(ls *_sk)
            cd $CURRENT_DIR
            sed $OPTS "s/CA1_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml
            cd crypto-config/peerOrganizations/org2.example.com/ca/
            PRIV_KEY=$(ls *_sk)
            cd $CURRENT_DIR
            sed $OPTS "s/CA2_PRIVATE_KEY/${PRIV_KEY}/g" docker-compose-e2e.yaml
    }
    generateChannelArtifacts

    generateChannelArtifacts

    这个函数首先判断 fabric/release/linux-amd64/bin/configtxgen 是否存在,如果不存在则先编译生成。configtxgen 可以配合 cryptogen 生成的组织结构身份文件使用,离线生成跟通道有关的配置信息,其主要功能有如下三个:

    • 生成启动 Orderer 需要的初始化区块,并支持检查区块内容;
    • 生成创建应用通道需要的配置交易,并支持检查交易内容;
    • 生成 2 个锚节点 Peer 的更新配置交易。

    configtxgen 调用的配置文件为 configtx.yaml ,该配置文件一般包括四个部分:

    • Profiles:一系列通道配置模板,包括 Orderer 系统通道模板和应用通道类型模板;
    • Organization:一系列组织结构定义,被其他部分引用;
    • Orderer:Orderer 系统通道相关配置,包括 Orderer 服务配置和参与 Ordering 服务的可用组织信息;
    • Application:应用通道相关配置,主要包括参与应用网络的可用组织信息。

    调用该函数最终在 channel-artifacts 目录下生成了四个文件,对应于上述的三个功能:

    channel.tx    genesis.block    Org1MSPanchors.tx    Org2MSPanchors.tx
    ## Generate orderer genesis block , channel configuration transaction and anchor peer update transactions
    function generateChannelArtifacts() {
        #ubuntu上OS_ARCH为linux-amd64
        #OS X上OS_ARCH为darwin-amd64
        #fabric目录对应的子目录查找文件cryptogen
        #如果该文件存在
        #如果不存在执行make命令生成
        CONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen
        if [ -f "$CONFIGTXGEN" ]; then
                echo "Using configtxgen -> $CONFIGTXGEN"
        else
            echo "Building configtxgen"
            make -C $FABRIC_ROOT release
        fi
    
        #使用工具configtxgen生成创世区块
        ##profile指定configtx.yaml中的配置项
        ##outputBlock执行生成文件路径,protobuf序列化格式
        ##可以用工具以json格式查看,configtxgen -inspectBlock genesis.block
        echo "##########################################################"
        echo "#########  Generating Orderer Genesis block ##############"
        echo "##########################################################"
        # Note: For some unknown reason (at least for now) the block file can't be
        # named orderer.genesis.block or the orderer will fail to launch!
        $CONFIGTXGEN -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
    
        ##使用工具configtxgen生成channel.tx
        ##outputCreateChannelTx指定生成的文件路径,protobuf序列化格式
        ##可以用工具以json格式查看,configtxgen -inspectChannelCreateTx channel.tx
        echo
        echo "#################################################################"
        echo "### Generating channel configuration transaction 'channel.tx' ###"
        echo "#################################################################"
        $CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
    
        #使用工具configtxgen生成Org1MSPanchors.tx
        echo
        echo "#################################################################"
        echo "#######    Generating anchor peer update for Org1MSP   ##########"
        echo "#################################################################"
        $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
    
        #使用工具configtxgen生成Org2MSPanchors.tx
        echo
        echo "#################################################################"
        echo "#######    Generating anchor peer update for Org2MSP   ##########"
        echo "#################################################################"
        $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
        echo
    }

    docker-compose启动容器

    CHANNEL_NAME=mychannel TIMEOUT=10000 docker-compose -f docker-compose-cli.yaml up -d 2>&1

    从配置文件不难看出,排序服务节点继承了 base/docker-compose-base.yaml 中的 order.example.com 属性;而其他四个 Peer 节点继承了 base/docker-compose-base.yaml 中的与之容器名称对应的属性,并又都继承了 base/peer-base.yaml 中的属性。

    在上述文件所继承的文件属性中,关键属性如下:

    • environment:当前所配置的外界的环境变量
    • working_dir:当前容器启动后的工作路径
    • volumes:外界物理机路径挂载或指引到容器内的路径
    • ports:指定当前容器启动后映射到物理机上的端口号
    • depends_on:指定当前容器启动所依赖的启动容器对象

    在 docker-compose-cli.yaml 文件中,官方的节点配置信息基本已经满足实际生产应用,而真正使用这些服务节点进行数据维护和管理的则是交由客户端或 SDK 来执行。这里也就是配置文件中的 cli 客户端容器。cli 容器的 command 属性指定当 cli 容器启动后会执行当前目录中的 scripts 目录下的 script.sh 脚本

    script.sh分析

    创建通道

    script.sh 脚本的执行则是 e2e_cli 中真正地对 Peer 节点、频道以及合约的集合操作演示,先来看看该脚本内的函数执行顺序:

    ## Create channel
    echo "Creating channel..."
    createChannel
    
    ## Join all the peers to the channel
    echo "Having all peers join the channel..."
    joinChannel
    
    ## Set the anchor peers for each org in the channel
    echo "Updating anchor peers for org1..."
    updateAnchorPeers 0
    echo "Updating anchor peers for org2..."
    updateAnchorPeers 2
    
    ## Install chaincode on Peer0/Org1 and Peer2/Org2
    echo "Installing chaincode on org1/peer0..."
    installChaincode 0
    echo "Install chaincode on org2/peer2..."
    installChaincode 2
    
    #Instantiate chaincode on Peer2/Org2
    echo "Instantiating chaincode on org2/peer2..."
    instantiateChaincode 2
    
    #Query on chaincode on Peer0/Org1
    echo "Querying chaincode on org1/peer0..."
    chaincodeQuery 0 100
    
    #Invoke on chaincode on Peer0/Org1
    echo "Sending invoke transaction on org1/peer0..."
    chaincodeInvoke 0
    
    ## Install chaincode on Peer2/Org2
    echo "Installing chaincode on org2/peer3..."
    installChaincode 3
    
    #Query on chaincode on Peer2/Org2, check if the result is 90
    echo "Querying chaincode on org2/peer3..."
    chaincodeQuery 3 90

    该脚本设计 Peer 节点及排序服务节点的操作分别有如下九个步骤:

    1. createChannel:根据之前在 generateArtifacts.sh 脚本中通过 configtx.yaml 配置文件生成的频道文件创建频道;
    2. joinChannel:Peer 节点加入指定频道;
    3. updateAnchorPeers 0/2:为频道中的每个组织设置 Peer 节点;
    4. installChaincode 0/2:在 Peer0/Org1 和 Peer0/Org2 上安装智能合约;
    5. instantiateChaincode 2:在 Peer0/Org2 上对智能合约进行实例化操作;
    6. chaincodeQuery 0 100:在 Peer0/Org1 上执行智能合约中的查询方法,判断是否等于 100;
    7. chaincodeInvoke 0:在 Peer0/Org1 上执行智能合约中的交易方法;
    8. installChaincode 3:在 Peer1/Org2 上安装智能合约;
    9. chaincodeQuery 3 90:在 Peer1/Org2 上执行智能合约中的查询方法,判断是否等于 90;

    这里写图片描述

  • 相关阅读:
    使用蓝图构建Flask项目目录
    python上下文管理器细读
    【LiteOS】STM32F103-LiteOS移植教程(详细篇)
    OSX 下 sftp 上传目录到服务器
    Homestead window10 storage:link 不能建立符号链接的处理办法
    Laravel Carbon 简明使用
    VMWare 虚拟机挂载 Homestead NFS 进行老项目(基于 Brophp)维护
    winnfsd 操作
    windows10 查看进程端口的情况
    NFS各个版本之间的比较
  • 原文地址:https://www.cnblogs.com/adao21/p/13560083.html
Copyright © 2011-2022 走看看