【我的区块链之路】- Hyperledger fabric的简单入门(一)fabric-samples的下载及自动启动网络脚本演示

    【转载请标明出处】:https://blog.csdn.net/qq_25870633/article/details/81113464

   首先声明,本作者是个水逼,没错我说的就是我自己,你们有意见?板凳直接拍你们头上。。。咳咳,废话不多说,首先这里作者在学习区块链的路上冥冥中感觉到明年,额,也就是2019年将是联盟链之年,所以这里就赶紧学习了下Fabric;首先fabric是个什么东西呢。2015年12月份,由开源世界的旗舰组织Linux基金会牵头,有几十家企业共同宣布Hyperledger联合项目的成立,而fabric正是其中一个顶级项目。Fabric主要有Go语言开发的面向企业的分布式账本平台,也是当今联盟链的宠儿。那么下面我们来开始说一说这个Fabric的一些架构的概念吧

首先,fabric主要归类有三大组件:

【一】网络组件:

              Orderer

              peer

              CA

【二】共识及权限组件:

             a):共识

                              背书过程

                              排序

                              记账前验证

            b):权限管理

                              msp:权限管理的基础,对某些资源(成员、节点、组织)进行身份验证机制

                              组织:拥有相同根证书的一组成员

                              身份证书:由CA 生成,第一个实体或组织可以有自己的证书

【三】业务组件:

                 链码

                 交易

                 区块

                 应用通道

                 账本

及fabric的基本网络组成

      组成fabric网络主要有 Orderer节点、peer节点、CA服务、channel、Org 等几个资源组成,交互方面相关还有 grpc、sdk、cli等等,下面我们看看组成fabric网络所需要的最小配置应该是怎么样的

上图所示,既然是联盟链那么在一个联盟中至少要有两个组织【org】且每个组织必须具备至少2个peer节点,一个Orderer节点,一个管理节点【其实也就是cli,其实默认也可以是两个组织中指定的一个peer作为默认cli默认进入的节点】,还有一个CA服务的节点,然后开启一个包含了这两个组织的4个peer的通道channel

下面我们老说一说,各个资源分别是做什么的

Orderer:主要对交易进行排序及生成区块

Peer: peer有几种主要的角色类型有

                  Endorser:【背书节点】主要对客户端(sdk或者cli)提交过来的交易提案做校验及启动容器跑chaincode来模拟执行交易过程,然后把模拟得到的结果做签名返还给客户端

                  Anchor:【锚节点】主要做在同一个通道内跨组织交换数据用

                 Commiter:【记账节点】主要对Orderer产生的区块进行验证并记入账本

 CA:主要是身份证书管理和颁发服务                       

Org:表示联盟内具备相同根证书的资源的集合,现实中可能是一家企业也可能是多家企业,或者机构、个人等等

我们下面用一个官方提供的简单的版本

channel:主要为隔离交易、隔离数据(账本等)

好了,我们BB了这么久,首先我们需要根据官方的文档实例中给出的一个sample版本的示例来开始一边搭建一边讲解我们的第一个简单的fabric网络,并且用它来测试我们的链码

我的演示环境是

Ubuntu 16.04.4 LTS

git   2.7.4

go   go1.10.3 linux/amd64

node  v10.6.0

npm  6.1.0

docker  1.13.1

docker-compose  1.8.0

现在我们先去github上下载fabric-sample的及对应的镜像,先创建一个空目录,如我是在自己的home目录下创建的一个fabric目录,即:/home/gavin/fabric 目录,接着打开 

https://github.com/hyperledger/fabric/blob/master/scripts/bootstrap.sh 把对应内容copy至/home/gavin/fabric 目录的一个空文件中,如 vim bootstrap.sh中

给予执行权限:sudo chmod +x bootstrap.sh 然后执行该文件,./bootstrap.sh 1.2.0 (注意:该处版本号指定的话默认就是下载1.2.0版本,具体我们查看./bootstrap.sh文件即可知道),下面我们先来分析下bootstrap.sh中都做了些什么吧

一下是 sh文件的内容

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

文件开始的时候我们先指定了一些环境变量

export VERSION=1.2.0   ## 指定了要下载的fabric版本【及fabric-sample版本】


export CA_VERSION=$VERSION    ## 指定了要下载的fabric-ca的版本,和fabric-sample版本一直
export THIRDPARTY_IMAGE_VERSION=0.4.10     ##   指定了要下载的fabric环境相关的docker 镜像【第三方镜像】的版本
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)   ##  制定了系统的处理器类型 (即:x86_64 之类)

紧接着 定义了一个帮组说明的函数 printHelp()

然后是 dockerFabricPull 函数拉取指定的 peer orderer ccenv tools 等镜像且重命名

然后是 dockerThirdPartyImagesPull 函数拉取指定的第三方插件的镜像且重命名 如 couchdb kafka zookeeper 的

然后是 dockerCaPull  拉取 fabric-ca 的镜像

然后是  samplesInstall  根据需要下载fabric-sample的对应二进制文件及镜像

然后是 binaryIncrementalDownload 断点续传下载 文件

然后是 binaryDownload 和 binariesInstall 两个下载文件函数的上下级封装

然后是 dockerInstall 对于dockerFabricPull、dockerCaPull、dockerThirdPartyImagesPull三个函数的封装

然后是 先定义默认的几个变量

DOCKER=true

SAMPLES=true

BINARIES=true

然后是 函数的开始入口

if [ ! -z $1 ]; then                         ## 如果入参的第一个参数(字符串) 不为空,长度不为0 执行代码块
    VERSION=$1;shift              ## 先把第一个参数赋值给变量 VERSION 然后把所有参数左移(即 把原来的 $0销毁 $1 变为$0,$2变成$1 后面的以此类推)
    if [ ! -z $1 ]; then                     ##  判断新的$1 即原来的 $2 参数 不为空时 执行代码快代码
        CA_VERSION=$1;shift     ##   赋值给CA_VERSION 继续左移参数
        if [ ! -z $1 ]; then                 ##  判断新的$1 不为空时 执行代码快代码
            THIRDPARTY_IMAGE_VERSION=$1;shift    ## 赋值 THIRDPARTY_IMAGE_VERSION 继续左移
        fi
    fi
fi

然后 继续脚本

if [[ $VERSION =~ ^1\.[0-1]\.* ]]; then     ## 当版本 等于 1.0.X 和 1.1.X 时
    export FABRIC_TAG=${MARCH}-${VERSION}   ## 设置临时环境变量 FABRIC_TAG 值如: x86_64-1.0.X 
    export CA_TAG=${MARCH}-${CA_VERSION}    ## CA_TAG的值为: x86_64-1.0.X
    export THIRDPARTY_TAG=${MARCH}-${THIRDPARTY_IMAGE_VERSION}  ## THIRDPARTY_TAG 为: x86_64-xxxx
else
    # starting with 1.2.0, multi-arch images will be default     ## 如果是 1.2.0版本的就直接赋值变量
    : ${CA_TAG:="$CA_VERSION"}
    : ${FABRIC_TAG:="$VERSION"}
    : ${THIRDPARTY_TAG:="$THIRDPARTY_IMAGE_VERSION"}
fi

再指定 fabric和fabric-ca的二进制文件

```sh

BINARY_FILE=hyperledger-fabric-${ARCH}-${VERSION}.tar.gz

CA_BINARY_FILE=hyperledger-fabric-ca-${ARCH}-${CA_VERSION}.tar.gz

```

接下来我们看到有这一段代码

```sh

while getopts "h?dsb" opt; do  ## 表示运行当前脚本时可以携带 -h或者-?-d  -s   -b 等选项 
    case "$opt" in
        h|\?)  ## 如果是 -h 或者-? 选项时 调用使用说明函数 printHelp 打印出本脚本的使用说明 且结束脚本
            printHelp
            exit 0
        ;;
        d)  DOCKER=false  ## -d 选项时,修改 DOCKER 变量为 false
        ;;
        s)  SAMPLES=false ## -s 选项时, 修改 SAMPLES 变量选项为 false
        ;;
        b)  BINARIES=false  ## -b 选项时, 修改  BINARIES 变量选项为 false
        ;;
    esac
done

## 其中 getopts 指令是linux的一个内置指令,一般在while中和 case 配合一起使用,主要用来处理 命令行中所带的 参数选项

## 具体看这两个连接 就懂了  https://my.oschina.net/HankCN/blog/116120 和 https://my.oschina.net/leejun2005/blog/202376

```

脚本的最后是

```sh

 ## 当 SAMPLES 变量值为 true时 执行代码块,(如果我们脚本没有携带参数 -s 也就是不会执行上面 while中的代码片段,则调用 samplesInstall 函数)

if [ "$SAMPLES" == "true" ]; then 
    echo
    echo "Installing hyperledger/fabric-samples repo"
    echo
    samplesInstall
fi

 ## 当 BINARIES 变量值为 true时 执行代码块,(如果我们脚本没有携带参数 -b 也就是不会执行上面 while中的代码片段,则调用 binariesInstall 函数)
if [ "$BINARIES" == "true" ]; then
    echo
    echo "Installing Hyperledger Fabric binaries"
    echo
    binariesInstall
fi

 ## 当 DOCKER 变量值为 true时 执行代码块,(如果我们脚本没有携带参数 -d 也就是不会执行上面 while中的代码片段,则调用 dockerInstall 函数)
if [ "$DOCKER" == "true" ]; then
    echo
    echo "Installing Hyperledger Fabric docker images"
    echo
    dockerInstall
fi

```

OK 脚本我们就解说完了,然后我们开始 执行我们的脚本 ./bootstrap.sh (或者 ./bootstrap.sh 1.1.0) 【默认不带参数,是会下载 1.2.0版本的】

这时候我们静静等待下载结果就OK了,前提是具备网速良好和科学上网 如果下载中断 或者下载不成功 我们再次执行脚本 ./bootstrap.sh (或者 ./bootstrap.sh 1.1.0) 下载即可;下载完成后我们会看到以下内容

在当前目录下,【我的是 /home/gavin/fabric 目录下】有一个 fabric-samples的文件夹,我们进去执行下 tree 命令查看 文件的结构,如下所示:

.
├── balance-transfer
│   ├── app
│   │   ├── create-channel.js
│   │   ├── helper.js
│   │   ├── install-chaincode.js
│   │   ├── instantiate-chaincode.js
│   │   ├── invoke-transaction.js
│   │   ├── join-channel.js
│   │   └── query.js
│   ├── app.js
│   ├── artifacts
│   │   ├── base.yaml
│   │   ├── channel
│   │   │   ├── configtx.yaml
│   │   │   ├── crypto-config
│   │   │   │   ├── ordererOrganizations
│   │   │   │   │   └── example.com
│   │   │   │   │       ├── ca
│   │   │   │   │       │   ├── 0d46ccf0e9436c1bc3b6e2bf80cdb202c4943604f95c72ee0ff839d3ec300719_sk
│   │   │   │   │       │   └── ca.example.com-cert.pem
│   │   │   │   │       ├── msp
│   │   │   │   │       │   ├── admincerts
│   │   │   │   │       │   │   └── [email protected]
│   │   │   │   │       │   ├── cacerts
│   │   │   │   │       │   │   └── ca.example.com-cert.pem
│   │   │   │   │       │   └── tlscacerts
│   │   │   │   │       │       └── tlsca.example.com-cert.pem
│   │   │   │   │       ├── orderers
│   │   │   │   │       │   └── orderer.example.com
│   │   │   │   │       │       ├── msp
│   │   │   │   │       │       │   ├── admincerts
│   │   │   │   │       │       │   │   └── [email protected]
│   │   │   │   │       │       │   ├── cacerts
│   │   │   │   │       │       │   │   └── ca.example.com-cert.pem
│   │   │   │   │       │       │   ├── keystore
│   │   │   │   │       │       │   │   └── 2fb065725bf1b7e2811c0e8ca8d37f5a951fc4cd1162a47aad8accf9ddd10291_sk
│   │   │   │   │       │       │   ├── signcerts
│   │   │   │   │       │       │   │   └── orderer.example.com-cert.pem
│   │   │   │   │       │       │   └── tlscacerts
│   │   │   │   │       │       │       └── tlsca.example.com-cert.pem
│   │   │   │   │       │       └── tls
│   │   │   │   │       │           ├── ca.crt
│   │   │   │   │       │           ├── server.crt
│   │   │   │   │       │           └── server.key
│   │   │   │   │       ├── tlsca
│   │   │   │   │       │   ├── 6a211ed18880b4db3867831c977809902713b8e321a5ab55ecc104dafc2eec49_sk
│   │   │   │   │       │   └── tlsca.example.com-cert.pem
│   │   │   │   │       └── users
│   │   │   │   │           └── [email protected]
│   │   │   │   │               ├── msp
│   │   │   │   │               │   ├── admincerts
│   │   │   │   │               │   │   └── [email protected]
│   │   │   │   │               │   ├── cacerts
│   │   │   │   │               │   │   └── ca.example.com-cert.pem
│   │   │   │   │               │   ├── keystore
│   │   │   │   │               │   │   └── db670eed8487a93c35ae448b9f84c2f241a7a8c87df0544fc1dc08baf7832aa0_sk
│   │   │   │   │               │   ├── signcerts
│   │   │   │   │               │   │   └── [email protected]
│   │   │   │   │               │   └── tlscacerts
│   │   │   │   │               │       └── tlsca.example.com-cert.pem
│   │   │   │   │               └── tls
│   │   │   │   │                   ├── ca.crt
│   │   │   │   │                   ├── server.crt
│   │   │   │   │                   └── server.key
│   │   │   │   └── peerOrganizations
│   │   │   │       ├── org1.example.com
│   │   │   │       │   ├── ca
│   │   │   │       │   │   ├── 0e729224e8b3f31784c8a93c5b8ef6f4c1c91d9e6e577c45c33163609fe40011_sk
│   │   │   │       │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │   ├── msp
│   │   │   │       │   │   ├── admincerts
│   │   │   │       │   │   │   └── [email protected]
│   │   │   │       │   │   ├── cacerts
│   │   │   │       │   │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │   │   └── tlscacerts
│   │   │   │       │   │       └── tlsca.org1.example.com-cert.pem
│   │   │   │       │   ├── peers
│   │   │   │       │   │   ├── peer0.org1.example.com
│   │   │   │       │   │   │   ├── msp
│   │   │   │       │   │   │   │   ├── admincerts
│   │   │   │       │   │   │   │   │   └── [email protected]
│   │   │   │       │   │   │   │   ├── cacerts
│   │   │   │       │   │   │   │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │   │   │   │   ├── keystore
│   │   │   │       │   │   │   │   │   └── 27db82c96b1482480baa1c75f80e5cce249beaab27b70c741bb0e2554355957e_sk
│   │   │   │       │   │   │   │   ├── signcerts
│   │   │   │       │   │   │   │   │   └── peer0.org1.example.com-cert.pem
│   │   │   │       │   │   │   │   └── tlscacerts
│   │   │   │       │   │   │   │       └── tlsca.org1.example.com-cert.pem
│   │   │   │       │   │   │   └── tls
│   │   │   │       │   │   │       ├── ca.crt
│   │   │   │       │   │   │       ├── server.crt
│   │   │   │       │   │   │       └── server.key
│   │   │   │       │   │   └── peer1.org1.example.com
│   │   │   │       │   │       ├── msp
│   │   │   │       │   │       │   ├── admincerts
│   │   │   │       │   │       │   │   └── [email protected]
│   │   │   │       │   │       │   ├── cacerts
│   │   │   │       │   │       │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │   │       │   ├── keystore
│   │   │   │       │   │       │   │   └── fdee12a3510fde3155c37128cfec26090ae249bfbca28f884e60c21338493edd_sk
│   │   │   │       │   │       │   ├── signcerts
│   │   │   │       │   │       │   │   └── peer1.org1.example.com-cert.pem
│   │   │   │       │   │       │   └── tlscacerts
│   │   │   │       │   │       │       └── tlsca.org1.example.com-cert.pem
│   │   │   │       │   │       └── tls
│   │   │   │       │   │           ├── ca.crt
│   │   │   │       │   │           ├── server.crt
│   │   │   │       │   │           └── server.key
│   │   │   │       │   ├── tlsca
│   │   │   │       │   │   ├── 945092d936f5838c5a6f6484db974d857933706737d00d04bf65f74e3976f9f8_sk
│   │   │   │       │   │   └── tlsca.org1.example.com-cert.pem
│   │   │   │       │   └── users
│   │   │   │       │       ├── [email protected]
│   │   │   │       │       │   ├── msp
│   │   │   │       │       │   │   ├── admincerts
│   │   │   │       │       │   │   │   └── [email protected]
│   │   │   │       │       │   │   ├── cacerts
│   │   │   │       │       │   │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │       │   │   ├── keystore
│   │   │   │       │       │   │   │   └── 5890f0061619c06fb29dea8cb304edecc020fe63f41a6db109f1e227cc1cb2a8_sk
│   │   │   │       │       │   │   ├── signcerts
│   │   │   │       │       │   │   │   └── [email protected]
│   │   │   │       │       │   │   └── tlscacerts
│   │   │   │       │       │   │       └── tlsca.org1.example.com-cert.pem
│   │   │   │       │       │   └── tls
│   │   │   │       │       │       ├── ca.crt
│   │   │   │       │       │       ├── server.crt
│   │   │   │       │       │       └── server.key
│   │   │   │       │       └── [email protected]
│   │   │   │       │           ├── msp
│   │   │   │       │           │   ├── admincerts
│   │   │   │       │           │   │   └── [email protected]
│   │   │   │       │           │   ├── cacerts
│   │   │   │       │           │   │   └── ca.org1.example.com-cert.pem
│   │   │   │       │           │   ├── keystore
│   │   │   │       │           │   │   └── 73cdc0072c7203f1ec512232c780fc84acc9752ef30ebc16be1f4666c02b614b_sk
│   │   │   │       │           │   ├── signcerts
│   │   │   │       │           │   │   └── [email protected]
│   │   │   │       │           │   └── tlscacerts
│   │   │   │       │           │       └── tlsca.org1.example.com-cert.pem
│   │   │   │       │           └── tls
│   │   │   │       │               ├── ca.crt
│   │   │   │       │               ├── server.crt
│   │   │   │       │               └── server.key
│   │   │   │       └── org2.example.com
│   │   │   │           ├── ca
│   │   │   │           │   ├── a7d47efa46a6ba07730c850fed2c1375df27360d7227f48cdc2f80e505678005_sk
│   │   │   │           │   └── ca.org2.example.com-cert.pem
│   │   │   │           ├── msp
│   │   │   │           │   ├── admincerts
│   │   │   │           │   │   └── [email protected]
│   │   │   │           │   ├── cacerts
│   │   │   │           │   │   └── ca.org2.example.com-cert.pem
│   │   │   │           │   └── tlscacerts
│   │   │   │           │       └── tlsca.org2.example.com-cert.pem
│   │   │   │           ├── peers
│   │   │   │           │   ├── peer0.org2.example.com
│   │   │   │           │   │   ├── msp
│   │   │   │           │   │   │   ├── admincerts
│   │   │   │           │   │   │   │   └── [email protected]
│   │   │   │           │   │   │   ├── cacerts
│   │   │   │           │   │   │   │   └── ca.org2.example.com-cert.pem
│   │   │   │           │   │   │   ├── keystore
│   │   │   │           │   │   │   │   └── 0d9f72608133ee627b570b6af6877666bc8f365746f9329d6dd8a5f54e53e2ab_sk
│   │   │   │           │   │   │   ├── signcerts
│   │   │   │           │   │   │   │   └── peer0.org2.example.com-cert.pem
│   │   │   │           │   │   │   └── tlscacerts
│   │   │   │           │   │   │       └── tlsca.org2.example.com-cert.pem
│   │   │   │           │   │   └── tls
│   │   │   │           │   │       ├── ca.crt
│   │   │   │           │   │       ├── server.crt
│   │   │   │           │   │       └── server.key
│   │   │   │           │   └── peer1.org2.example.com
│   │   │   │           │       ├── msp
│   │   │   │           │       │   ├── admincerts
│   │   │   │           │       │   │   └── [email protected]
│   │   │   │           │       │   ├── cacerts
│   │   │   │           │       │   │   └── ca.org2.example.com-cert.pem
│   │   │   │           │       │   ├── keystore
│   │   │   │           │       │   │   └── 27ccb54a06020260c66c65bec91f91e1c9043e3076d3d6128692e7271c4c7a2c_sk
│   │   │   │           │       │   ├── signcerts
│   │   │   │           │       │   │   └── peer1.org2.example.com-cert.pem
│   │   │   │           │       │   └── tlscacerts
│   │   │   │           │       │       └── tlsca.org2.example.com-cert.pem
│   │   │   │           │       └── tls
│   │   │   │           │           ├── ca.crt
│   │   │   │           │           ├── server.crt
│   │   │   │           │           └── server.key
│   │   │   │           ├── tlsca
│   │   │   │           │   ├── 7bb8ba3ff11d3c8cf592bd4326062e77d06ac4963c7b7ae459284dfbd3eb5aac_sk
│   │   │   │           │   └── tlsca.org2.example.com-cert.pem
│   │   │   │           └── users
│   │   │   │               ├── [email protected]
│   │   │   │               │   ├── msp
│   │   │   │               │   │   ├── admincerts
│   │   │   │               │   │   │   └── [email protected]
│   │   │   │               │   │   ├── cacerts
│   │   │   │               │   │   │   └── ca.org2.example.com-cert.pem
│   │   │   │               │   │   ├── keystore
│   │   │   │               │   │   │   └── 1995b11d6573ed3be52fcd7a5fa477bc0f183e1f5f398c8281d0ce7c2c75a076_sk
│   │   │   │               │   │   ├── signcerts
│   │   │   │               │   │   │   └── [email protected]
│   │   │   │               │   │   └── tlscacerts
│   │   │   │               │   │       └── tlsca.org2.example.com-cert.pem
│   │   │   │               │   └── tls
│   │   │   │               │       ├── ca.crt
│   │   │   │               │       ├── server.crt
│   │   │   │               │       └── server.key
│   │   │   │               └── [email protected]
│   │   │   │                   ├── msp
│   │   │   │                   │   ├── admincerts
│   │   │   │                   │   │   └── [email protected]
│   │   │   │                   │   ├── cacerts
│   │   │   │                   │   │   └── ca.org2.example.com-cert.pem
│   │   │   │                   │   ├── keystore
│   │   │   │                   │   │   └── 585175c83bac91fc0c1ce8f9d0ff9aefa47c565678f100ca8673db249ee785ac_sk
│   │   │   │                   │   ├── signcerts
│   │   │   │                   │   │   └── [email protected]
│   │   │   │                   │   └── tlscacerts
│   │   │   │                   │       └── tlsca.org2.example.com-cert.pem
│   │   │   │                   └── tls
│   │   │   │                       ├── ca.crt
│   │   │   │                       ├── server.crt
│   │   │   │                       └── server.key
│   │   │   ├── cryptogen.yaml
│   │   │   ├── genesis.block
│   │   │   └── mychannel.tx
│   │   ├── docker-compose.yaml
│   │   ├── network-config-aws.yaml
│   │   ├── network-config.yaml
│   │   ├── org1.yaml
│   │   ├── org2.yaml
│   │   └── src
│   │       └── github.com
│   │           └── example_cc
│   │               ├── go
│   │               │   └── example_cc.go
│   │               └── node
│   │                   ├── example_cc.js
│   │                   └── package.json
│   ├── config.js
│   ├── config.json
│   ├── package.json
│   ├── README.md
│   ├── runApp.sh
│   ├── testAPIs.sh
│   └── typescript
│       ├── api
│       │   ├── chaincode.ts
│       │   ├── channel.ts
│       │   ├── index.ts
│       │   ├── users.ts
│       │   └── utils.ts
│       ├── app_config.json
│       ├── app.ts
│       ├── artifacts -> ../artifacts
│       ├── config.ts
│       ├── interfaces.ts
│       ├── lib
│       │   ├── chaincode.ts
│       │   ├── channel.ts
│       │   ├── helper.ts
│       │   └── network-config.json
│       ├── package.json
│       ├── README.md
│       ├── runApp.sh
│       ├── testAPIs.sh
│       ├── tsconfig.json
│       ├── tslint.json
│       └── types
│           ├── fabric-ca-client
│           │   └── index.d.ts
│           └── fabric-client
│               └── index.d.ts
├── basic-network
│   ├── config
│   │   ├── channel.tx
│   │   └── genesis.block
│   ├── configtx.yaml
│   ├── crypto-config
│   │   ├── ordererOrganizations
│   │   │   └── example.com
│   │   │       ├── ca
│   │   │       │   ├── a0606a4a860a1e31c90a23788da6f3b6b74925ed0d23061af4899409ba46ae6a_sk
│   │   │       │   └── ca.example.com-cert.pem
│   │   │       ├── msp
│   │   │       │   ├── admincerts
│   │   │       │   │   └── [email protected]
│   │   │       │   ├── cacerts
│   │   │       │   │   └── ca.example.com-cert.pem
│   │   │       │   └── tlscacerts
│   │   │       │       └── tlsca.example.com-cert.pem
│   │   │       ├── orderers
│   │   │       │   └── orderer.example.com
│   │   │       │       ├── msp
│   │   │       │       │   ├── admincerts
│   │   │       │       │   │   └── [email protected]
│   │   │       │       │   ├── cacerts
│   │   │       │       │   │   └── ca.example.com-cert.pem
│   │   │       │       │   ├── keystore
│   │   │       │       │   │   └── 4d2f776c0fef8eac3f460a7c3558dc7859c4fe458e262e674a6c23f242ea33d1_sk
│   │   │       │       │   ├── signcerts
│   │   │       │       │   │   └── orderer.example.com-cert.pem
│   │   │       │       │   └── tlscacerts
│   │   │       │       │       └── tlsca.example.com-cert.pem
│   │   │       │       └── tls
│   │   │       │           ├── ca.crt
│   │   │       │           ├── server.crt
│   │   │       │           └── server.key
│   │   │       ├── tlsca
│   │   │       │   ├── 8d2186556c85d515e737d0c0da8d0d7672785b685cb503bcb95e53dcc279fba7_sk
│   │   │       │   └── tlsca.example.com-cert.pem
│   │   │       └── users
│   │   │           └── [email protected]
│   │   │               ├── msp
│   │   │               │   ├── admincerts
│   │   │               │   │   └── [email protected]
│   │   │               │   ├── cacerts
│   │   │               │   │   └── ca.example.com-cert.pem
│   │   │               │   ├── keystore
│   │   │               │   │   └── 1deeab5433fa6e5f045eb763109d6165268fba153211af1281f00d45f54b1022_sk
│   │   │               │   ├── signcerts
│   │   │               │   │   └── [email protected]
│   │   │               │   └── tlscacerts
│   │   │               │       └── tlsca.example.com-cert.pem
│   │   │               └── tls
│   │   │                   ├── ca.crt
│   │   │                   ├── server.crt
│   │   │                   └── server.key
│   │   └── peerOrganizations
│   │       └── org1.example.com
│   │           ├── ca
│   │           │   ├── 4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
│   │           │   ├── ca.org1.example.com-cert.pem
│   │           │   └── org1.example.com-cert.pem
│   │           ├── msp
│   │           │   ├── admincerts
│   │           │   │   └── [email protected]
│   │           │   ├── cacerts
│   │           │   │   └── ca.org1.example.com-cert.pem
│   │           │   └── tlscacerts
│   │           │       └── tlsca.org1.example.com-cert.pem
│   │           ├── peers
│   │           │   └── peer0.org1.example.com
│   │           │       ├── msp
│   │           │       │   ├── admincerts
│   │           │       │   │   └── [email protected]
│   │           │       │   ├── cacerts
│   │           │       │   │   └── ca.org1.example.com-cert.pem
│   │           │       │   ├── keystore
│   │           │       │   │   └── 46be1d569fe68f33e517c9e0072a0ccfbfb42727480fb8c8d0223af321a7893d_sk
│   │           │       │   ├── signcerts
│   │           │       │   │   └── peer0.org1.example.com-cert.pem
│   │           │       │   └── tlscacerts
│   │           │       │       └── tlsca.org1.example.com-cert.pem
│   │           │       └── tls
│   │           │           ├── ca.crt
│   │           │           ├── server.crt
│   │           │           └── server.key
│   │           ├── tlsca
│   │           │   ├── ed3fd82393e95fc2c475afc113c8d2c591f745d1babc4d6d9cce0a1acc168acb_sk
│   │           │   └── tlsca.org1.example.com-cert.pem
│   │           └── users
│   │               ├── [email protected]
│   │               │   ├── msp
│   │               │   │   ├── admincerts
│   │               │   │   │   └── [email protected]
│   │               │   │   ├── cacerts
│   │               │   │   │   └── ca.org1.example.com-cert.pem
│   │               │   │   ├── keystore
│   │               │   │   │   └── cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec_sk
│   │               │   │   ├── signcerts
│   │               │   │   │   └── [email protected]
│   │               │   │   └── tlscacerts
│   │               │   │       └── tlsca.org1.example.com-cert.pem
│   │               │   └── tls
│   │               │       ├── ca.crt
│   │               │       ├── server.crt
│   │               │       └── server.key
│   │               └── [email protected]
│   │                   ├── msp
│   │                   │   ├── admincerts
│   │                   │   │   └── [email protected]
│   │                   │   ├── cacerts
│   │                   │   │   └── ca.org1.example.com-cert.pem
│   │                   │   ├── keystore
│   │                   │   │   └── c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83_sk
│   │                   │   ├── signcerts
│   │                   │   │   └── [email protected]
│   │                   │   └── tlscacerts
│   │                   │       └── tlsca.org1.example.com-cert.pem
│   │                   └── tls
│   │                       ├── ca.crt
│   │                       ├── server.crt
│   │                       └── server.key
│   ├── crypto-config.yaml
│   ├── docker-compose.yml
│   ├── generate.sh
│   ├── init.sh
│   ├── README.md
│   ├── start.sh
│   ├── stop.sh
│   └── teardown.sh
├── bin
│   ├── configtxgen
│   ├── configtxlator
│   ├── cryptogen
│   ├── discover
│   ├── fabric-ca-client
│   ├── get-docker-images.sh
│   ├── idemixgen
│   ├── orderer
│   └── peer
├── chaincode
│   ├── abac
│   │   └── go
│   │       ├── abac.go
│   │       └── vendor
│   │           ├── github.com
│   │           │   ├── golang
│   │           │   │   └── protobuf
│   │           │   │       ├── LICENSE
│   │           │   │       └── proto
│   │           │   │           ├── clone.go
│   │           │   │           ├── decode.go
│   │           │   │           ├── discard.go
│   │           │   │           ├── encode.go
│   │           │   │           ├── equal.go
│   │           │   │           ├── extensions.go
│   │           │   │           ├── lib.go
│   │           │   │           ├── Makefile
│   │           │   │           ├── message_set.go
│   │           │   │           ├── pointer_reflect.go
│   │           │   │           ├── pointer_unsafe.go
│   │           │   │           ├── properties.go
│   │           │   │           ├── text.go
│   │           │   │           └── text_parser.go
│   │           │   ├── hyperledger
│   │           │   │   └── fabric
│   │           │   │       ├── common
│   │           │   │       │   └── attrmgr
│   │           │   │       │       └── attrmgr.go
│   │           │   │       ├── core
│   │           │   │       │   └── chaincode
│   │           │   │       │       └── lib
│   │           │   │       │           └── cid
│   │           │   │       │               ├── cid.go
│   │           │   │       │               ├── interfaces.go
│   │           │   │       │               └── README.md
│   │           │   │       └── LICENSE
│   │           │   └── pkg
│   │           │       └── errors
│   │           │           ├── appveyor.yml
│   │           │           ├── errors.go
│   │           │           ├── LICENSE
│   │           │           ├── README.md
│   │           │           └── stack.go
│   │           └── vendor.json
│   ├── chaincode_example02
│   │   ├── go
│   │   │   └── chaincode_example02.go
│   │   └── node
│   │       ├── chaincode_example02.js
│   │       └── package.json
│   ├── fabcar
│   │   ├── go
│   │   │   └── fabcar.go
│   │   └── node
│   │       ├── fabcar.js
│   │       └── package.json
│   ├── marbles02
│   │   ├── go
│   │   │   ├── marbles_chaincode.go
│   │   │   └── META-INF
│   │   │       └── statedb
│   │   │           └── couchdb
│   │   │               └── indexes
│   │   │                   └── indexOwner.json
│   │   └── node
│   │       ├── marbles_chaincode.js
│   │       ├── META-INF
│   │       │   └── statedb
│   │       │       └── couchdb
│   │       │           └── indexes
│   │       │               └── indexOwner.json
│   │       └── package.json
│   ├── marbles02_private
│   │   ├── collections_config.json
│   │   └── go
│   │       ├── marbles_chaincode_private.go
│   │       └── META-INF
│   │           └── statedb
│   │               └── couchdb
│   │                   └── collections
│   │                       └── collectionMarbles
│   │                           └── indexes
│   │                               └── indexOwner.json
│   └── sacc
│       └── sacc.go
├── chaincode-docker-devmode
│   ├── docker-compose-simple.yaml
│   ├── msp
│   │   ├── admincerts
│   │   │   └── admincert.pem
│   │   ├── cacerts
│   │   │   └── cacert.pem
│   │   ├── keystore
│   │   │   └── key.pem
│   │   ├── signcerts
│   │   │   └── peer.pem
│   │   ├── tlscacerts
│   │   │   └── tlsroot.pem
│   │   └── tlsintermediatecerts
│   │       └── tlsintermediate.pem
│   ├── myc.tx
│   ├── orderer.block
│   ├── README.rst
│   └── script.sh
├── CODE_OF_CONDUCT.md
├── config
│   ├── configtx.yaml
│   ├── core.yaml
│   └── orderer.yaml
├── CONTRIBUTING.md
├── fabcar
│   ├── enrollAdmin.js
│   ├── invoke.js
│   ├── package.json
│   ├── query.js
│   ├── registerUser.js
│   └── startFabric.sh
├── fabric-ca
│   ├── bootstrap.sh
│   ├── build-images.sh
│   ├── makeDocker.sh
│   ├── README.md
│   ├── scripts
│   │   ├── env.sh
│   │   ├── run-fabric.sh
│   │   ├── setup-fabric.sh
│   │   ├── start-intermediate-ca.sh
│   │   ├── start-orderer.sh
│   │   ├── start-peer.sh
│   │   └── start-root-ca.sh
│   ├── start.sh
│   └── stop.sh
├── first-network
│   ├── base
│   │   ├── docker-compose-base.yaml
│   │   └── peer-base.yaml
│   ├── byfn.sh
│   ├── channel-artifacts
│   ├── configtx.yaml
│   ├── crypto-config.yaml
│   ├── docker-compose-cli.yaml
│   ├── docker-compose-couch-org3.yaml
│   ├── docker-compose-couch.yaml
│   ├── docker-compose-e2e-template.yaml
│   ├── docker-compose-org3.yaml
│   ├── eyfn.sh
│   ├── org3-artifacts
│   │   ├── configtx.yaml
│   │   └── org3-crypto.yaml
│   ├── README.md
│   └── scripts
│       ├── capabilities.json
│       ├── script.sh
│       ├── step1org3.sh
│       ├── step2org3.sh
│       ├── step3org3.sh
│       ├── testorg3.sh
│       ├── upgrade_to_v12.sh
│       └── utils.sh
├── high-throughput
│   ├── chaincode
│   │   └── high-throughput.go
│   ├── README.md
│   └── scripts
│       ├── channel-setup.sh
│       ├── delete-invoke.sh
│       ├── get-invoke.sh
│       ├── get-traditional.sh
│       ├── install-chaincode.sh
│       ├── instantiate-chaincode.sh
│       ├── many-updates.sh
│       ├── many-updates-traditional.sh
│       ├── prunefast-invoke.sh
│       ├── prunesafe-invoke.sh
│       ├── setclienv.sh
│       ├── update-invoke.sh
│       └── upgrade-chaincode.sh
├── Jenkinsfile
├── LICENSE
├── MAINTAINERS.md
├── README.md
└── scripts
    ├── bootstrap.sh
    └── Jenkins_Scripts
        ├── byfn_eyfn.sh
        └── CI_Script.sh

然后我们在执行 docker images 查看拉下来的镜像,如下:

hyperledger/fabric-ca          1.2.0               66cc132bd09c        2 weeks ago         252 MB
hyperledger/fabric-ca          latest              66cc132bd09c        2 weeks ago         252 MB
hyperledger/fabric-tools       1.2.0               379602873003        2 weeks ago         1.51 GB
hyperledger/fabric-tools       latest              379602873003        2 weeks ago         1.51 GB
hyperledger/fabric-ccenv       1.2.0               6acf31e2d9a4        2 weeks ago         1.43 GB
hyperledger/fabric-ccenv       latest              6acf31e2d9a4        2 weeks ago         1.43 GB
hyperledger/fabric-orderer     1.2.0               4baf7789a8ec        2 weeks ago         152 MB
hyperledger/fabric-orderer     latest              4baf7789a8ec        2 weeks ago         152 MB
hyperledger/fabric-peer        1.2.0               82c262e65984        2 weeks ago         159 MB
hyperledger/fabric-peer        latest              82c262e65984        2 weeks ago         159 MB
hyperledger/fabric-zookeeper   0.4.10              2b51158f3898        2 weeks ago         1.44 GB
hyperledger/fabric-zookeeper   latest              2b51158f3898        2 weeks ago         1.44 GB
hyperledger/fabric-kafka       0.4.10              936aef6db0e6        2 weeks ago         1.45 GB
hyperledger/fabric-kafka       latest              936aef6db0e6        2 weeks ago         1.45 GB
hyperledger/fabric-couchdb     0.4.10              3092eca241fc        2 weeks ago         1.61 GB
hyperledger/fabric-couchdb     latest              3092eca241fc        2 weeks ago         1.61 GB
hyperledger/fabric-baseos      amd64-0.4.10        52190e831002        2 weeks ago         132 MB
hyperledger/fabric-tools       x86_64-1.1.0        b7bfddf508bc        4 months ago        1.46 GB
hyperledger/fabric-orderer     x86_64-1.1.0        ce0c810df36a        4 months ago        180 MB
hyperledger/fabric-peer        x86_64-1.1.0        b023f9be0771        4 months ago        187 MB
hyperledger/fabric-ccenv       x86_64-1.1.0        c8b4909d8d46        4 months ago        1.39 GB

OK这里我们已经成功下载了所需的文件及构建网络用的镜像

首先,我们来说一下我们下载的fabric-samples目录中的一些目录及文件都是要做些什么的,在fabric-samples里面的bin目录下【我这里是 /home/gavin/fabric/fabric-samples/bin】有这么三个工具 configtxgen  configtxlator  cryptogen 提供给我们在启动fabric网络之前用来构建我们所需要启动网络的一些配置以及用来启动Orderer及peer节点的 二进制文件,然后我们回到 fabric-samples的根目录下【我这里是  /home/gavin/fabric/fabric-samples 】:

            

其中根目录下的各个子目录:

balance-transfer:是一个node.js 写的一个使用fabric node sdk 来和 fabric网络交互的一个示例项目 【关于 balance-transfer 示例项目我们后面再讲】

basic-network: 是一个最基础的fabric网络必备的一些配置信息,利用它我们可以启动一个基础的fabric网络

first-network:顾名思义,我们的第一个fabric网络,这个相对比basic-network更为全面一点,我们在里面可以启动一个基本的fabric网络外,做动态的【即在网络运行的情况下】添加新的组织,新的通道等等之类的操作示例

fabric-ca:展示了具备ca服务节点的网络示例

high-throughput:给我们展示了如何搭建一个高并发事务的fabric网络

scripts:是一些CI/CD的自动化脚本

fabcar:一些简单的node.js的示例 演示的时候主要用到 fabcar主要的文件夹是basic-network,chaincode,fabca (查看 startFabric.sh 脚本也有说明)通过单机配置模拟环境,实现管理员admin用户的enrollAdmin(注册管理),其他用户的注册(主要是指user1)。以及实现query和invoke [https://blog.csdn.net/qq_36357926/article/details/78494417]

config:中主要放着三个文件 configtx.yamlcore.yamlorderer.yaml 其中 configtx.yaml 是主要配置用来生成网络的各项配置(如: genesis.block、channel.tx 、及锚节点的更新配置文件)的示例模板;core.yaml 为peer节点的启动配置;orderer.yaml 为orderer节点的启动配置;【注意了 生成组织结构的配置文件是 crypto-config.yaml 这个在 first-network 中有示例】

chaincode:官方提供的链码示例,智能合约的示例;自己本地测试链码的时候也可以把写好的链码放置这里,然后挂载到容器里面

chaincode-docker-devmode:官方提供的本地调试链码的时候所具备的一些配置及启动文件【即 本地调试的环境】

OK,到这里我们大致上知道了fabric-samples的下的各个目录是做些什么的了,那么我们可以先来玩一下fabric网络搭建流程及链码调用的整个流程是怎么样的,我们先进入first-network目录下 (我这里是  /home/gavin/fabric/fabric-samples/first-network )【注意 我们不一定要进入 first-network目录来启动网络,只是说这个比较能说明整个流程而已,我们在 basic-network 或者 fabcar、fabric-ca 等等目录下都可以启动网络,只是不同文件夹给我们展现的是不同情况下的网络,具体看上面我对各个目录的说明就明白了】,我们在这个目录下会看到一个  byfn.sh 文件(by first-network)  vim byfn.sh 通过查看这个文件我们可以看到最底下有这些内容:

             

我们可以知道 在执行这个文件的时候可以携带的各项参数,我们来执行下 ./byfn.sh up 然后我们可以在控制台看到它整个启动网络前做了哪些事,怎么启动网络,启动网络后怎么部署链码,怎么调用链码等等全过程,如果我们看到最后显示为 :

则表示整个过程完全执行成功了!我们再执行一下, docker ps 查看下目前网络启动的docker container都有哪些

顺便我们可以执行下 docker images 查看下生成了哪些新的镜像文件

我们可以看到 新生成了几个带有 dev- 开头的镜像文件,这几个就是所被部署的到peer节点的链码所启动的链码镜像文件~

【注意】每一次跑完示例之后我们都需要  ./byfn.sh down 来关闭网络,杀掉docker container 删掉 链码的 docker images

OK,今天就先到这里,我们会在下一节里面讲述 拉取下来的 fabric文件和镜像的作用及 手动启动网络的全过程讲解!

猜你喜欢

转载自blog.csdn.net/qq_25870633/article/details/81113464