hyperledger/fabric-区块链快速入门
目录操作系统软件安装git 安装go安装docker安装源码获取hyperledger环境配置镜像获取入门测试fabric-samplesreleas-1.0开始测试releas-1.0master(2.2.0)智能合约fabric相关错误与解决方案fabric-samples测试出错cryptogen文件不存在解决方法:获取二进制文件查看对应版本修改版本docker image does not match the version解决方案目录
包括前期的操作系统环境、前期的软件获取、前期的项目源码获取、中期的测试、最后可能遇到的问题和解决方案。PS:本文所说的网络问题,均无任何含义,只是网络问题。
操作系统
我使用的是deepin 20Beta,它比较适合习惯用windows操作系统的用户。
包括了很多win的软件如vscode、微信和qq等,基本上和在win没太大区别;Deepin中包括了自己的u盘启动器和镜像,按照教程完全装机ok;Deepin的UI非常舒服,自带特效;Deepin和Ubuntu类似,相关操作均通用,无使用难度;Deepin开源,安全可靠;Deepin为国产,现有较好的软件生态,感觉ok;
当然其他linux均可
linux内核版本:Linux version 5.3.0-3-amd64
软件安装
作为前期的准备,我们需要安装git、go和docker三个软件。git用于获取源码,go用于编译,docker作为容器获取镜像。
git 安装
hyperledger的源码是在github上,所以需要用git进行获取,而系统默认无git,安装就完事了。注意,以下所有代码均默认已有root权限
// 安装代码如下// 获取root权限,输入root密码回车即可sudo su// deepin安装git,注意,如果是centos,用yum install +软件名apt-get install git//没报错即安装完成
go安装
hyperledger的fabric采用go语言编写,所以需要先下载go语言安装包:
由于网络问题,我们选择并点击go语言中文网获取linux的安装包,右键获取链接。
打开终端,输入以下命令获取:
// 也可以下载下来进行解压,都行//-08-07,此时链接可用wget /dl/golang/go1.14.6.linux-amd64.tar.gz//在get到go语言的安装包后解压到/usr/local/software下// 先新建/usr/local/software文件夹再解压mkdir /usr/local/softwaretar -zxvf go1.14.6.linux-amd64.tar.gz -C /usr/local/software
到此时,go已经解压完成在/usr/local/software/go文件夹中
docker安装
hyperledger使用docker打包应用为镜像进行移植,使得所有的客户端均可获取到每个版本对应的镜像。
Deepin的安装教程类似Ubuntu的安装,参考教程
// 安装代码如下// 先更新本地的软件源,使用中科大的cp /etc/apt/sources.list /etc/apt/sources.list.baksed -i 's//mirrors./g' /etc/apt/sources.listapt update// 更新完成后先安装需要的包,共5个apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common// 由于安装docker需要类似先注册一下,所以先添加 Docker 的官方 GPG 密钥:curl -fsSL /linux/ubuntu/gpg | sudo apt-key add -// 添加 Docker-ce 软件源add-apt-repository "deb [arch=amd64] https://mirrors./docker-ce/linux/ubuntu \$(lsb_release -cs) stable"// 再次更新并安装apt-get updateapt-get install docker-ce//设置开机自启动systemctl enable dockersystemctl start docker//没报错即安装完成
源码获取
hyperledger
地址:/hyperledger
我们需要获取两个子项目:fabric和fabric-samples,fabric通过编译成二进制文件,提供给其他子项目使用。
但在实际过程中我们实际上只会用到了一个子项目:fabric-samples
先通过git获取到这两个子项目的源码:
以hyperledger/fabric-samples为例:
具体的代码如下:
fabric-samples的链接:/hyperledger/fabric-samples.git
fabric的链接:/hyperledger/fabric.git
//-08-07// 注意git clone 下来的项目是在你目前所在的目录下,所以我们需要先进入对应的目录再git// 我们在根目录/下创建了个workspace,一个go用于以后的go开发路径,并继续创建作为存放git项目的文件目录mkdir /workspace \/workspace/go /workspace/go/bin \/workspace/ \/workspace//hyperledger // 进入目录/workspace//hyperledger/cd /workspace//hyperledger/// 获取源码,由于网络问题,会有点慢git clone /hyperledger/fabric.gitgit clone /hyperledger/fabric-samples.git// 注意,通过这种方式获取的是master的,也就是最新的源码// 获取完成后更改权限chmod 777 -R /workspace//hyperledger/
环境配置
当源码获取完成后,前期安装的软件需要进行环境配置
go的环境配置:
修改/etc/profile文件,将go的路径加入,代码如下
// vim进行修改/etc/profilevim /etc/profile// 按i并移动光标在最后添加如下内容:#workspaceexport WORKSPACE=/workspace#goexport GOROOT=/usr/local/software/goexport GOBIN=$GOROOT/binexport GOPATH=$WORKSPACE/go#hyperledgerexport FABRIC=$WORKSPACE//hyperledger#pathexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$FABRIC/fabric-samples/bin#END// 添加完成按esc并输入:wq进行保存// 修改生效source /etc/profile
当修改完成后,通过输入go version测试,结果如下
2. docker添加镜像加速器
由于国内网络问题,当通过docker获取镜像时,往往速度不如人意(谁试谁知道)这时候镜像加速器让你感受到网速的美妙:
以阿里云镜像加速器为例:通过搜索容器镜像服务找到最下面的镜像加速器,而右边则是你的地址。
// 具体教程可参考上图mkdir /etc/dockervim /etc/docker/daemon.json// 添加你的加速器地址{"registry-mirrors":["https://xxxx."]}// 保存并退出systemctl daemon-reloadsystemctl restart docker
完成后输入docker version测试,结果如下,说明docker正常启动
镜像获取
当添加完成加速器后,可以去/u/hyperledger/来获取hyperledger的docker镜像。
我们需要以下镜像:
以hyperledger/fabric-peer为例,/r/hyperledger/fabric-peer
点击进入即可获取fabric-peer的镜像,通过右边代码进行获取
// 输入复制代码,即可pull对应的镜像文件docker pull hyperledger/fabric-peer// 所有的镜像均可按此方式进行
注:官方给了一个脚本bootstrap.sh(具体路径如下图),可以通过执行此文件来获取所有的镜像。但是,由于网络问题,执行此文件通常会以失败告终。只能说,官方的想法是很好,但是网络问题,无解。所以还是老老实实的一个一个pull。
通过pull相关的镜像文件,最后通过docker images进行查看。如果出现的镜像和所需镜像均吻合,则镜像下载完成。
至此,基本上所有的文件都已经准备完毕。开始区块链的入门吧!
入门测试
我们之前git了两个子项目,fabric和fabric-samples,先进入fabric-samples来看看如何上手吧。
fabric-samples
fabric-samples中包括了很多,但是作为入门我也不清楚,先进入test-network来开始入门的测试
注意,我们的是最新的版本,而网上的教程大多是V1.0时候的fabric-samples,所以会出现比如测试路径名称不同:
比如当你选择fabric-samples版本为1.0时,显示的可执行文件为byfn.sh,如下图所示
而如果是master(-08-07)时
进入后可以看到一个可执行文件network.sh
releas-1.0
具体的获取方法如上,只是注意需要修改镜像对应的版本,即pull时添加上对应的tag即可
开始测试
命令行进入此路径执行此文件
// 防止万一,直接绝对路径执行./$FABRIC/fabric-samples/test-network/xxx.sh
releas-1.0
如果是releas-1.0版本,即网上常见的版本时,通过./byfn.sh执行时,显示常用的3个命令-up、-down、-generate
通过./byfn.sh generate执行区块链网络创建
而在创建完成后即可通过./byfn.sh up开始区块链的网络。这里报错,说明没有安装docker-compse安装即可
重新通过./byfn.sh up开始区块链的网络,一切正常显示:START
区块链网络搭建完成,添加了一个名为mychannel的通道,并添加了两个用户a和b,完成了交易,最后查询querya的账户,由原来的100变为现在的90.
此时docker images查看docker 镜像,可以看到多出3个测试镜像。
master(2.2.0)
查看执行结果,红色部分为翻译
./network.sh包括以下几个执行命令
通过./network.sh up createChannel -c testchannel来新建并加入一个名为testchannel的通道
最后结果:
智能合约
这里通过peer相关的命令行来手动完成交易:
先新建一名为channel1的通道,其中包含a用户和b用户,其初始余额为100和200;通过query查询a此时的余额,返回结果100,说明初始化成功;通过invoke来新建一场交易记录,调用智能合约example02,完成a向b转10的操作;再次query查询a此时余额,返回结果90,说明交易完成。
具体细节如下图:
fabric
fabric的结构包括:网络、通道、orderer、peer和链码chaincode。
各个部分间的关系如下图所示。在一个大的区块链网络中,存在多个peer 节点,不同节点间通过channel进行交易,并通过链码(智能合约)对自身账本进行读写等操作,并将修改后的交易信息交给orderer节点进行排序,orderer节点确定交易是否可行,并将最终的正确交易数据排好序,发送至各个peer节点,完成所有节点账本的同步。
相关错误与解决方案
fabric-samples测试出错
cryptogen文件不存在
当我们执行例子中的可执行文件时,显示没有二进制文件:
Starting nodes with CLI timeout of '5' tries and CLI delay of '3' seconds and using database 'leveldb' with crypto from 'cryptogen'ERROR! Peer binary and configuration files not found..
解决方法:获取二进制文件
make release这里是说明fabric的作用,进入fabric文件,看到有个Makefile文件,通过make release可以编译出二进制文件,输出到$GOPATH下的bin/目录中,但是,由于网络问题,可能无法编译成功
./bootstrap.sh
官方在fabric/scripts/中设置了脚本文件:bootstrap.sh,可以获取镜像、二进制文件和范例,但是由于网络问题,会出现无法下载的情况。自行下载(推荐)
打开bootstrap.sh文件,我们可以看到里面有二进制对应的url:
获取对应的地址:/hyperledger/fabric/releases和/hyperledger/fabric-ca/releases/,通过这便可获取对应版本的二进制文件。
当然这里网络仍然存在问题,我将各个版本的二进制文件均下载上传至蓝奏云,有需要可自取:密码:fabric
fabric/ca1.5以上版本:/b01hlg8gf
fabric/ca1.1-1.5版本:/b01hlg8ti
fabric/ca1.1以下版本:/b01hlg90f
查看对应版本
通过fabric/scripts/bootstrap.sh进行查看
如果是git master的版本时,打开进入master对应的bootstrap.sh,可以看到fabric的版本为:VERSION=2.2.0,fabric-ca的版本为:CA_VERSION=1.4.8
于是通过进入fabric/ca1.5以上版本:/b01hlg8gf和fabric/ca1.1-1.5版本:/b01hlg8ti下载fabric和fabric-ca的对应版本二进制文件并解压到本地的fabric-samples即可
修改版本
进入本地目录修改版本
cd /workspace//hyperledger/fabric// 查看目前的git对应版本git branch -a// 当显示已有的版本后,可以修改对应的版本// git checkout +xxx// 如修改为release-2.0版本git checkout release-2.0
docker image does not match the version
错误代码:
ERROR! Fabric Docker image version of x.x.x does not match the versions supported by the test network.
报错显示:
解决方案
这里就先查看docker的镜像文件,看看是不是没有对应的版本镜像就行。
docker images// 发现的确没有2.2.0版本的镜像// 那就很简单// pull + 路径 + tag,看哪些不是2.2的,pull就是了pull hyperledger/fabric-tools:2.2// 如果镜像里出现其他的,可以通过// docker rmi + 镜像ID // 进行删除
注意,这种情况下可能会出现:同名同id不同tag的镜像需要删除:
参考教程:/qq_37674858/article/details/80282068?utm_medium=distribute.pc_relevant.none-task-blog-baidulandingword-1&spm=1001.2101.3001.4242
通过docker rmi 镜像名称:镜像tag
// 例子:删除2.2版本,留下2.2.0版本docker rmi hyperledger/fabric-ccenv:2.2
具体如图所示:
或者一个比较直接的方法:修改network.sh内容,将其中对image的tag进行直接指定:修改此处:#default image tag