超级账本Fabric 2.x 详细安装步骤及可能问题解决方式
使用系统版本:Ubuntu 18.04
提示1:任何命令错误都可以试试加sudo提升权限!!!
提示2:如果Ubuntu系统没有换源可以参考如何修改ubuntu软件源为国内源进行换源。
提示3:学习安装链码可参考超级账本Fabric2.x 如何将智能合约部署到通道。
参考文章:官方文档
Hyperledger Fabric2.0.0报错集锦
一、准备阶段
1.1 安装pip并更新
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。
sudo apt install python-pip# 直接使用pip install --upgrade pip 命令会很慢,需要换源# 这里直接使用-i参数,指定pip源pip install --upgrade pip -i https://pypi.tuna./simple
1.2 安装curl
cURL是一个利用URL语法在命令行下工作的文件传输工具。
sudo apt install curl
1.3 安装git
git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
sudo apt install git
1.4 安装docker
首先需要安装17.06.2-ce或更高版本,建议安装最新版本的docker。 安装docker之前为确保docker版本过低,卸载以前的docker,重新安装docker。
sudo apt-get remove docker docker-engine docker.io
卸载docker完成之后开始安装docker,分别执行以下命令
sudo apt install docker.io
查看版本
docker -v
(可选)如果你希望 docker daemon 在系统启动的时候会自动启动的话,使用下边的命令
sudo systemctl enable docker
将你的用户添加到 docker 组。
sudo usermod -a -G docker <username>
最后重启服务
sudo systemctl daemon-reloadsudo systemctl restart docker
修改docker镜像源
# docker默认的源为国外官方源,下载速度较慢,可改为国内加速cd /etc/dockersudo vim daemon.json# 写入{"registry-mirrors": ["https://registry.docker-","http://hub-mirror."]}#保存退出#重启docker服务systemctl restart docker.service# 进入主目录cd ~
1.5 安装docker-compose
执行下列命令安装sudo apt install docker-compose
查看是否安装成功
docker-compose -v
允许其他用户执行compose相关命令
sudo chmod +x /usr/share/doc/docker-compose
1.6 安装Go语言
首先安装一些必要的依赖sudo apt install libtool libltdl-dev
去 studygolang网站 下载Go语言的安装包,目前最新版本: go1.15.5.linux-amd64.tar.gz
将压缩包复制到/usr/local路径下,然后进行解压
sudo wget /dl/golang/go1.15.5.linux-amd64.tar.gz
下载完 Golang 压缩包之后,使用 tar 命令将压缩包解压到指定的 /usr/local/ 路径下,命令如下
sudo tar -xzvf go1.15.5.linux-amd64.tar.gz -C /usr/local/
下面开始配置环境变量
sudo vim /etc/profile#在文件末尾加入如下代码export PATH=$PATH:/usr/local/go/binexport GOROOT=/usr/local/goexport GOPATH=$HOME/goexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin
使用 source 命令,使刚刚添加的配置信息生效
source /etc/profile
使用 go version 命令验证是否安装成功
go version
如果显示了版本号,就说明安装成功。
二、安装示例、二进制和 Docker 镜像
2.1 下载fabric源码
首先创建文件夹(默认在~目录下)
mkdir -p go/src//hyperledger/
进入刚刚创建的文件夹内
cd go/src//hyperledger/
从github上拉取fabric的源码
git clone /hyperledger/fabric.git# 注意:这一步下载会很慢,可以使用科学上网方法# 也可以使用Chrome浏览器中GitHub加速插件,下面使用加速插件连接替换# 以下代码执行其中一行即可。git clone /hyperledger/fabric.git# orgit clone /hyperledger/fabric.git# orgit clone https://github.91chifun.workers.dev///hyperledger/fabric.git
2.2 执行bootstrap.sh脚本
fabric官方提供了一个bootstrap.sh的脚本, 该脚本拥有三个功能 :1. 下载fabric-samples文件; 2. 下载二进制文件; 3. 拉取docker镜像。 并且这个脚本支持三个参数, 可以灵活地控制它的执行 . 分别是
-b:加上此参数,则不下载二进制文件
-d:加上此参数则不拉取docker镜像
-s:加上此参数则不下载fabric-samples
在完成2.1的操作后,进入~/go/src//hyperledger/fabric/scripts目录,会见到bootstrap.sh脚本文件,执行即可。
cd ~/go/src//hyperledger/fabric/scriptssudo ./bootstrap.sh
注意!!!!
直接执行bootstrap.sh脚本会非常慢,并且容易因为运行时间过长而断开网络连接,从而下载失败。因此不建议直接执行bootstrap.sh脚本,建议从2.3开始继续往下走。如果使用以下方式依旧觉得慢,可以尝试超级账本Fabric安装示例、二进制和 Docker 镜像的另一种方式。但是以下方式操作更加简单,是更推荐的方式。
2.3 修改bootstrap.sh
进入bootstrap.shvim ~/go/src//hyperledger/fabric/scripts/bootstrap.sh
修改cloneSamplesRepo() 函数
在cloneSamplesRepo() 函数中会发现fabric-samples是在GitHub中克隆的,注释原克隆代码,修改为以下任一克隆代码(可以试试哪一个访问地址最快,选择最快的访问地址)
# 源代码为# git clone -b master /hyperledger/fabric-samples.git && cd fabric-samples# 修改为git clone -b master /hyperledger/fabric-samples.git && cd fabric-samples# orgit clone -b master /hyperledger/fabric-samples.git && cd fabric-samples# orgit clone -b master https://github.91chifun.workers.dev///hyperledger/fabric-samples.git && cd fabric-samples
修改后的cloneSamplesRepo() 函数如下所示
cloneSamplesRepo() {# clone (if needed) hyperledger/fabric-samples and checkout corresponding# version to the binaries and docker images to be downloadedif [ -d first-network ]; then# if we are in the fabric-samples repo, checkout corresponding versionecho "==> Already in fabric-samples repo"elif [ -d fabric-samples ]; then# if fabric-samples repo already cloned and in current directory,# cd fabric-samplesecho "===> Changing directory to fabric-samples"cd fabric-sampleselseecho "===> Cloning hyperledger/fabric-samples repo"#git clone -b master /hyperledger/fabric-samples.git && cd fabric-samplesgit clone -b master /hyperledger/fabric-samples.git && cd fabric-samplesfiif GIT_DIR=.git git rev-parse v${VERSION} >/dev/null 2>&1; thenecho "===> Checking out v${VERSION} of hyperledger/fabric-samples"git checkout -q v${VERSION}elseecho "fabric-samples v${VERSION} does not exist, defaulting master"git checkout -q masterfi}
修改pullBinaries() 函数
在pullBinaries() 函数中会发现二进制文件fabric v* 和 fabric ca v*也是在GitHub中下载的,注释原下载代码,修改为以下任一下载代码(可以试试哪一个访问地址最快,选择最快的访问地址)
# 源代码为download "${BINARY_FILE}" "/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"download "${CA_BINARY_FILE}" "/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"# 修改为download "${BINARY_FILE}" "https://github.91chifun.workers.dev///hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"download "${CA_BINARY_FILE}" "https://github.91chifun.workers.dev///hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"
修改后的pullBinaries() 函数如下所示
pullBinaries() {echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries"# download "${BINARY_FILE}" "/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"download "${BINARY_FILE}" "https://github.91chifun.workers.dev///hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"if [ $? -eq 22 ]; thenechoecho "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----"echoexitfiecho "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary"# download "${CA_BINARY_FILE}" "/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"download "${CA_BINARY_FILE}" "https://github.91chifun.workers.dev///hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"if [ $? -eq 22 ]; thenechoecho "------> ${CA_TAG} fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----"echoexitfi}
保存bootstrap.sh脚本。
2.4 执行修改后bootstrap.sh脚本
直接执行修改后bootstrap.sh脚本即可。
cd ~/go/src//hyperledger/fabric/scriptssudo ./bootstrap.sh# 下载速度可能还是很慢,可以等等再下载,因为可能源服务器下载量太大。# 但是就算比较慢,还是比直接在GitHub上下载要快得多!!!
配置环境
运行后在fabric-samples目录下会形成bin和config目录。
将其添加到 PATH 环境变量中,以便在不需要指定每个二进制文件的绝对路径的情况下获取这些命令
sudo vim /etc/profileexport PATH=$GOPATH/src//hyperledger/fabric/scripts/fabric-samples/bin:$PATH# 保存退出# 执行source /etc/profile
验证二进制文件和环境变量的配置是否成功,出现版本信息,说明安装成功.
peer version
三、使用Fabric的测试网络
3.1 启动测试网络
在fabric-samples代码库的test-network目录中找到启动网络的脚本。在此目录中,可以找到带注释的脚本network.sh,该脚本在本地计算机上使用Docker镜像建立Fabric网络。
执行以下命令来启动网络
cd ~/go/src//hyperledger/fabric/scripts/fabric-samples/test-networksudo ./network.sh up# 此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络
3.2 创建一个通道
可以使用network.sh脚本在Org1和Org2之间创建通道并加入他们的对等节点。 运行以下命令以创建一个默认名称为“ mychannel”的通道:
sudo ./network.sh createChannel
如果命令成功执行,您将看到以下消息打印在你的日志:
========= Channel successfully joined ===========
你也可以使用channel标志创建具有自定义名称的通道。 作为一个例子,以下命令将创建一个名为channel1的通道:
sudo ./network.sh createChannel -c channel1
通道标志还允许你创建多个不同名称的多个通道。 创建mychannel或channel1之后,你可以使用下面的命令创建另一个名为channel2的通道:
sudo ./network.sh createChannel -c channel2
如果你想一步建立网络并创建频道,则可以使用up和createChannel模式一起:
# 先使用sudo ./network.sh down关闭上面开启的Fabric网络。否则会失败。sudo ./network.sh up createChannel
3.3 在通道启动一个链码
使用network.sh创建通道后,你可以使用以下命令在通道上启动链码:
sudo ./network.sh deployCC
注意!!!
可能出现的问题1
执行上面的命令后可能会出现找不到go命令的错误,这是因为sudo命令会重置当前的环境变量,导致go命令找不到。聪明的人可能会想到不加sudo命令,然后运行后你会发现提示权限不够。
Error: failed to normalize chaincode path: failed to determine module root: exec: "go": executable file not found in $PATH
解决方法如下:
vim ~/.bashrc# 开头或末尾添加alias sudo='sudo env PATH=$PATH LD_LIBRARY_PATH=$LD_LIBRARY_PATH'# 保存退出# 重置环境配置source ~/.bashrc
可能出现的问题2
执行上面的命令后可能会出现以下错误:
Error: failed to normalize chaincode path: 'go list' failed with: go: /golang/protobuf@v1.3.2: Get "//golang/protobuf/@v/v1.3.2.mod": dial tcp 216.58.200.49:443: connect: connection refused: exit status 1
看错误提示可以看到它是访问golang的官网,这是外网,自然报错。
解决方法如下:
# 在命令行直接运行go env -w GO111MODULE=ongo env -w GOPROXY=,direct
解决以上两个问题后重新运行启动链码命令即可。
3.4 与网络交互
在启用测试网络后,可以使用peer CLI与您的网络进行交互。 peer CLI允许你调用已部署的智能合约,更新通道,或安装和部署新的智能合约。使用以下命令将bin文件夹中peer二进制文件添加到你的CLI路径:
export PATH=${PWD}/../bin:${PWD}:$PATH
将fabric-samples代码库中的FABRIC_CFG_PATH设置为指向其中的core.yaml文件:
export FABRIC_CFG_PATH=$PWD/../config/
设置环境变量,以允许你作为Org1操作peer CLI:
# Environment variables for Org1export CORE_PEER_TLS_ENABLED=trueexport CORE_PEER_LOCALMSPID="Org1MSP"export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations//peers/peer0./tls/ca.crtexport CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations//users/Admin@/mspexport CORE_PEER_ADDRESS=localhost:7051
CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向Org1的organizations文件夹中的的加密材料。如果你使用./network.sh deployCC安装和启动fabcar链码,你现在可以从CLI查询账本。 运行以下命令以获取已添加到通道账本中的汽车列表:
sudo peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
注意!!!运行上面的查询命令可能会出现以下的错误:
Fatal error when initializing core config : error when reading core config file: Config File "core" Not Found in "[/home/test/go/src//hyperledger/fabric/scripts/fabric-samples/test-network]"
上面的错误还是因为环境变量的问题。解决方法如下,进入对应目录,执行启动指令:
sudo vim /etc/sudoers# 将”Defaults env_reset”改成”Defaults !env_reset”,# 使用sudo模式需要重置用户的所有环境变量,改变此选项后就不再重置了。Defaults !env_reset
再次执行查询命令,如果再次出现以下错误:
Error: endorsement failure during query. response: status:500 message:"make sure the chaincode fabcar has been successfully defined on channel mychannel and try again: chaincode fabcar not found"
解决方法如下:
cd ~/go/src//hyperledger/fabric/scripts/fabric-samples/fabcarsudo ./startFabric.sh
再次执行查询命令
cd ~/go/src//hyperledger/fabric/scripts/fabric-samples/test-networksudo peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
当网络成员要转移或更改帐上的资产时,将调用链码。 使用以下命令调用fabcar链码来更改账本上汽车的所有者:
sudo peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride --tls --cafile ${PWD}/organizations/ordererOrganizations//orderers//msp/tlscacerts/-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations//peers/peer0./tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations//peers/peer0./tls/ca.crt -c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}'
如果命令成功,您应该看到以下响应:
Chaincode invoke successful. result: status:200
3.5 关停网络
使用完测试网络后,可以使用以下命令关闭网络:
sudo ./network.sh down
写在最后
学习安装链码可参考超级账本Fabric2.x 如何将智能合约部署到通道。
如果想要学习更多的hyperledger-fabric知识,推荐去看官方文档。