这周查阅了大量文档资料,终于在今天把整个网络全部走通,包括通过源代码部署和通过shell脚本一键部署,趟了大量的坑,依然不敢说是全部了解。但也有很多值得注意和以后需要求证的地方,这里写下来备忘。
本文所述的内容是在2019年1月8号开始的,于2019年1月10号结束。在Win10家庭版上装的Ubantu 18.04版本的虚拟机,文档主要参考的是Fabric Release-1.4版本。另外,我喜欢Go,所以接下来关于链码的演示,没有nodejs、python和java什么事,想看这些,可以移步未来我写的文章。Orz...
准备工作(Prerequisites)
在开始之前,检查一下你的准备开发或者测试Fabric的平台是否有安装如下软件。哦,对了,由于我极度不喜欢使用安装包,因为下载的安装包总是会随着时间的流逝而过时,所以我喜欢直接用命令来安装,想下载安装包的,可以去各自的官网上找找。
cURL
下载代码以及docker镜像用的。如果你还没装这个,或者在本文中使用curl命令出现了错误,可以考虑下载最新的版本。
$ # 检查你的curl版本 - Check your curl version
$ curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.0g zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3
Release-Date: 2018-01-24
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy PSL
$ # 如果没有就执行下载 - Download if it doesn't exist
$ sudo apt-get update
$ sudo apt install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
curl is already the newest version (7.58.0-2ubuntu3.5).
0 upgraded, 0 newly installed, 0 to remove and 26 not upgraded.
Docker and Docker Compose
orderer/peer节点启动,链码安装/实例化/执行/升级等用的。
$ # 检查你的docker版本 - Check your docker version
$ docker --version
Docker version 18.09.0, build 4d60db4
$ docker-compose --version
docker-compose version 1.17.1, build unknown
$ # 如果没有就执行下载 - Download if it doesn't exist
$ sudo apt-get update
$ sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce
$ # 国内用户因为网络、未翻墙或者其他灵异事件可能hello-world执行不了会失败. 不过这不重要。 - It will be failed in China because the God is watching you. But it doesn't matter. :)
$ sudo docker container run hello-world
$ sudo apt install docker-compose
Go
主要是来写链码(chaincode)的。1.4版本的fabric要求go版本在1.11.x以上。
$ # 检查你的go版本 - Check your go version
$ go version
go version go1.11.4 linux/amd64
$ # 如果没有就执行下载 - Download if it doesn't exist
$ sudo add-apt-repository ppa:longsleep/golang-backports
$ sudo apt-get update
$ sudo apt-get install golang-go
$ # 配置环境变量,这个很重要,目前来讲,GOPATH是fabric必须有的。
$ vim ~/.bashrc
$ # 如果没有装vim可能会报错,直接按提示安装就好了 sudo apt install vim
$ # 打开文件后,按 i 进入编辑模式,在文件末尾粘贴(Shift+Insert)上如下内容:
export PATH=$PATH:$(go env GOPATH)/bin
export GOPATH=$(go env GOPATH)
export GOROOT=$(go env GOROOT)
export GOARCH=amd64
export GOOS=linux
$ # 粘贴完后,按Esc推出编辑模式,输入命令:wq! 保存退出后执行source命令让其立即生效
$ source ~/.bashrc
$ 测试是否设置成功 - Check if it is successful
$ echo $GOPATH
/home/wff/go
构建你的第一个网络(Building Your First Network)
构建你的第一个网络(byfn)方案提供了一个Hyperledger Fabric示例网络,该网络由两个组织组成,每个组织维护两个peer节点,以及一个基于“solo”模式的orderer节点。
安装镜像
鉴于在国内可能不想翻墙甚至不会翻墙的同志大有人在,我也就直接上不用翻墙的命令了。
$ cd ~
$ mkdir hyperledger-fabric
$ cd hyperledger-fabric
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.4.0 1.4.0 0.4.14
$ # 这一步耐心很重要,最好是在晚上睡觉的时候,等第二天醒来就下载好了,这就美滋滋,否则,等几个小时还算你网速是好的吧。
$ # 查看是否下载成功
$ configtxlator version
configtxlator:
Version: 1.4.0
Commit SHA: development build
Go version: go1.11.4
OS/Arch: linux/amd64
$ # 如果报错找不到这个命令 - configtxlator: command not found,那么可能你需要手动设置全局命令
$ cd ~/hyperledger-fabric/fabric-samples/bin
$ sudo cp * /usr/local/bin
生成网络构件
生成构件的过程中,会生成包括orderer节点组织和peer节点组织的证书,以及创始块,配置交易块等信息,同时检查docker镜像版本。
$ cd ~/hyperledger-fabric/fabric-samples/first-network/
$ ./byfn.sh generate
$ # 如果打印出来的日志包含如下内容,则说明工具版本和docker镜像版本不匹配,需要重新下载镜像
=================== WARNING ===================
Local fabric binaries and docker images are
out of sync. This may cause problems.
===============================================
$ # 工具版本
$ configtxlator version | sed -ne 's/ Version: //p'
1.4.0
$ # docker镜像版本
$ docker run --rm hyperledger/fabric-tools:latest peer version | sed -ne 's/ Version: //p' | head -1
1.4.0
$ # 如果不匹配,则删除错误版本的镜像,重新设置版本安装镜像
$ # 删除全部镜像
$ docker images|awk '{printf "%s:%s\n",$1,$2}'|xargs docker rmi
$ # 重新设置版本,比如1.3.0
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.3.0 1.3.0 0.4.14
构建网络
如果上一步的generate没有出现任何问题,那么接下来就可以开始构建简易的fabric网络了。
$ # 这里的命令不加-l参数,所以默认是go语言
$ ./byfn.sh up
$ # 如果看到如下内容,说明网络已经构建成功并开始启动了。接下来它会完成一个e2e测试告诉你大致的流程
Starting with channel 'mychannel' and CLI timeout of '10'
Continue? [Y/n]
proceeding ...
Creating network "net_byfn" with the default driver
Creating peer0.org1.example.com
Creating peer1.org1.example.com
Creating peer0.org2.example.com
Creating orderer.example.com
Creating peer1.org2.example.com
Creating cli
____ _____ _ ____ _____
/ ___| |_ _| / \ | _ \ |_ _|
\___ \ | | / _ \ | |_) | | |
___) | | | / ___ \ | _ < | |
|____/ |_| /_/ \_\ |_| \_\ |_|
Channel name : mychannel
Creating channel...
$ # 成功执行后,会出现如下内容:
Query Result: 90
2017-05-16 17:08:15.158 UTC [main] main -> INFO 008 Exiting.....
===================== Query successful on peer1.org2 on channel 'mychannel' =====================
===================== All GOOD, BYFN execution completed =====================
_____ _ _ ____
| ____| | \ | | | _ \
| _| | \| | | | | |
| |___ | |\ | | |_| |
|_____| |_| \_| |____/
你可以滚动这些日志查看交易的流程,如果你并没有得到上面的结果,可以看看官网的错误说明找找原因。
关闭网络
这个会关闭并删除掉所有docker中与之相关的容器,没啥好说的。
$ ./byfn.sh down
另外,还有个重启命令,可以试试。
$ ./byfn.sh restart
错误记录
这里会放一些我在启动过程中遇到的,或者别人遇到的错误问题,和一些解决方案,不过目前我有点忘了,下次遇见的时候再记录下来。一般来讲,按照教程走,基本没多大问题。
后记
这篇教程对于fabric建立一个简单认知是没有问题的,但如果想深入研究,你会发现你几无所得。所以,接下来,我会深入写一篇关于手动构建fabric网络,包括自己生成组织,证书,启动排序、对等节点,以及手撸链码的日志。等有空再说吧,现在正在给fabric加密类型增加国密算法,可能懒得写了就。
网友评论