zoukankan      html  css  js  c++  java
  • 区块链Hyperledger Fabric 学习记录(一)开发环境搭建(ubuntu16.04/ubuntu18.04)

    Fabric开发环境搭建

    Author:ljo0412@live.com

    更新说明

    在根据Fabric手册进行学习的过程中,遇到了一个严重的问题,导致无法向下继续,总结原因为Fabric版本问题。原文选择了Fabric v1.2(master)版本进行开发学习,在build your first network一节中发现无法正常的执行invoke操作。将版本退回到v1.1,发现可以正常运行,故将此篇博客改为v1.1版本。整体步骤不发生改变,仅在执行bootstrap.sh脚本时更改参数。


    教程环境及软件版本

    OS: ubuntu16.04/ubuntu18.04

    • Docker:18.06.0-ce
    • Go:1.10.3
    • Node.js:8.11.3 && npm:5.6.0
    • Python:2.7
    • Fabric:1.2.0

    提示: 以下安装均在普通用户中安装

    Docker

    安装Docker

    这里使用Daocloud镜像进行安装

    ubuntu:~$ curl -sSL https://get.daocloud.io/docker | sh
    

    配置用户组

    添加$user到docker用户组,免除每次运行docker都需要使用sudo root权限

    ubuntu:~$ sudo usermod -aG docker $USER
    

    重新登录系统,检查docker是否安装成功。

    ubuntu:~$ docker --version
    

    显示版本信息证明安装成功

    ubuntu:~$ docker --version
    Docker version 18.06.0-ce, build 0ffa825
    

    这里我所安装的版本18.06.0-ce。

    配置Aliyun Docker加速器

    由于Docker镜像服务器在国外,所以下载速度非常缓慢甚至失败,阿里云为我们提供了优秀的解决方案。

    访问Aliyun Docker Service,点击创建我的容器镜像,点击镜像加速器,选择ubuntu,根据提示执行命令。

    step1

    step2

    step3

    命令示例如下(注意替换相应的*******):

    ubuntu:~$ sudo mkdir -p /etc/docker
    ubuntu:~$ sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": ["https://*******.mirror.aliyuncs.com"]
    }
    EOF
    ubuntu:~$ sudo systemctl daemon-reload
    ubuntu:~$ sudo systemctl restart docker
    

    安装docker-compose

    ubuntu:~$ sudo apt install docker-compose
    

    至此,整个Docker的安装完毕。

    Go

    下载源码

    访问Golang.org下载最新版的GO源码。

    这里我选择的go1.10.3.linux-amd64

    也可以通过命令行下载

    ubuntu:~$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
    

    安装源码

    详细教程可以查看官方手册

    解压代码到用户自定义目录下,这里选择~/,即主目录

    ubuntu:~$ tar -C ~/ -xzf go1.10.3.linux-amd64.tar.gz
    

    添加环境变量

    ubuntu:~$ vi ~/.profile
    # 在最后添加如下代码
    export GOROOT=$HOME/go
    export PATH=$PATH:$GOROOT/bin
    

    使环境变量生效

    ubuntu:~$ source ~/.profile
    

    注意这里只是使当前终端生效,其他已打开的终端需重新打开

    检查是否安装成功

    ubuntu:~$ go version
    go version go1.10.3 linux/amd64
    

    提示如上版本信息证明,安装成功。

    Node.js && NPM

    Node.js源码安装

    下载最新版的源码,这里我选择8.11.3版本。

    注意:Node.js 9.x版本不再被支持,请选择8.9.x 或更新的版本

    ubuntu:~$ wget https://nodejs.org/dist/v8.11.3/node-v8.11.3.tar.gz
    

    解压源码

    ubuntu:~$ tar -zxf node-v8.11.3.tar.gz
    

    编译安装

    ubuntu:~$ cd node-v8.11.3/
    ubuntu:~/node-v1.8.11.3$ ./configure
    ubuntu:~/node-v1.8.11.3$ make
    ubuntu:~/node-v1.8.11.3$ sudo make install
    

    make过程可能会比较长,建议做点有意思的事吧~

    验证是否安装成功

    ubuntu:~$ node -v
    v8.11.3
    
    ubuntu:~$ npm -version
    5.6.0
    

    安装Python

    ubuntu16.04默认安装了python3.5,而Fabric Node.js SDK需要Python 2.7

    ubuntu:~$ sudo apt-get install python
    

    检查Python版本号

    ubuntu:~$ python --version
    

    安装Fabric范例、源码和Docker镜像

    在执行官方手册中的步骤时,未能正确通过,分析过后应该是curl命令版本太低的问题,未能解决。

    错误如下:

    ubuntu:~$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0
    curl: (56) Recv failure: Connection reset by peer
    

    这里采用官方手册中的替代解决方案。

    复制官方提供的bootstrap.sh脚本内容到本机

    2018-7-21版本内容如下:

    #!/bin/bash
    #
    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    
    # if version not passed in, default to latest released version
    export VERSION=1.2.0
    # if ca version not passed in, default to latest released version
    export CA_VERSION=$VERSION
    # current version of thirdparty images (couchdb, kafka and zookeeper) released
    export THIRDPARTY_IMAGE_VERSION=0.4.10
    export ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')")
    export MARCH=$(uname -m)
    
    printHelp() {
      echo "Usage: bootstrap.sh [<version>] [<ca_version>] [<thirdparty_version>][-d -s -b]"
      echo
      echo "-d - bypass docker image download"
      echo "-s - bypass fabric-samples repo clone"
      echo "-b - bypass download of platform-specific binaries"
      echo
      echo "e.g. bootstrap.sh 1.2.0 -s"
      echo "would download docker images and binaries for version 1.2.0"
    }
    
    dockerFabricPull() {
      local FABRIC_TAG=$1
      for IMAGES in peer orderer ccenv tools; do
          echo "==> FABRIC IMAGE: $IMAGES"
          echo
          docker pull hyperledger/fabric-$IMAGES:$FABRIC_TAG
          docker tag hyperledger/fabric-$IMAGES:$FABRIC_TAG hyperledger/fabric-$IMAGES
      done
    }
    
    dockerThirdPartyImagesPull() {
      local THIRDPARTY_TAG=$1
      for IMAGES in couchdb kafka zookeeper; do
          echo "==> THIRDPARTY DOCKER IMAGE: $IMAGES"
          echo
          docker pull hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG
          docker tag hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG hyperledger/fabric-$IMAGES
      done
    }
    
    dockerCaPull() {
          local CA_TAG=$1
          echo "==> FABRIC CA IMAGE"
          echo
          docker pull hyperledger/fabric-ca:$CA_TAG
          docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca
    }
    
    samplesInstall() {
      # clone (if needed) hyperledger/fabric-samples and checkout corresponding
      # version to the binaries and docker images to be downloaded
      if [ -d first-network ]; then
        # if we are in the fabric-samples repo, checkout corresponding version
        echo "===> Checking out v${VERSION} branch of hyperledger/fabric-samples"
        git checkout v${VERSION}
      elif [ -d fabric-samples ]; then
        # if fabric-samples repo already cloned and in current directory,
        # cd fabric-samples and checkout corresponding version
        echo "===> Checking out v${VERSION} branch of hyperledger/fabric-samples"
        cd fabric-samples && git checkout v${VERSION}
      else
        echo "===> Cloning hyperledger/fabric-samples repo and checkout v${VERSION}"
        git clone -b master https://github.com/hyperledger/fabric-samples.git && cd fabric-samples && git checkout v${VERSION}
      fi
    }
    
    # Incrementally downloads the .tar.gz file locally first, only decompressing it
    # after the download is complete. This is slower than binaryDownload() but
    # allows the download to be resumed.
    binaryIncrementalDownload() {
          local BINARY_FILE=$1
          local URL=$2
          curl -f -s -C - ${URL} -o ${BINARY_FILE} || rc=$?
          # Due to limitations in the current Nexus repo:
          # curl returns 33 when there's a resume attempt with no more bytes to download
          # curl returns 2 after finishing a resumed download
          # with -f curl returns 22 on a 404
          if [ "$rc" = 22 ]; then
    	  # looks like the requested file doesn't actually exist so stop here
    	  return 22
          fi
          if [ -z "$rc" ] || [ $rc -eq 33 ] || [ $rc -eq 2 ]; then
              # The checksum validates that RC 33 or 2 are not real failures
              echo "==> File downloaded. Verifying the md5sum..."
              localMd5sum=$(md5sum ${BINARY_FILE} | awk '{print $1}')
              remoteMd5sum=$(curl -s ${URL}.md5)
              if [ "$localMd5sum" == "$remoteMd5sum" ]; then
                  echo "==> Extracting ${BINARY_FILE}..."
                  tar xzf ./${BINARY_FILE} --overwrite
    	      echo "==> Done."
                  rm -f ${BINARY_FILE} ${BINARY_FILE}.md5
              else
                  echo "Download failed: the local md5sum is different from the remote md5sum. Please try again."
                  rm -f ${BINARY_FILE} ${BINARY_FILE}.md5
                  exit 1
              fi
          else
              echo "Failure downloading binaries (curl RC=$rc). Please try again and the download will resume from where it stopped."
              exit 1
          fi
    }
    
    # This will attempt to download the .tar.gz all at once, but will trigger the
    # binaryIncrementalDownload() function upon a failure, allowing for resume
    # if there are network failures.
    binaryDownload() {
          local BINARY_FILE=$1
          local URL=$2
          echo "===> Downloading: " ${URL}
          # Check if a previous failure occurred and the file was partially downloaded
          if [ -e ${BINARY_FILE} ]; then
              echo "==> Partial binary file found. Resuming download..."
              binaryIncrementalDownload ${BINARY_FILE} ${URL}
          else
              curl ${URL} | tar xz || rc=$?
              if [ ! -z "$rc" ]; then
                  echo "==> There was an error downloading the binary file. Switching to incremental download."
                  echo "==> Downloading file..."
                  binaryIncrementalDownload ${BINARY_FILE} ${URL}
    	  else
    	      echo "==> Done."
              fi
          fi
    }
    
    binariesInstall() {
      echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries"
      binaryDownload ${BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/${BINARY_FILE}
      if [ $? -eq 22 ]; then
         echo
         echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----"
         echo
       fi
    
      echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary"
      binaryDownload ${CA_BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/${ARCH}-${CA_VERSION}/${CA_BINARY_FILE}
      if [ $? -eq 22 ]; then
         echo
         echo "------> ${CA_TAG} fabric-ca-client binary is not available to download  (Available from 1.1.0-rc1) <----"
         echo
       fi
    }
    
    dockerInstall() {
      which docker >& /dev/null
      NODOCKER=$?
      if [ "${NODOCKER}" == 0 ]; then
    	  echo "===> Pulling fabric Images"
    	  dockerFabricPull ${FABRIC_TAG}
    	  echo "===> Pulling fabric ca Image"
    	  dockerCaPull ${CA_TAG}
    	  echo "===> Pulling thirdparty docker images"
    	  dockerThirdPartyImagesPull ${THIRDPARTY_TAG}
    	  echo
    	  echo "===> List out hyperledger docker images"
    	  docker images | grep hyperledger*
      else
        echo "========================================================="
        echo "Docker not installed, bypassing download of Fabric images"
        echo "========================================================="
      fi
    }
    
    DOCKER=true
    SAMPLES=true
    BINARIES=true
    
    # Parse commandline args pull out
    # version and/or ca-version strings first
    if [ ! -z $1 ]; then
      VERSION=$1;shift
      if [ ! -z $1 ]; then
        CA_VERSION=$1;shift
        if [ ! -z $1 ]; then
          THIRDPARTY_IMAGE_VERSION=$1;shift
        fi
      fi
    fi
    
    # prior to 1.2.0 architecture was determined by uname -m
    if [[ $VERSION =~ ^1.[0-1].* ]]; then
      export FABRIC_TAG=${MARCH}-${VERSION}
      export CA_TAG=${MARCH}-${CA_VERSION}
      export THIRDPARTY_TAG=${MARCH}-${THIRDPARTY_IMAGE_VERSION}
    else
      # starting with 1.2.0, multi-arch images will be default
      : ${CA_TAG:="$CA_VERSION"}
      : ${FABRIC_TAG:="$VERSION"}
      : ${THIRDPARTY_TAG:="$THIRDPARTY_IMAGE_VERSION"}
    fi
    
    BINARY_FILE=hyperledger-fabric-${ARCH}-${VERSION}.tar.gz
    CA_BINARY_FILE=hyperledger-fabric-ca-${ARCH}-${CA_VERSION}.tar.gz
    
    # then parse opts
    while getopts "h?dsb" opt; do
      case "$opt" in
        h|?)
          printHelp
          exit 0
        ;;
        d)  DOCKER=false
        ;;
        s)  SAMPLES=false
        ;;
        b)  BINARIES=false
        ;;
      esac
    done
    
    if [ "$SAMPLES" == "true" ]; then
      echo
      echo "Installing hyperledger/fabric-samples repo"
      echo
      samplesInstall
    fi
    if [ "$BINARIES" == "true" ]; then
      echo
      echo "Installing Hyperledger Fabric binaries"
      echo
      binariesInstall
    fi
    if [ "$DOCKER" == "true" ]; then
      echo
      echo "Installing Hyperledger Fabric docker images"
      echo
      dockerInstall
    fi
    

    运行该脚本

    ubuntu:~$ bash ./bootstrap.sh 1.1.0
    

    该脚本将自动下载fabric-samples源码,下载Fabric Docker镜像。

    查看下载的镜像

    ubuntu:~$ docker images
    REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
    hyperledger/fabric-ca                                                                                    1.2.0               66cc132bd09c        2 weeks ago         252MB
    hyperledger/fabric-ca                                                                                    latest              66cc132bd09c        2 weeks ago         252MB
    hyperledger/fabric-tools                                                                                 1.2.0               379602873003        2 weeks ago         1.51GB
    hyperledger/fabric-ccenv                                                                                 1.2.0               6acf31e2d9a4        2 weeks ago         1.43GB
    hyperledger/fabric-orderer                                                                               1.2.0               4baf7789a8ec        2 weeks ago         152MB
    hyperledger/fabric-peer                                                                                  1.2.0               82c262e65984        2 weeks ago         159MB
    hyperledger/fabric-zookeeper                                                                             0.4.10              2b51158f3898        3 weeks ago         1.44GB
    hyperledger/fabric-zookeeper                                                                             latest              2b51158f3898        3 weeks ago         1.44GB
    hyperledger/fabric-kafka                                                                                 0.4.10              936aef6db0e6        3 weeks ago         1.45GB
    hyperledger/fabric-kafka                                                                                 latest              936aef6db0e6        3 weeks ago         1.45GB
    hyperledger/fabric-couchdb                                                                               0.4.10              3092eca241fc        3 weeks ago         1.61GB
    hyperledger/fabric-couchdb                                                                               latest              3092eca241fc        3 weeks ago         1.61GB
    hyperledger/fabric-baseimage                                                                             amd64-0.4.10        62513965e238        3 weeks ago         1.39GB
    hyperledger/fabric-baseos                                                                                amd64-0.4.10        52190e831002        3 weeks ago         132MB
    hyperledger/fabric-tools                                                                                 latest              b7bfddf508bc        4 months ago        1.46GB
    hyperledger/fabric-tools                                                                                 x86_64-1.1.0        b7bfddf508bc        4 months ago        1.46GB
    hyperledger/fabric-orderer                                                                               latest              ce0c810df36a        4 months ago        180MB
    hyperledger/fabric-orderer                                                                               x86_64-1.1.0        ce0c810df36a        4 months ago        180MB
    hyperledger/fabric-peer                                                                                  latest              b023f9be0771        4 months ago        187MB
    hyperledger/fabric-peer                                                                                  x86_64-1.1.0        b023f9be0771        4 months ago        187MB
    hyperledger/fabric-ccenv                                                                                 latest              c8b4909d8d46        4 months ago        1.39GB
    hyperledger/fabric-ccenv                                                                                 x86_64-1.1.0        c8b4909d8d46        4 months ago        1.39GB
    hyperledger/fabric-baseos                                                                                x86_64-0.4.6        220e5cf3fb7f        5 months ago        151MB
    java                                                                                                     latest              d23bdf5b1b1b        18 months ago       643
    

    因为我执行了v1.1.0和v1.2.0两个版本的命令,所以下载的镜像会更多,读者根据自身情况进行判断,理论上,只要该命令不报错,则将会下载正确的镜像

    查看下载的Fabric脚本命令

    ubuntu:~$ ls fabric-samples/bin
    
    • configtxgen
    • configtxlator
    • cryptogen
    • discover
    • fabric-ca-client
    • get-docker-images.sh
    • idemixgen
    • orderer
    • peer

    添加这些脚本到环境变量

    ubuntu:~$ vi ~/.profile
    # 在最后一行添加
    export PATH=$PATH:$HOME/fabric-samples/bin
    

    保存文件并退出,使环境变量生效

    ubuntu:~$ source ~/.profile
    

    验证是否添加成功,在终端中输入

    ubuntu:~$ cryptogen --help
    usage: cryptogen [<flags>] <command> [<args> ...]
    ...
    

    如上显示,则证明环境变量配置成功

    总结

    至此,整个Fabric的开发环境配置完成。

    更多学习记录将会持续更新。


    参考文献:

    Go语言安装教程: https://golang.org/doc/install

    Fabric手册: http://hyperledger-fabric.readthedocs.io/en/latest/

  • 相关阅读:
    Log4net使用指南[转]
    SQL 数据库全库检索
    10款屏幕取色器/颜色拾取工具软件介绍及下载地址[转]
    字符串加密解密函数 (C#) (转)
    C# 读写文本文件乱码解决方案
    C# tips 设置文本框光标的位置[转]
    如何显示数据库中的试题和图形[转]
    [转帖]C#执行SQL脚本,读取XML文件
    使用AnimateWindow API函数实现动画窗体
    雨林木风 Ylmf Linux Y1.5(Ubuntu 9.10)正式发布[转]
  • 原文地址:https://www.cnblogs.com/NinWoo/p/9357113.html
Copyright © 2011-2022 走看看