【转载请标明出处】:https://blog.csdn.net/qq_25870633/article/details/81113464
首先声明,本作者是个水逼,没错我说的就是我自己,你们有意见?板凳直接拍你们头上。。。咳咳,废话不多说,首先这里作者在学习区块链的路上冥冥中感觉到明年,额,也就是2019年将是联盟链之年,所以这里就赶紧学习了下Fabric;首先fabric是个什么东西呢。2015年12月份,由开源世界的旗舰组织Linux基金会牵头,有几十家企业共同宣布Hyperledger联合项目的成立,而fabric正是其中一个顶级项目。Fabric主要有Go语言开发的面向企业的分布式账本平台,也是当今联盟链的宠儿。那么下面我们来开始说一说这个Fabric的一些架构的概念吧
首先,fabric主要归类有三大组件:
Orderer
peer
CA
背书过程
排序
记账前验证
msp:权限管理的基础,对某些资源(成员、节点、组织)进行身份验证机制
组织:拥有相同根证书的一组成员
身份证书:由CA 生成,第一个实体或组织可以有自己的证书
链码
交易
区块
应用通道
账本
组成fabric网络主要有 Orderer节点、peer节点、CA服务、channel、Org 等几个资源组成,交互方面相关还有 grpc、sdk、cli等等,下面我们看看组成fabric网络所需要的最小配置应该是怎么样的
上图所示,既然是联盟链那么在一个联盟中至少要有两个组织【org】且每个组织必须具备至少2个peer节点,一个Orderer节点,一个管理节点【其实也就是cli,其实默认也可以是两个组织中指定的一个peer作为默认cli默认进入的节点】,还有一个CA服务的节点,然后开启一个包含了这两个组织的4个peer的通道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 [] [] [][-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 】:
其中根目录下的各个子目录:
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文件和镜像的作用及 手动启动网络的全过程讲解!