1、获取fabric相关源代码
首先,需要在/opt/gopath中新建目录, mkdir -p /opt/gopath/src/github.com/hyperledger/
其次,下载fabric源码,git clone https://github.com/hyperledger/fabric.git
或者 git clone https://gerrit.hyperledger.org/r/fabric
下载fabric-samples,git clone -b master https://github.com/hyperledger/fabric-samples.git
1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用
docker ps -a 查看所有容器
docker stop name(name为docker ps -a中的name列)
docker rm $(docker ps -a -q) #删除所有容器
2)cd fabric-samples
git tag #查看有哪几个版本,笔者当前有如下tag
v1.0.2
v1.0.6
v1.1.0
v1.1.0-alpha
v1.1.0-preview
v1.1.0-rc1
git checkout -b v1.1.0-alpha #该命令会在本地新建一个v1.1.0-alpha的分支,该分支内容即为tag为v1.1.0-alpha的版本内容 ,此处需要注意的是初次clone fabric-sample后,需要使用git checkout -b v1.1.0-alpha,否则本地文件没有改变;第一次成功后就可以直接使用 git checkout v1.1.0-alpha来切换版本了
注:笔者使用默认git clone 的v1.1.0-rc1 出问题了,问题如下:
ERROR! Local Fabric binary version of 1.0.0 does not match this newer version of BYFN and is unsupported. Either move to a later version of Fabric or checkout an earlier version of fabric-samples.
即:v1.0.0的fabri bin文件夹下的程序和v1.1.0-rc1不匹配,因此可选择使用新版本的fabric或者回退fabric-samples,笔者向前回退发现使用alpha成功了,因此可优先使用v1.1.0-alpha
3)执行fabric/scripts下的bootstrap-1.0.0.sh脚本,以获取一个包含configtxgen、cryptogen和peer等文件的bin目录
cd到fabric/scripts下,执行./bootstrap-1.0.0.sh,该命令不仅会下载bin目录,还会从docker hub中拉取必要的fabric网络运行所需的docker镜像
如果fabric/scripts下没有对应的sh文件,则需要 git checkout -b v1.0.0 #该命令在本地新建一个v1.0.0的分支,v1.0.0的scripts目录下包含多种sh文件,我们只需使用bootstrap-1.0.0.sh文件,生成bin命令后,将fabric/scripts/bin目录拷贝到fabric-samples/下
需要注意的是,初次切换到新分支或者tag的时候需要使用git checkout -b v1.0.0来新建tag对应的分支,否则本地script脚本下文件没有改变,后续可以直接使用git checkout v1.0.0 切换到对应的分支
注意:笔者也测试过bootstrap-1.0.0-rc1.sh,其下载的bin文件夹也可以供v1.1.0-alpha 版的fabric-samples使用
4)cd /fabric-samples/first-network
执行./byfn.sh -m generate 产生必要的文件
执行./byfn.sh -m up启动网络,选项为y,成功启动后如下图所示:
执行./byfn.sh -m down 关闭网络
注意:若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器
官方参考文档:http://hyperledger-fabric.readthedocs.io/en/release-1.0/build_network.html
1)先停止并删除所有运行的相关docker 容器,以免端口或服务被占用
docker ps -a 查看所有容器
docker stop name(name为docker ps -a中的name列)
docker rm $(docker ps -a -q) #删除所有容器
2)git checkout -b v1.0.0
cd fabric/scripts
./bootstrap-1.0.0.sh
该操作会生成fabric 1.0所需的docker images和包含configtxgen、cryptogen和peer等文件的bin目录,在运行fabric-samples的时候需要将其拷贝到fabric-samples目录下
3) cd fabric/examples/e2e_cli
执行./network_setup.sh up 启动网络,启动后界面同first-network一样
执行./network_setup.sh down 关闭网络
若执行失败,则检查一下是否拷贝了bin文件夹,是否关闭了相关的容器
(1) clearContainers函数删除所有容器的解决方法
在运行./byfn.sh -m down的时候回执行clearContainers() 函数中的CONTAINER_IDS=$(docker ps -aq),这会把所有的容器都删除,偷懒的方法是使用的时候需要确保宿主机上没有重要的容器,或者将容器数据备份一下!
比较靠谱的方法是更改一下byfn.sh脚本,使命令行只删除除了需要保存的容器之外的所有容器,为此笔者做了如下改进脚本如下:
function specialClearContainer(){
arrName=(mygerrit mynginx myjenkins) #此处更改为自己需要保留的容器名称
arrID=()
i=0
for var in ${arrName[@]} #将mygerrit mynginx myjenkins的containerID放到数组arrID中
do
arrID[$i]=$(docker ps -a|grep ${arrName[$i]}|cut -c1-12)
i=$i+1
done
echo '需保留容器:'${arrID[*]}
containerIDs=$(docker ps -aq)
arrContainerIDs=($containerIDs)
echo '所有的容器:'${arrContainerIDs[*]}
for var1 in ${arrContainerIDs[@]}
do
var=0 #默认var1和var2不相同,相同则设var为1
for var2 in ${arrID[@]}
do
if [ $var1 = $var2 ]
then
var=1
break
fi
done
if [ $var = 0 ] #如果var1不在var2中,那么可以删除var1对应的容器
then
echo '已删除容器:'$var1
docker rm -f $var1
fi
done
echo '存活的容器:'$(docker ps -aq)
}
#注意此处是byfn.sh脚本中的原版函数,笔者对clearContainers做了一些修改
# Obtain CONTAINER_IDS and remove them
# TODO Might want to make this optional - could clear other containers
function clearContainers () {
CONTAINER_IDS=$(docker ps -aq)
if [ -z "$CONTAINER_IDS" -o "$CONTAINER_IDS" == " " ]; then
echo "---- No containers available for deletion ----"
else
specialClearContainer #使用自己的函数
#docker rm -f $CONTAINER_IDS #原有的方法会删除所有的镜像,不推荐使用
fi
}
clearContainers
笔者有服务器上同时启动了mygerrit、mynginx、myjenkins、hello-world等4个容器,需要删掉除了mygerrit mynginx myjenkins之外的容器,运行脚本结果如下所示:
很明显,只删除了hello对应容器,其它容器正常存活,将删除更改添加到fabric各个启动脚本中就可以避免关闭fabric网络的时候删除所有容器的问题
(2)bin文件夹的说明
bin文件夹中包括6个文件: configtxgen configtxlator cryptogen get-byfn.sh get-docker-images.sh peer ;其中configtxgen 用于生成排序服务的创世区块和相关的配置文件,生成的文件在 channel-artifacts 中;cryptogen 用于生成工具证书,其生成的文件在 crypto-config中。
bin文件夹的获取方式:
方法一:执行fabric/scripts下的bootstrap-1.0.0.sh或./bootstrap-1.0.0.-rc1.sh脚本,脚本中有如下下载命令;
echo "===> Downloading platform binaries"
curl https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/hyperledger-fabric-${ARCH}-${VERSION}.tar.gz | tar xz
bin文件夹通常下载速度很慢,若下载不出来可以用方法二编译生成相关文件
方法二:屏蔽bootstrap-1.0.0***.sh中的curl下载功能,直接去pull 相关的docker镜像,使用fabric/examples/e2e_cli/generateArtifacts.sh 编译生成bin文件,generateArtifacts.sh脚本中有如下函数,该函数会判断$FABRIC_ROOT/release/$OS_ARCH/bin/下是否存在configtxgen文件,若不存在就make - C $FABRIC_ROOT release生成对应的bin文件夹,后续生成创世块和相应配置文件也使用该bin目录下的文件
function generateChannelArtifacts() {
CONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen
if [ -f "$CONFIGTXGEN" ]; then
echo "Using configtxgen -> $CONFIGTXGEN"
else
echo "Building configtxgen"
make -C $FABRIC_ROOT release
fi
echo "##########################################################"
echo "######### Generating Orderer Genesis block ##############"
echo "##########################################################"
# Note: For some unknown reason (at least for now) the block file can't be
# named orderer.genesis.block or the orderer will fail to launch!
$CONFIGTXGEN -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
echo
echo "#################################################################"
echo "### Generating channel configuration transaction 'channel.tx' ###"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
echo
echo "#################################################################"
echo "####### Generating anchor peer update for Org1MSP ##########"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
echo
echo "#################################################################"
echo "####### Generating anchor peer update for Org2MSP ##########"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
echo
}
CONFIGTXGEN=$FABRIC_ROOT/release/$OS_ARCH/bin/configtxgen
if [ -f "$CONFIGTXGEN" ]; then
echo "Using configtxgen -> $CONFIGTXGEN"
else
echo "Building configtxgen"
make -C $FABRIC_ROOT release
fi
echo "##########################################################"
echo "######### Generating Orderer Genesis block ##############"
echo "##########################################################"
# Note: For some unknown reason (at least for now) the block file can't be
# named orderer.genesis.block or the orderer will fail to launch!
$CONFIGTXGEN -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
echo
echo "#################################################################"
echo "### Generating channel configuration transaction 'channel.tx' ###"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME
echo
echo "#################################################################"
echo "####### Generating anchor peer update for Org1MSP ##########"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
echo
echo "#################################################################"
echo "####### Generating anchor peer update for Org2MSP ##########"
echo "#################################################################"
$CONFIGTXGEN -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP
echo
}
由于e2e_cli中使用编译生成的bin文件夹内的文件,所以在运行通过network_setup.sh脚本运行e2e_cli时候不需要将生成的bin文件夹拷贝到其它目录,若通过手动命令行运行时最好将其拷贝到同级或上级目录中;而byfn中默认是没有bin文件夹的,且byfn.sh脚本通过export PATH=${PWD}/../bin:${PWD}:$PATH 将bin文件夹导入到临时环境变量中,因此需要通过fabric项目生成相应的bin文件,并将其拷贝到fabric-samples项目目录中。
截图系统版本:Ubuntu 16.04.4 Desktop LTS (64-bit), 安装在VM虚拟机上
笔者也在腾讯云 Ubuntu 16.04 Server (64-bit)上测试过,可正常启动测试网络