使用系统版本:Ubuntu 18.04
提示1:任何命令错误都可以试试加sudo提升权限!!!
提示2:如果Ubuntu系统没有换源可以参考如何修改ubuntu软件源为国内源进行换源。
提示3:学习安装链码可参考超级账本Fabric2.x 如何将智能合约部署到通道。
参考文章:官方文档
Hyperledger Fabric2.0.0报错集锦
pip 是 Python 包管理工具,该工具提供了对Python 包的查找、下载、安装、卸载的功能。
sudo apt install python-pip
# 直接使用pip install --upgrade pip 命令会很慢,需要换源
# 这里直接使用-i参数,指定pip源
pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
cURL是一个利用URL语法在命令行下工作的文件传输工具。
sudo apt install curl
git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
sudo apt install git
首先需要安装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-reload
sudo systemctl restart docker
修改docker镜像源
# docker默认的源为国外官方源,下载速度较慢,可改为国内加速
cd /etc/docker
sudo vim daemon.json
# 写入
{
"registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
#保存退出
#重启docker服务
systemctl restart docker.service
# 进入主目录
cd ~
sudo apt install docker-compose
docker-compose -v
sudo chmod +x /usr/share/doc/docker-compose
sudo apt install libtool libltdl-dev
sudo wget https://studygolang.com/dl/golang/go1.15.5.linux-amd64.tar.gz
sudo tar -xzvf go1.15.5.linux-amd64.tar.gz -C /usr/local/
sudo vim /etc/profile
#在文件末尾加入如下代码
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source /etc/profile
go version
如果显示了版本号,就说明安装成功。首先创建文件夹(默认在~目录下)
mkdir -p go/src/github.com/hyperledger/
进入刚刚创建的文件夹内
cd go/src/github.com/hyperledger/
从github上拉取fabric的源码
git clone https://github.com/hyperledger/fabric.git
# 注意:这一步下载会很慢,可以使用科学上网方法
# 也可以使用Chrome浏览器中GitHub加速插件,下面使用加速插件连接替换
# 以下代码执行其中一行即可。
git clone https://hub.fastgit.org/hyperledger/fabric.git
# or
git clone https://github.com.cnpmjs.org/hyperledger/fabric.git
# or
git clone https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric.git
fabric官方提供了一个bootstrap.sh的脚本, 该脚本拥有三个功能 :1. 下载fabric-samples文件; 2. 下载二进制文件; 3. 拉取docker镜像。 并且这个脚本支持三个参数, 可以灵活地控制它的执行 . 分别是
-b:加上此参数,则不下载二进制文件
-d:加上此参数则不拉取docker镜像
-s:加上此参数则不下载fabric-samples
在完成2.1的操作后,进入~/go/src/github.com/hyperledger/fabric/scripts目录,会见到bootstrap.sh脚本文件,执行即可。
cd ~/go/src/github.com/hyperledger/fabric/scripts
sudo ./bootstrap.sh
注意!!!!
vim ~/go/src/github.com/hyperledger/fabric/scripts/bootstrap.sh
# 源代码为
# git clone -b master https://github.com/hyperledger/fabric-samples.git && cd fabric-samples
# 修改为
git clone -b master https://hub.fastgit.org/hyperledger/fabric-samples.git && cd fabric-samples
# or
git clone -b master https://github.com.cnpmjs.org/hyperledger/fabric-samples.git && cd fabric-samples
# or
git clone -b master https://github.91chifun.workers.dev//https://github.com/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 downloaded
if [ -d first-network ]; then
# if we are in the fabric-samples repo, checkout corresponding version
echo "==> Already in fabric-samples repo"
elif [ -d fabric-samples ]; then
# if fabric-samples repo already cloned and in current directory,
# cd fabric-samples
echo "===> Changing directory to fabric-samples"
cd fabric-samples
else
echo "===> Cloning hyperledger/fabric-samples repo"
#git clone -b master https://github.com/hyperledger/fabric-samples.git && cd fabric-samples
git clone -b master https://hub.fastgit.org/hyperledger/fabric-samples.git && cd fabric-samples
fi
if GIT_DIR=.git git rev-parse v${VERSION} >/dev/null 2>&1; then
echo "===> Checking out v${VERSION} of hyperledger/fabric-samples"
git checkout -q v${VERSION}
else
echo "fabric-samples v${VERSION} does not exist, defaulting master"
git checkout -q master
fi
}
# 源代码为
download "${BINARY_FILE}" "https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"
download "${CA_BINARY_FILE}" "https://github.com/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"
# 修改为
download "${BINARY_FILE}" "https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"
download "${CA_BINARY_FILE}" "https://github.91chifun.workers.dev//https://github.com/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}" "https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"
download "${BINARY_FILE}" "https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric/releases/download/v${VERSION}/${BINARY_FILE}"
if [ $? -eq 22 ]; then
echo
echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----"
echo
exit
fi
echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary"
# download "${CA_BINARY_FILE}" "https://github.com/hyperledger/fabric-ca/releases/download/v${CA_VERSION}/${CA_BINARY_FILE}"
download "${CA_BINARY_FILE}" "https://github.91chifun.workers.dev//https://github.com/hyperledger/fabric-ca/releases/download/v${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
exit
fi
}
保存bootstrap.sh脚本。
直接执行修改后bootstrap.sh脚本即可。
cd ~/go/src/github.com/hyperledger/fabric/scripts
sudo ./bootstrap.sh
# 下载速度可能还是很慢,可以等等再下载,因为可能源服务器下载量太大。
# 但是就算比较慢,还是比直接在GitHub上下载要快得多!!!
配置环境
运行后在fabric-samples目录下会形成bin和config目录。
将其添加到 PATH 环境变量中,以便在不需要指定每个二进制文件的绝对路径的情况下获取这些命令
sudo vim /etc/profile
export PATH=$GOPATH/src/github.com/hyperledger/fabric/scripts/fabric-samples/bin:$PATH
# 保存退出
# 执行
source /etc/profile
验证二进制文件和环境变量的配置是否成功,出现版本信息,说明安装成功.
peer version
在fabric-samples代码库的test-network目录中找到启动网络的脚本。在此目录中,可以找到带注释的脚本network.sh,该脚本在本地计算机上使用Docker镜像建立Fabric网络。
执行以下命令来启动网络
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
sudo ./network.sh up
# 此命令创建一个由两个对等节点和一个排序节点组成的Fabric网络
可以使用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
使用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: github.com/golang/[email protected]: Get "https://proxy.golang.org/github.com/golang/protobuf/@v/v1.3.2.mod": dial tcp 216.58.200.49:443: connect: connection refused: exit status 1
看错误提示可以看到它是访问golang的官网https://proxy.golang.org,这是外网,自然报错。
解决方法如下:
# 在命令行直接运行
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
解决以上两个问题后重新运行启动链码命令即可。
在启用测试网络后,可以使用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 Org1
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org1MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/[email protected]/msp
export 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/github.com/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/github.com/hyperledger/fabric/scripts/fabric-samples/fabcar
sudo ./startFabric.sh
再次执行查询命令
cd ~/go/src/github.com/hyperledger/fabric/scripts/fabric-samples/test-network
sudo peer chaincode query -C mychannel -n fabcar -c '{"Args":["queryAllCars"]}'
当网络成员要转移或更改帐上的资产时,将调用链码。 使用以下命令调用fabcar链码来更改账本上汽车的所有者:
sudo peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile ${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C mychannel -n fabcar --peerAddresses localhost:7051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt --peerAddresses localhost:9051 --tlsRootCertFiles ${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt -c '{"function":"changeCarOwner","Args":["CAR9","Dave"]}'
如果命令成功,您应该看到以下响应:
Chaincode invoke successful. result: status:200
使用完测试网络后,可以使用以下命令关闭网络:
sudo ./network.sh down
学习安装链码可参考超级账本Fabric2.x 如何将智能合约部署到通道。
如果想要学习更多的hyperledger-fabric知识,推荐去看官方文档。