本文使用RHEL 7.3 workstation版本操作系统。
创新互联公司于2013年创立,先为循化等服务建站,循化等地企业,进行企业商务咨询服务。为循化企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
(1)Go语言环境安装
Go语言环境安装包下载地址:
https://golang.org/dl/
https://golang.google.cn/dl/
将下载的源码包解压至/usr/local目录sudo tar -C /usr/local -xzf go1.10.1.linux-amd64.tar.gz
将/usr/local/go/bin目录添加至PATH环境变量export PATH=$PATH:/usr/local/go/bin
(2)GOPATH环境变量设置
GOPATH=/home/user/GoLang:/home/user/dev
export GOPATH
为了使用方便,通常需要将所有工作空间的bin路径添加到PATH环境变量中,如:export $PATH:$GOPATH/bin
如果$GOPATH有多个工作目录,使用 ${GOPATH//://bin:}/bin 添加所有的bin目录。export $PATH:${GOPATH//://bin:}/bin
yum install docker
GitHub地址:https://github.com/hyperledger/fabric
(1)go get下载
使用Go语言工具go get从HyperLeger Fabric项目的GitHub地址下载HyperLeger Fabric:go get -u -v github.com/hyperledger/fabric
(2)git clone下载
HyperLeger Fabric项目大小约76MB,如果使用go get工具下载速度慢,可以使用git clone下载:
创建hyperledger目录:mkdir -p $GOPATH/src/github.com/hyperledger
切换到hyperledger目录:cd $GOPATH/src/github.com/hyperledger
git clone下载:git clone https://github.com/hyperledger/fabric.git
进入HyperLeger Fabric项目所在源码目录:cd $GOPATH/src/github.com/hyperledger/fabric
切换到release-1.0版本:git checkout release-1.0
configtxgen工具用于生成Fabric的配置构件。
切换到configtxgen目录:cd common/configtx/tool/configtxgen
编译安装:go install
报错:fatal error: ltdl.h: No such file or directory
安装Itdl:yum install libtool-ltdl-devel
继续编译安装:go install
目标工具被安装到$GOPATH/bin目录下。
cryptogen工具用于生成Fabric证书和密钥。
切换到cryptogen源码目录:cd common/tools/cryptogen
编译安装:go install
目标工具被安装到$GOPATH/bin目录下。
fabric-samples项目包含first-network等HyperLeger Fabric项目的多个示例。
https://github.com/hyperledger/fabric-samples.git
下载fabric-samples项目到$GOPATH/src/github.com/hyperledger:git clone https://github.com/hyperledger/fabric-samples.git
切换到first-network示例:cd $GOPATH/src/github.com/hyperledger/fabric-samples/first-network
切换到release-1.0版本:git checkout release-1.0
first-network源码目录如下:
first-network示例即BYFN(build your first network),BYFN方案规定了一个由两个组织组成的简单HyperLeger Fabric网络,每个组织维护有两个对等节点和一个solo排序服务。
byfn.sh脚本利用Docker镜像快速引导BYFN(build your first network)示例网络,BYFN网络由代表两个不同组织的4个对等节点和一个排序节点组成。 byfn.sh脚本会启动容器运行一个脚本,脚本用于将对等节点加入一条通道,部署和实例化链码,并驱动在部署的链码上执行交易。
byfn.sh脚本提供了生成网络构件的功能,用于生成不同网络实体的所有证书和密钥,用于引导排序服务的创始块以及配置通道所需的交易配置的集合。命令如下:./byfn.sh -m generate -c scorpio -i 1.0.0
byfn.sh -m generate:使用cryptogen和configtxgen生成网络构件
-c:指定通道名称
-i:指定版本
[user@localhost first-network]$ ./byfn.sh -m generate -c scorpio -i 1.0.0
Generating certs and genesis block for with channel 'scorpio' and CLI timeout of '10'
Continue (y/n)? y
proceeding ...
/home/user/GoLang/bin/cryptogen
##########################################################
##### Generate certificates using cryptogen tool #########
##########################################################
org1.example.com
org2.example.com
/home/user/GoLang/bin/configtxgen
##########################################################
######### Generating Orderer Genesis block ##############
##########################################################
2018-10-21 15:52:45.442 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-10-21 15:52:45.467 CST [common/configtx/tool] doOutputBlock -> INFO 002 Generating genesis block
2018-10-21 15:52:45.469 CST [common/configtx/tool] doOutputBlock -> INFO 003 Writing genesis block
#################################################################
### Generating channel configuration transaction 'channel.tx' ###
#################################################################
2018-10-21 15:52:45.479 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-10-21 15:52:45.482 CST [common/configtx/tool] doOutputChannelCreateTx -> INFO 002 Generating new channel configtx
2018-10-21 15:52:45.482 CST [common/configtx/tool] doOutputChannelCreateTx -> INFO 003 Writing new channel tx
#################################################################
####### Generating anchor peer update for Org1MSP ##########
#################################################################
2018-10-21 15:52:45.494 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-10-21 15:52:45.497 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-10-21 15:52:45.498 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
#################################################################
####### Generating anchor peer update for Org2MSP ##########
#################################################################
2018-10-21 15:52:45.508 CST [common/configtx/tool] main -> INFO 001 Loading configuration
2018-10-21 15:52:45.513 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 002 Generating anchor peer update
2018-10-21 15:52:45.513 CST [common/configtx/tool] doOutputAnchorPeersUpdate -> INFO 003 Writing anchor peer update
cryptogen用于为各种网络实体生成加密材料(x509证书和签名密钥)。x509证书代表身份/标识,允许在实体进行通信和交易时进行签名/验证身份验证。
cryptogen(fabric证书/密钥生成工具)使用一个配置文件crypto-config.yaml(包含网络拓扑)为组织和属于组织的组件(peer/orderer)生成一组证书和密钥。每个组织都配置了一个唯一的根证书(ca-cert),用于将特定组件(peer和orderer)绑定到组织。通过为每个组织分配唯一的CA证书,可以模仿典型的网络,网络中的成员将使用其自己的证书颁发机构。 Hyperledger Fabric中的交易和通信由实体的私钥(密钥库)签名,然后通过公钥(签名)进行验证。
cryptogen工具生成的证书和密钥将保存到crypto-config目录,目录结构如下:
configtxgen使用一个configtx.yaml文件,configtx.yam定义了一个示例网络,网络中有一个排序服务组织OrdererOrg以及两个对等节点组织(Org1,Org2),每个组织管理和持有2个对等节点。configtx.yam文件还指定了一个SampleConsortium的联盟,由2个对等节点组织构成。需要特别注意文件顶部的Profiles部分,有两个唯一的头部信息,一个是排序节点的创世区块TwoOrgsOrdererGenesis,一个是通道TwoOrgsChannel。这两个头部信息会在创建网络构件时作为参数。
configtx.yaml文件也包含两个需要的额外规格说明。首先,指定了两个对等节点组织的对等节点(peer0.org1.example.com,peer0.org2.example.com);其次,指明了每个成员的MSP目录位置(MSPDir指定),从而允许在排序节点的创世块中存储每个组织的根证书。目前,任何网络实体和排序服务通信都必须要进行数字签名认证。
启动first-network,使用-i参数指定版本为1.0.0:./byfn.sh -m up -c scorpio -i 1.0.0
byfn.sh -m up:启动BYFN示例
首次启动first-network时,会从Docker镜像仓库下载下列三个镜像:
docker.io/hyperledger/fabric-orderer:x86_64-1.0.0
docker.io/hyperledger/fabric-peer:x86_64-1.0.0
docker.io/hyperledger/fabric-tools:x86_64-1.0.0
./byfn.sh -m down -c scorpio
用于关闭BYFN网络,会关闭容器,移除加密材料和4个配置信息,并且从Docker仓库删除链码镜像。
再次启动BYFN网络示例前,必须先关闭BYFN网络,删除生成的证书、容器、网络构件以及链码镜像等。如果不关闭BYFN网络,将会导致创建通道失败。错误如下:
!!!!!!!!!!!!!!! Channel creation failed !!!!!!!!!!!!!!!!
========= ERROR !!! FAILED to execute End-2-End Scenario ===========