当前位置:   article > 正文

hyperledger/fabric-区块链快速入门教程+错误解决——良好用户体验_fabric区块链开发教程

fabric区块链开发教程

目录

包括前期的操作系统环境、前期的软件获取、前期的项目源码获取、中期的测试、最后可能遇到的问题和解决方案。PS:本文所说的网络问题,均无任何含义,只是网络问题。

操作系统

我使用的是deepin 20Beta,它比较适合习惯用windows操作系统的用户。

  1. 包括了很多win的软件如vscode、微信和qq等 ,基本上和在win没太大区别;
  2. Deepin中包括了自己的u盘启动器和镜像,按照教程完全 装机ok
  3. Deepin的UI非常舒服,自带特效;
  4. Deepin和Ubuntu类似,相关操作均通用,无使用难度;
  5. Deepin开源,安全可靠;
  6. Deepin为国产,现有较好的软件生态,感觉ok;
    当然其他linux均可
    在deepin操作系统20Beta

linux内核版本:Linux version 5.3.0-3-amd64

软件安装

作为前期的准备,我们需要安装gitgodocker三个软件。git用于获取源码,go用于编译,docker作为容器获取镜像。

git 安装

hyperledger的源码是在github上,所以需要用git进行获取,而系统默认无git,安装就完事了。注意,以下所有代码均默认已有root权限

// 安装代码如下
// 获取root权限,输入root密码回车即可
sudo su
// deepin安装git,注意,如果是centos,用yum install +软件名
apt-get install git
//没报错即安装完成
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

go安装

hyperledger的fabric采用go语言编写,所以需要先下载go语言安装包:
由于网络问题,我们选择并点击go语言中文网获取linux的安装包,右键获取链接
打开终端,输入以下命令获取:

// 也可以下载下来进行解压,都行
//2020-08-07,此时链接可用
wget https://studygolang.com/dl/golang/go1.14.6.linux-amd64.tar.gz
//在get到go语言的安装包后解压到/usr/local/software下
// 先新建/usr/local/software文件夹再解压
mkdir /usr/local/software
tar -zxvf go1.14.6.linux-amd64.tar.gz -C /usr/local/software
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

到此时,go已经解压完成在/usr/local/software/go文件夹中

docker安装

hyperledger使用docker打包应用为镜像进行移植,使得所有的客户端均可获取到每个版本对应的镜像。
Deepin的安装教程类似Ubuntu的安装,参考教程

// 安装代码如下
// 先更新本地的软件源,使用中科大的
cp /etc/apt/sources.list /etc/apt/sources.list.bak
sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
apt update
// 更新完成后先安装需要的包,共5个
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
// 由于安装docker需要类似先注册一下,所以先添加 Docker 的官方 GPG 密钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
// 添加 Docker-ce 软件源
add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
// 再次更新并安装
apt-get update
apt-get install docker-ce
//设置开机自启动
systemctl enable docker
systemctl start docker
//没报错即安装完成
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

源码获取

hyperledger

地址:https://github.com/hyperledger
我们需要获取两个子项目:fabricfabric-samples,fabric通过编译成二进制文件,提供给其他子项目使用。
但在实际过程中我们实际上只会用到了一个子项目:fabric-samples
fabric-samples
先通过git获取到这两个子项目的源码:
hyperledger/fabric-samples为例:
项目链接
具体的代码如下:
fabric-samples的链接:https://github.com/hyperledger/fabric-samples.git
fabric的链接:https://github.com/hyperledger/fabric.git

//2020-08-07
// 注意git clone 下来的项目是在你目前所在的目录下,所以我们需要先进入对应的目录再git
// 我们在根目录/下创建了个workspace,一个go用于以后的go开发路径,并继续创建github.com作为存放git项目的文件目录
mkdir /workspace \
/workspace/go /workspace/go/bin \
/workspace/github.com \
/workspace/github.com/hyperledger 
// 进入目录/workspace/github.com/hyperledger/
cd /workspace/github.com/hyperledger/
// 获取源码,由于网络问题,会有点慢
git clone https://github.com/hyperledger/fabric.git
git clone https://github.com/hyperledger/fabric-samples.git
// 注意,通过这种方式获取的是master的,也就是最新的源码
// 获取完成后更改权限
chmod 777 -R /workspace/github.com/hyperledger/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

环境配置

当源码获取完成后,前期安装的软件需要进行环境配置

  1. go的环境配置:
    修改/etc/profile文件,将go的路径加入,代码如下
// vim进行修改/etc/profile
vim /etc/profile
// 按i并移动光标在最后添加如下内容:
#workspace
export WORKSPACE=/workspace
#go
export GOROOT=/usr/local/software/go
export GOBIN=$GOROOT/bin
export GOPATH=$WORKSPACE/go
#hyperledger
export FABRIC=$WORKSPACE/github.com/hyperledger
#path
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$FABRIC/fabric-samples/bin
#END
// 添加完成按esc并输入:wq进行保存
// 修改生效
source /etc/profile
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

当修改完成后,通过输入 go version测试,结果如下
go version
2. docker添加镜像加速器
由于国内网络问题,当通过docker获取镜像时,往往速度不如人意(谁试谁知道)这时候镜像加速器让你感受到网速的美妙:
以阿里云镜像加速器为例:通过搜索容器镜像服务找到最下面的镜像加速器,而右边则是你的地址。
阿里云镜像加速器

// 具体教程可参考上图
mkdir /etc/docker
vim /etc/docker/daemon.json
// 添加你的加速器地址
{"registry-mirrors":["https://xxxx.mirror.aliyuncs.com"]}
// 保存并退出
systemctl daemon-reload
systemctl restart docker
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

完成后输入 docker version测试,结果如下,说明docker正常启动
客户端
服务端

镜像获取

当添加完成加速器后,可以去https://hub.docker.com/u/hyperledger/来获取hyperledger的docker镜像。
我们需要以下镜像:
所需镜像
hyperledger/fabric-peer为例,https://hub.docker.com/r/hyperledger/fabric-peer
hyperledger/fabric-peer
点击进入即可获取fabric-peer的镜像,通过右边代码进行获取
获取方式

// 输入复制代码,即可pull对应的镜像文件
docker pull hyperledger/fabric-peer
// 所有的镜像均可按此方式进行
  • 1
  • 2
  • 3

注:官方给了一个脚本bootstrap.sh(具体路径如下图),可以通过执行此文件来获取所有的镜像。但是,由于网络问题,执行此文件通常会以失败告终。只能说,官方的想法是很好,但是网络问题,无解。所以还是老老实实的一个一个pull。
bootstrap.sh
通过pull相关的镜像文件,最后通过docker images进行查看。如果出现的镜像和所需镜像均吻合,则镜像下载完成。
至此,基本上所有的文件都已经准备完毕。开始区块链的入门吧!

入门测试

我们之前git了两个子项目,fabricfabric-samples,先进入fabric-samples来看看如何上手吧。

fabric-samples

fabric-samples中包括了很多,但是作为入门我也不清楚,先进入test-network来开始入门的测试
注意,我们的是最新的版本,而网上的教程大多是V1.0时候的fabric-samples,所以会出现比如测试路径名称不同:
比如当你选择fabric-samples版本为1.0时,显示的可执行文件为byfn.sh,如下图所示
release-1.0
而如果是master(2020-08-07)时
test-network
进入后可以看到一个可执行文件network.sh
test-network

releas-1.0

具体的获取方法如上,只是注意需要修改镜像对应的版本,即pull时添加上对应的tag即可
加上tag

开始测试

命令行进入此路径执行此文件

// 防止万一,直接绝对路径执行
./$FABRIC/fabric-samples/test-network/xxx.sh
  • 1
  • 2
releas-1.0

如果是releas-1.0版本,即网上常见的版本时,通过./byfn.sh执行时,显示常用的3个命令-up-down-generate
./byfn.sh
通过./byfn.sh generate执行区块链网络创建
常用命令
而在创建完成后即可通过./byfn.sh up开始区块链的网络。这里报错,说明没有安装docker-compse安装即可
出现错误
重新通过./byfn.sh up开始区块链的网络,一切正常显示:START
重新开始
区块链网络搭建完成,添加了一个名为mychannel的通道,并添加了两个用户a和b,完成了交易,最后查询query a的账户,由原来的100变为现在的90.
最终结束
此时docker images查看docker 镜像,可以看到多出3个测试镜像。
docker镜像

master(2.2.0)

查看执行结果,红色部分为翻译
./network.sh 包括以下几个执行命令
network.sh说明通过 ./network.sh up createChannel -c testchannel 来新建并加入一个名为testchannel的通道
新建通道最后结果:
完成新建

智能合约

这里通过peer相关的命令行来手动完成交易:

  1. 先新建一名为channel1的通道,其中包含a用户和b用户,其初始余额为100和200;
  2. 通过query查询a此时的余额,返回结果100,说明初始化成功;
  3. 通过invoke来新建一场交易记录,调用智能合约example02,完成a向b转10的操作;
  4. 再次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..
  • 1
  • 2
  • 3

具体出错

解决方法:获取二进制文件
  1. make release
    这里是说明fabric的作用,进入fabric文件,看到有个Makefile文件,通过make release可以编译出二进制文件,输出到$GOPATH下的bin/目录中,但是,由于网络问题,可能无法编译成功
    fabric
  2. ./bootstrap.sh
    官方在fabric/scripts/中设置了脚本文件:bootstrap.sh,可以获取镜像、二进制文件和范例,但是由于网络问题,会出现无法下载的情况。
  3. 自行下载(推荐)
    打开bootstrap.sh文件,我们可以看到里面有二进制对应的url:
    bootstrap.sh
    获取对应的地址:https://github.com/hyperledger/fabric/releaseshttps://github.com/hyperledger/fabric-ca/releases/,通过这便可获取对应版本的二进制文件。
    当然这里网络仍然存在问题,我将各个版本的二进制文件均下载上传至蓝奏云,有需要可自取:密码:fabric
    fabric/ca1.5以上版本:https://hyperledger.lanzous.com/b01hlg8gf
    fabric/ca1.1-1.5版本:https://hyperledger.lanzous.com/b01hlg8ti
    fabric/ca1.1以下版本:https://hyperledger.lanzous.com/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以上版本:https://hyperledger.lanzous.com/b01hlg8gf和fabric/ca1.1-1.5版本:https://hyperledger.lanzous.com/b01hlg8ti下载fabric和fabric-ca的对应版本二进制文件并解压到本地的fabric-samples即可
fabric对应版本二进制文件下载
fabric-ca的对应版本二进制文件

修改版本

进入本地目录修改版本

cd /workspace/github.com/hyperledger/fabric
// 查看目前的git对应版本
git branch -a
// 当显示已有的版本后,可以修改对应的版本
// git checkout +xxx
// 如修改为release-2.0版本
git checkout release-2.0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

git显示并修改版本

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.
  • 1

报错显示:
docker版本不一致

解决方案

这里就先查看docker的镜像文件,看看是不是没有对应的版本镜像就行。

docker images
// 发现的确没有2.2.0版本的镜像
// 那就很简单
// pull + 路径 + tag,看哪些不是2.2的,pull就是了
pull hyperledger/fabric-tools:2.2
// 如果镜像里出现其他的,可以通过
// docker rmi + 镜像ID 
// 进行删除
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注意,这种情况下可能会出现:同名同id不同tag的镜像需要删除:
参考教程:https://blog.csdn.net/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
  • 1
  • 2

具体如图所示:
docker镜像
或者一个比较直接的方法:修改network.sh内容,将其中对image的tag进行直接指定:修改此处:#default image tag
修改默认tag

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/831915
推荐阅读
  

闽ICP备14008679号