最近在准备开始学习区块链的超级账本编程,但是在搭建Hyperledger Fabric的时候就出现了很多问题,查阅网上的其他人写的博客,但是很少能够完整或者正确的将完整的安装过程表达清楚,因此将自己的环境搭建过程以及出现的问题写下来,希望能对其他人起到一些帮助。
其中在搭建过程参考了其他人的部分东西:
感谢博客:https://blog.csdn.net/qq_43681877/article/details/107399250
官方文档参考
https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html
首先说明一下自己的系统环境吧:
采用虚拟机做的操作系统。
内存分配了3g
硬盘分配了30g
Ubuntu16.04.6
如何通过虚拟机安装ubuntu操作系统就不说了,请自行查找资料。
接下来就是正式开始搭建环境了。我这里安装的是2.2.0版本。
1、按照Hyperledger Fabric官方提供的文档来说,首先在你的系统中应该安装着最新版本的git。对于ubuntu来说,可以按照以下方式来安装:
apt-get install git
对于Ubuntu,此PPA提供最新的稳定上游Git版本
add-apt-repository ppa:git-core/ppa
apt update;
apt install git
这个就不具体进行截图了,也忘记截图了。
在安装完毕之后,输入来查看安装的git版本。
git version
如果出现以下结果,则证明安装成功。
2、在完成git的安装后,应该继续安装最新版本的cURL,直接在控制台输入命令即可。命令如下:
sudo apt-get update
sudo apt install curl
安装成功的截图也忘记保存了,如果没有安装成功,具体见百度吧。这块也不是啥重点的地方。
3、接下来就是比较重要的了,安装 docker和docker-compose。如果打算在Hperledger Fabric 2.x上做开发或者相关的操作,这里需要安装的docker版本应该是docker 17.06.2-ce或者更高的版本。我这里安装的是docker 19.03.12-ce版本。
首先,如果安装过docker,应该先卸载旧的版本,具体命令如下:
sudo apt-get remove docker docker-engine docker.io containerd runc
如果之前没有安装过docker的可以跳过这一步。接下来就是安装docker
运行安装的命令包,
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
然后添加docker的官方GPG密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
再继续设置stable稳定的仓库(stable稳定版每季度发布一次,Edge版每月一次)
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
更新目录
sudo apt-get update
安装docker-ce
sudo apt-get install docker-ce
安装完毕之后,可以输入以下命令来验证安装是否成功:
docker version
如果出现下面的截图,安装成功。
由于docker命令每次需要使用sudo权限来运行,每次都输入sudo很不方便。为了方便将当前用户加入docker用户组,以后就不用这么麻烦了。
sudo usermod -aG docker ${USER}
重新登录即可。
在每次使用docker pull命令pull镜像时,docker daemon都会去 Docker Hub 拉取镜像,网速较慢甚至在国内访问 Docker Hub 有时会遇到问题,所以我们可以配置镜像加速器。具体操作如下:
sudo gedit /etc/docker/daemon.json
输入以下配置
{
"registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"]
}
保存并退出
重启docker守护进程
sudo service docker restart
验证安装是否成功
docker run hello-world
出现下面截图,并输出红色标记的文字,即为安装成功。
安装dockerp-compose
#1)下载docker-compose
$ sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#2)授权
$ sudo chmod +x /usr/local/bin/docker-compose
#3)查看版本信息
$ docker-compose --version
出现下列情况即为安装成功。此时Hyperledger Fabric环境搭建已经算是完成了三分之一。
4、由于Hyperledger Fabric需要Go环境,接下来还有搭建Go语言环境。
大家可以安装自己的虚拟机的版本去GoLang官网上下载相应的版本。我这是提前在windows下载好保存在虚拟机和windows10的共享文件夹中的。只需将下载的GoLang文件拷贝到虚拟机中,进行安装即可。具体的安装步骤以及配置环境变量的方法大家就自行百度吧,基本我的方法和网上的也是大同小异。主要是忘记保存相关的截图了。不过一定得注意GOPATH和GOROOT的配置,如果配置不好,可能在接下来会出现问题。
敲黑板,重点来了。
5、确定您机器上要放置fabric-samples 存储库的位置,然后在终端窗口中输入该目录(一般把存储库放在刚刚配置的Go工作空间下的src文件夹下)。后面的命令将执行以下步骤:
如果需要,克隆hyperledger / fabric-samples存储库
签出适当的版本标签
将Hyperledger Fabric平台特定的二进制文件和配置文件安装为指定到Fabric-samples的/ bin和/ config目录中的版本
下载指定版本的Hyperledger Fabric docker映像
准备就绪后,在要安装Fabric Samples和二进制文件的目录中,继续执行命令以下拉二进制文件和映像。
我是这样做的:
首先创建存放代码的文件夹:
cd #cd 不加内容是默认返回Home文件夹
mkdir -p GoPath/src/github.com/hyperledger/
#进入刚刚创建的文件夹内
cd GoPath/src/github.com/hyperledger/
然后从github上拉取源码:
git clone "https://github.com/hyperledger/fabric.git"
cd fabric/
cd scripts/
#这一步会下载官方的例子以及所需要的Docker镜像
#下载是比较慢的,如果出现错误或者长时间没有速度只需要重新运行就可以了
sudo ./bootstrap.sh
这一步是非常慢的,耐心等待就好,如果中途终止,重新执行最后一行命令即可,知道下载完毕。
全部下载完成后,会多出一个fabric-samples文件夹,这是个测试网络样例可以让你体验或者测试。
进入到fabric-samples文件夹
cd fabric-samples
切换到test-network:
cd test-network:
现在便开始启动网络了:
./network.sh up createChannel
会出现一大堆上面的东西,等看到下面的这个的时候,就成功了。
加下来就需要在频道上启动链码
./network.sh deployCC
注意:在上面的时候可能会出现一个关于端口:7050的错误,忘记截图了:
如果出现这个问题,你先去查看一下7050这个端口是否开放,一般来说这个错误是端口没开放的原因,自己百度个一下怎么永久开放这个端口就行。
在执行上面的命令时,如果出现这个问题
一般来说就是访问无法下载,此时实在一个Go代理即可,如下:
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
再重新执行即可。
接下来就是和官方文档写的没啥区别了,我也就不再写了,直接引用官网教程了
启动测试网络后,可以使用peerCLI与网络进行交互。peerCLI允许您从CLI调用已部署的智能合约,更新通道或安装和部署新的智能合约。
确保您正在从test-network目录进行操作。如果按照说明安装样本,二进制文件和Docker映像,则可以在 存储库peer的bin文件夹中找到二进制文件fabric-samples。使用以下命令将这些二进制文件添加到您的CLI路径:
export PATH=${PWD}/../bin:$PATH
您还需要将设置FABRIC_CFG_PATH为指向存储库中的core.yaml文件fabric-samples:
export FABRIC_CFG_PATH=$PWD/../config/
现在,您可以设置环境变量,以允许您以peer Org1的形式操作CLI:
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/Admin@org1.example.com/msp
export CORE_PEER_ADDRESS=localhost:7051
该CORE_PEER_TLS_ROOTCERT_FILE和CORE_PEER_MSPCONFIGPATH环境变量指向的ORG1加密材料organizations文件夹。
如果您用于安装和启动资产转移(基本)链码,则可以调用(Go)链码的功能以在分类帐上放置资产的初始列表(例如,如果使用打字稿或javascript ,则将调用相应链码的功能)。`
./network.sh deployCCInitLedger./network.sh deployCC -l javascriptinitLedger`
运行以下命令以使用资产初始化分类帐:
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 basic --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":"InitLedger","Args":[]}'
如果成功,您应该看到类似以下的输出:
-> INFO 001 Chaincode invoke successful. result: status:200
现在,您可以从CLI查询分类帐。运行以下命令以获取已添加到渠道分类帐的资产列表:
peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
如果成功,您应该看到以下输出:
[
{"ID": "asset1", "color": "blue", "size": 5, "owner": "Tomoko", "appraisedValue": 300},
{"ID": "asset2", "color": "red", "size": 5, "owner": "Brad", "appraisedValue": 400},
{"ID": "asset3", "color": "green", "size": 10, "owner": "Jin Soo", "appraisedValue": 500},
{"ID": "asset4", "color": "yellow", "size": 10, "owner": "Max", "appraisedValue": 600},
{"ID": "asset5", "color": "black", "size": 15, "owner": "Adriana", "appraisedValue": 700},
{"ID": "asset6", "color": "white", "size": 15, "owner": "Michel", "appraisedValue": 800}
]
当网络成员要转移或更改分类账上的资产时,将调用链码。使用以下命令通过调用资产转移(基本)链码来更改分类帐上资产的所有者:
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 basic --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":"TransferAsset","Args":["asset6","Christopher"]}'
如果命令成功,您应该看到以下响应:
INFO 001 Chaincode invoke successful. result: status:200
因为资产转移(基本)链码的背书策略要求事务由Org1和Org2签名,所以chaincode invoke命令需要同时针对这两个目标 peer0.org1.example.com并peer0.org2.example.com使用该–peerAddresses 标志。由于已为网络启用TLS,因此该命令还需要使用该–tlsRootCertFiles标志为每个对等方引用TLS证书。
调用链代码后,我们可以使用另一个查询来查看该调用如何更改了区块链分类账上的资产。由于我们已经查询过Org1对等体,因此我们可以借此机会查询Org2对等体上运行的链码。设置以下环境变量以作为Org2进行操作:
export CORE_PEER_TLS_ENABLED=true
export CORE_PEER_LOCALMSPID="Org2MSP"
export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
export CORE_PEER_ADDRESS=localhost:9051
现在,您可以查询运行在上的资产转移(基本)链码peer0.org2.example.com:
peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
结果将显示"asset6"已转移到Christopher:
{"ID":"asset6","color":"white","size":15,"owner":"Christopher","appraisedValue":800}
中断网络
使用完测试网络后,可以使用以下命令关闭网络:
./network.sh down
该命令将停止并删除节点和链码容器,删除组织加密材料,并从Docker注册表中移除链码映像。该命令还会从以前的运行中删除通道工件和docker卷,从而在遇到任何问题时允许您再次运行。
./network.sh up