Hyperledger Fabric环境搭建

最近在准备开始学习区块链的超级帐本编程,可是在搭建Hyperledger Fabric的时候就出现了不少问题,查阅网上的其余人写的博客,可是不多可以完整或者正确的将完整的安装过程表达清楚,所以将本身的环境搭建过程以及出现的问题写下来,但愿能对其余人起到一些帮助。
其中在搭建过程参考了其余人的部分东西:
javascript

感谢博客:https://blog.csdn.net/qq_43681877/article/details/107399250
官方文档参考
https://hyperledger-fabric.readthedocs.io/en/latest/test_network.html

html

首先说明一下本身的系统环境吧:
采用虚拟机作的操做系统。
内存分配了3g
硬盘分配了30g
Ubuntu16.04.6



java

如何经过虚拟机安装ubuntu操做系统就不说了,请自行查找资料。
接下来就是正式开始搭建环境了。我这里安装的是2.2.0版本。
一、按照Hyperledger Fabric官方提供的文档来讲,首先在你的系统中应该安装着最新版本的git。对于ubuntu来讲,能够按照如下方式来安装:

linux

apt-get install git
对于Ubuntu,此PPA提供最新的稳定上游Git版本
add-apt-repository ppa:git-core/ppa 
apt update; 
apt install git

这个就不具体进行截图了,也忘记截图了。
在安装完毕以后,输入来查看安装的git版本。
git

git version

若是出现如下结果,则证实安装成功。
git安装成功截图
二、在完成git的安装后,应该继续安装最新版本的cURL,直接在控制台输入命令便可。命令以下:

github

sudo apt-get update
sudo apt install curl

安装成功的截图也忘记保存了,若是没有安装成功,具体见百度吧。这块也不是啥重点的地方。
三、接下来就是比较重要的了,安装 docker和docker-compose。若是打算在Hperledger Fabric 2.x上作开发或者相关的操做,这里须要安装的docker版本应该是docker 17.06.2-ce或者更高的版本。我这里安装的是docker 19.03.12-ce版本。
首先,若是安装过docker,应该先卸载旧的版本,具体命令以下:

docker

sudo apt-get remove docker docker-engine docker.io containerd runc

若是以前没有安装过docker的能够跳过这一步。接下来就是安装docker
运行安装的命令包,
shell

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版每个月一次)json

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安装成功
因为docker命令每次须要使用sudo权限来运行,每次都输入sudo很不方便。为了方便将当前用户加入docker用户组,之后就不用这么麻烦了。

sudo usermod -aG docker ${USER}

从新登陆便可。
docker安装成功
在每次使用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环境搭建已经算是完成了三分之一。
在这里插入图片描述
四、因为Hyperledger Fabric须要Go环境,接下来还有搭建Go语言环境。
你们能够安装本身的虚拟机的版本去GoLang官网上下载相应的版本。我这是提早在windows下载好保存在虚拟机和windows10的共享文件夹中的。只需将下载的GoLang文件拷贝到虚拟机中,进行安装便可。具体的安装步骤以及配置环境变量的方法你们就自行百度吧,基本个人方法和网上的也是大同小异。主要是忘记保存相关的截图了。不过必定得注意GOPATH和GOROOT的配置,若是配置很差,可能在接下来会出现问题。


敲黑板,重点来了。
五、肯定您机器上要放置fabric-samples 存储库的位置,而后在终端窗口中输入该目录(通常把存储库放在刚刚配置的Go工做空间下的src文件夹下)。后面的命令将执行如下步骤:

  1. 若是须要,克隆hyperledger / fabric-samples存储库

  2. 签出适当的版本标签

  3. 将Hyperledger Fabric平台特定的二进制文件和配置文件安装为指定到Fabric-samples的/ bin和/ config目录中的版本

  4. 下载指定版本的Hyperledger Fabric docker映像

  5. 准备就绪后,在要安装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:

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/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进行操做:

Environment variables for 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
相关文章
相关标签/搜索