• Hyperledger Fabric笔记2--运行fabric测试网络


    Hyperledger Fabric笔记2--运行fabric测试网络
     

    1、获取fabric相关源代码

    首先,需要在/opt/gopath中新建目录,  mkdir -p /opt/gopath/src/github.com/hyperledger/

    其次,下载fabric源码,git clone https://github.com/hyperledger/fabric.git                                                                      

    或者 git clone https://gerrit.hyperledger.org/r/fabric

    下载fabric-samples,git clone -b master https://github.com/hyperledger/fabric-samples.git

    2、运行first-network 测试网络
    1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用

    docker ps -a 查看所有容器

    docker stop name(name为docker ps -a中的name列)

    docker rm $(docker ps -a -q) #删除所有容器

    2)cd fabric-samples

    git tag #查看有哪几个版本,笔者当前有如下tag

    v1.0.2
    v1.0.6
    v1.1.0
    v1.1.0-alpha
    v1.1.0-preview
    v1.1.0-rc1
    git checkout  -b  v1.1.0-alpha #该命令会在本地新建一个v1.1.0-alpha的分支,该分支内容即为tag为v1.1.0-alpha的版本内容 ,此处需要注意的是初次clone fabric-sample后,需要使用git checkout  -b  v1.1.0-alpha,否则本地文件没有改变;第一次成功后就可以直接使用 git checkout  v1.1.0-alpha来切换版本了                 

    注:笔者使用默认git clone 的v1.1.0-rc1 出问题了,问题如下:

    ERROR! Local Fabric binary version of 1.0.0 does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples.

    即:v1.0.0的fabri bin文件夹下的程序和v1.1.0-rc1不匹配,因此可选择使用新版本的fabric或者回退fabric-samples,笔者向前回退发现使用alpha成功了,因此可优先使用v1.1.0-alpha 

    3)执行fabric/scripts下的bootstrap-1.0.0.sh脚本,以获取一个包含configtxgen、cryptogen和peer等文件的bin目录

    cd到fabric/scripts下,执行./bootstrap-1.0.0.sh,该命令不仅会下载bin目录,还会从docker hub中拉取必要的fabric网络运行所需的docker镜像                   

    如果fabric/scripts下没有对应的sh文件,则需要 git checkout -b v1.0.0 #该命令在本地新建一个v1.0.0的分支,v1.0.0的scripts目录下包含多种sh文件,我们只需使用bootstrap-1.0.0.sh文件,生成bin命令后,将fabric/scripts/bin目录拷贝到fabric-samples/下

    需要注意的是,初次切换到新分支或者tag的时候需要使用git checkout -b v1.0.0来新建tag对应的分支,否则本地script脚本下文件没有改变,后续可以直接使用git checkout v1.0.0 切换到对应的分支

    注意:笔者也测试过bootstrap-1.0.0-rc1.sh,其下载的bin文件夹也可以供v1.1.0-alpha 版的fabric-samples使用

    4)cd /fabric-samples/first-network

    执行./byfn.sh -m generate 产生必要的文件

    执行./byfn.sh -m up启动网络,选项为y,成功启动后如下图所示:

    执行./byfn.sh -m down 关闭网络

    注意:若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器

    官方参考文档:http://hyperledger-fabric.readthedocs.io/en/release-1.0/build_network.html

    3、运行fabric下e2e_cli 测试网络
    1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用
    docker ps -a 查看所有容器
    docker stop name(name为docker ps -a中的name列)
    docker rm $(docker ps -a -q) #删除所有容器
    2)git checkout  -b v1.0.0
    cd fabric/scripts
    ./bootstrap-1.0.0.sh
    该操作会生成fabric 1.0所需的docker images和包含configtxgen、cryptogen和peer等文件的bin目录,在运行fabric-samples的时候需要将其拷贝到fabric-samples目录下
    3) cd fabric/examples/e2e_cli
    执行./network_setup.sh up 启动网络,启动后界面同first-network一样
    执行./network_setup.sh down 关闭网络

    若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器

    4、注意事项
    (1) clearContainers函数删除所有容器的解决方法

    在运行./byfn.sh -m down的时候回执行clearContainers() 函数中的CONTAINER_IDS=$(docker ps -aq),这会把所有的容器都删除,偷懒的方法是使用的时候需要确保宿主机上没有重要的容器,或者将容器数据备份一下!

    比较靠谱的方法是更改一下byfn.sh脚本,使命令行只删除除了需要保存的容器之外的所有容器,为此笔者做了如下改进脚本如下:

    function specialClearContainer(){
    arrName=(mygerrit mynginx myjenkins) #此处更改为自己需要保留的容器名称
    arrID=()
    i=0
    for var in ${arrName[@]} #将mygerrit mynginx myjenkins的containerID放到数组arrID中
    do
    arrID[$i]=$(docker ps -a|grep ${arrName[$i]}|cut -c1-12)
    i=$i+1
    done
    echo '需保留容器:'${arrID[*]}
    containerIDs=$(docker ps -aq)
    arrContainerIDs=($containerIDs)
    echo '所有的容器:'${arrContainerIDs[*]}
    for var1 in ${arrContainerIDs[@]}
    do
    var=0 #默认var1和var2不相同,相同则设var为1
    for var2 in ${arrID[@]}
    do
    if [ $var1 = $var2 ]
    then
    var=1
    break
    fi
    done
    if [ $var = 0 ] #如果var1不在var2中,那么可以删除var1对应的容器
    then
    echo '已删除容器:'$var1
    docker rm -f $var1
    fi
    done
    echo '存活的容器:'$(docker ps -aq)
    }
    #注意此处是byfn.sh脚本中的原版函数,笔者对clearContainers做了一些修改
    # Obtain CONTAINER_IDS and remove them
    # TODO Might want to make this optional - could clear other containers
    function clearContainers () {
    CONTAINER_IDS=$(docker ps -aq)
    if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
    echo "---- No containers available for deletion ----"
    else
    specialClearContainer #使用自己的函数
    #docker rm -f $CONTAINER_IDS #原有的方法会删除所有的镜像,不推荐使用
    fi
    }
    clearContainers
    笔者有服务器上同时启动了mygerrit、mynginx、myjenkins、hello-world等4个容器,需要删掉除了mygerrit mynginx myjenkins之外的容器,运行脚本结果如下所示:

    很明显,只删除了hello对应容器,其它容器正常存活,将删除更改添加到fabric各个启动脚本中就可以避免关闭fabric网络的时候删除所有容器的问题

    (2)bin文件夹的说明

    bin文件夹中包括6个文件: configtxgen  configtxlator  cryptogen  get-byfn.sh  get-docker-images.sh  peer ;其中configtxgen  用于生成排序服务的创世区块和相关的配置文件,生成的文件在 channel-artifacts 中;cryptogen  用于生成工具证书,其生成的文件在 crypto-config中。

    bin文件夹的获取方式:

    方法一:执行fabric/scripts下的bootstrap-1.0.0.sh或./bootstrap-1.0.0.-rc1.sh脚本,脚本中有如下下载命令;

    echo "===> Downloading platform binaries"
    curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz
    bin文件夹通常下载速度很慢,若下载不出来可以用方法二编译生成相关文件

    方法二:屏蔽bootstrap-1.0.0***.sh中的curl下载功能,直接去pull 相关的docker镜像,使用fabric/examples/e2e_cli/generateArtifacts.sh 编译生成bin文件,generateArtifacts.sh脚本中有如下函数,该函数会判断$FABRIC_ROOT/release/$OS_ARCH/bin/下是否存在configtxgen文件,若不存在就make - C $FABRIC_ROOT release生成对应的bin文件夹,后续生成创世块和相应配置文件也使用该bin目录下的文件

    function generateChannelArtifacts() {

    <span style="color:#ff0000;">CONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen</span>
    <span style="color:#ff0000;">if [ -f "$CONFIGTXGEN" ]</span>; then
    echo "Using configtxgen -> $CONFIGTXGEN"
    else
    echo "Building configtxgen"
    make -C $FABRIC_ROOT release
    fi

    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!
    <span style="color:#ff0000;">$CONFIGTXGEN</span> -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

    echo
    echo "#################################################################"
    echo "### Generating channel configuration transaction 'channel.tx' ###"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

    echo
    echo "#################################################################"
    echo "####### Generating anchor peer update for Org1MSP ##########"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

    echo
    echo "#################################################################"
    echo "####### Generating anchor peer update for Org2MSP ##########"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
    echo
    }
    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

    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

    echo
    echo "#################################################################"
    echo "### Generating channel configuration transaction 'channel.tx' ###"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

    echo
    echo "#################################################################"
    echo "####### Generating anchor peer update for Org1MSP ##########"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP

    echo
    echo "#################################################################"
    echo "####### Generating anchor peer update for Org2MSP ##########"
    echo "#################################################################"
    $CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
    echo
    }
    由于e2e_cli中使用编译生成的bin文件夹内的文件,所以在运行通过network_setup.sh脚本运行e2e_cli时候不需要将生成的bin文件夹拷贝到其它目录,若通过手动命令行运行时最好将其拷贝到同级或上级目录中;而byfn中默认是没有bin文件夹的,且byfn.sh脚本通过export PATH=${PWD}/../bin:${PWD}:$PATH 将bin文件夹导入到临时环境变量中,因此需要通过fabric项目生成相应的bin文件,并将其拷贝到fabric-samples项目目录中。

    5、说明
    截图系统版本:Ubuntu 16.04.4 Desktop LTS (64-bit), 安装在VM虚拟机上

    笔者也在腾讯云 Ubuntu 16.04 Server (64-bit)上测试过,可正常启动测试网络

    原文链接:https://blog.csdn.net/u011127242/article/details/79597351

  • 相关阅读:
    poj4474 Scout YYF I(概率dp+矩阵快速幂)
    网络编程之TCP异步群聊:服务器端代码
    平衡树(AVL)详解
    网络编程之TCP异步群聊:客户端代码
    [置顶] android 图片库的封装
    oracle的nvl函数的使用解析
    七天美音英标学习总结
    软考(7)——看图心想 标准化和知识产权
    Node.js学习(7)----包
    Ubuntu bitnami gitlab 安装
  • 原文地址:https://www.cnblogs.com/show58/p/13153669.html
Copyright © 2020-2023  润新知