这里先不做Fabric的介绍了。我先开一贴讲讲对于Fabric开发的环境搭建。
我所使用的开发环境都是基于docker的,这样在开发过程中可以省去很多麻烦的配置工作。
我的系统配置:
话不多说,开整!
因为fabric的源码是用golang写的,所以需要安装go环境。
golang安装包下载地址:
golang官网:https://golang.org/dl/ (需要科学上网)
国内镜像:https://studygolang.com/dl
进入国内镜像网站,在下面选项中选择Linux进行下载:
还有另外一种直接在Linux终端中下载安装包的方式:
在ubuntu的终端输入:
$ wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
可以根据自己的需要修改go语言的版本
当下载完安装包后,依次在终端中输以下指令:
# 解包
$ sudo tar zxvf go1.11.linux-amd64.tar.gz -C /usr/local
# 创建Go目录
$ mkdir $HOME/go
# 配置环境变量
$ vim ~/.bashrc
# 增加.bashrc文件下面增添环境变量,保存并退出
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 使环境变量生效
$ . ~/.bashrc
# 检测go是否安装好
$ go version
关于docker的安装我在之前的一篇帖子《Michael.W谈Docker 第一期-docker的架构、安装与服务操作命令》中详细地介绍过。
可以去那篇帖子第三部分看一下:
Michael.W谈Docker 第一期-docker的架构、安装与服务操作命令
由于是基于docker的环境部署,所以docker的容器管理工具docker-compose也是必不可少的。
关于docker-compose的安装我在之前的一篇帖子《Michael.W谈Docker 第六期-docker-compose的编写》中详细地介绍过。
可以去那篇帖子第二部分看一下:
Michael.W谈Docker 第六期-docker-compose的编写
$ wget https://nodejs.org/dist/v8.11.4/node-v8.11.4-linux-x64.tar.xz
# 指定压缩包解压到/opt目录下
$ sudo tar xvf node-v8.11.4-linux-x64.tar.xz -C /opt
# 设置环境变量
$ sudo vim /etc/profile
# 在profile文件中添加如下命令,保存并推出
export NODEJS_HOME=/opt/node-v8.11.4-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
# 重使环境变量生效
$ . /etc/profile
# 测试是否安装成功
$ node -v
首先创建目录,进入其中用curl下载脚本:
$ mkdir ~/hyperledger-fabric
$ cd ~/hyperledger-fabric
如果你懂得如何科学上网:
$ curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.1 1.2.1 0.4.10
如果你还是个孩纸,不懂如何科学上网:
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.2.1 1.2.1 0.4.10
第一个1.2.1
表示Fabric版本,第二个1.2.1
表示Fabric-ca版本,第三个0.4.10
表示部署Fabric所需第三方库的版本。可以根据自己的需求修改版本号。
注意下在Fabric和Fabric-ca是个非常痛苦的过程,不但速度慢,而且下一半就会断掉。
后来我用下载工具自己手动下载这两个安装包,然后拷贝到路径:~/hyperledger-fabric/fabric-samples下。重新执行上面的指令即可以从你本地安装hyperledger-fabric-linux-amd64-1.2.1.tar.gz和hyperledger-fabric-ca-linux-amd64-1.2.1.tar.gz这两个安装包,继续安装后面的内容。
这两个包的下载地址你可以在安装时的shell打印信息看到:
停止安装,将这个下载地址直接复制到下载软件中即可。
在上面那两个包的安装完毕后,系统会自动去docker网上的仓库中拉取以下Fabric所需的镜像文件:
镜像名称 | 功能 |
---|---|
hyperledger/fabric-peer | peer模块镜像 |
hyperledger/fabric-orderer | orderer节点库镜像 |
hyperledger/fabric-ccenv | golang编写的chaincode运行环境库镜像 |
hyperledger/fabric-tools | cryptogen, configtxgen等相关工具镜像 |
hyperledger/fabric-ca | CA模块镜像 |
hyperledger/fabric-couchdb | couchdb数据库镜像 |
hyperledger/fabric-kafka | kafka库镜像 |
hyperledger/fabric-zookeeper | zookeeper库镜像 |
当出现以下画面时,表示镜像文件已经下载完毕:
文件又多又大,请保持良好的网络环境。
注意:当中间某个镜像下载不动了,一旦Ctrl+C停止并重新执行上面6.1中所给出的curl下载命令时,需要删除 ~/hyperledger-fabric路径下的所有文件,全部重新来。
因为当系统在 ~/hyperledger-fabric/fabric-samples的路径下找不到hyperledger-fabric-linux-amd64-1.2.1.tar.gz和hyperledger-fabric-ca-linux-amd64-1.2.1.tar.gz这两个压缩包,就会自动去网上下载,又要经历那个令人抓狂的漫长的过程。
$ vim ~/.bashrc
# 添加如下指令,michael.w改为你自己的用户名
export PATH=$PATH:/home/michael.w/hyperledger-fabric/fabric-samples/bin
# 使能环境变量
$ . ~/.bashrc
$ cd ~/hyperledger-fabric/fabric-samples/first-network/
$ ./byfn.sh generate
这个过程中遇到人机交互,全写yes
当出现上面画面,表示必要文件已经生成完毕。
继续在之前的进程目录下执行:
$ ./byfn.sh up
有人机交互的部分全部写yes。
当看到大写的START的时候,表示测试环境First-Network已经成功启动。陆陆续续会打印出许多信息,直到看到大写的END的时候表示测试已经结束。
通过docker命令可以查看到此时节点的启动情况:
$ docker ps
如果要停止网络,可执行:
$ ./byfn.sh down
人机交互部分写yes
下面我以我个人的经验简单说说部署环境测试的时候都发生了什么有趣的事情?如果你能听懂那是最好的,如果听不懂,后面我有时间还会发帖具体讲。
在执行./byfn.sh generate
生成了org1.example.com和org2.example.com两个组织。
脚本调用configtxgen工具生成了一个供后面生成区块链的创世块的依赖文件genesis.block:
注:Fabric的创世块与比特币的创世块不同,它里面不存数据,只存一些该链的属性信息。
生成一个channel.tx,这是一个生成通道依赖的文件。以后根据这个文件生成的通道叫做mychannel。
什么是通道?可以简单地理解为所有的节点都在这个通道里面进行交易。
Fabric是一个私有网络,其中可以有很多channel。在不同的channel里只能看到本channel中的数据。
生成了生成锚节点所依赖的两个文件:Org1MSPanchors.tx和Org2MSPanchors.tx。至于什么是锚节点,后面帖子再谈。
我们执行./byfn.sh up
启动测试网络。之后脚本创建了一个名字叫net_byfn的bridge网络,同时在里面创建了net_peer0.org2.example.com等四个节点。这四个节点分别属于前面所提到的两个组织:org1.example.com和org2.example.com。
四个peer节点创建完成后,有创建生成了一个order节点net_orderer.example.com。你暂时可以理解为这个order节点就是比特币中的矿工。
最后时分别启动上面提到的四个peer节点,一个order节点和一个客户端(cli)。
客户端的功能可以暂时理解为去连接peer节点和order节点。
至此,我们这个网络中所有的节点容器都已经创建并启动成功了。
之后脚本用我们之前创建出来的通道依赖文件创建出来了通道mychannel。
然后之前生成的四个peer节点(分属于两个组织),依次加入到通道mychannel。
然后是两个锚节点的相关操作。关于锚节点我在这里先不做介绍。
既然我们想使用区块链来记账,那么就需要账本。暂时可以理解为账本就在每个组织中的peer节点上。那么该如何记账?这就需要所谓的智能合约,也就是链码chaincode。
此时,已经给组织org1和org2中的peer节点peer0安装上了链码。
两个组织中的peer0按上链码后,开始进行初始化。简单地理解为,他们一切准备就绪,系统通过初始化为他们分配资产。
节点peer0初始化一次就可以,之后Fabric会自动将他们的资产信息同步到通道内的其他节点上。
那到底Fabric给节点初始化了多少钱呢?看上面的打印信息:
一个给了100,另一个给了200。
之后Fabric对节点peer0.org1进行了资产查询:
查询结果为peer0.org1有100元资产。
之后可以理解为执行了一段转账。链码中具体的逻辑先不谈,能看到的是a向b转了10元。
最后,Fabric又一次查询了a中的资产。
查到剩余90元(100-10)。
结果正确,测试成功!!!
手动码字很累,希望能与更多钟爱于区块链的朋友线下进行交流!
ps:
本人热爱图灵,热爱中本聪,热爱V神,热爱一切被梨花照过的姑娘。
以下是我个人的公众号,如果有技术问题可以关注我的公众号来跟我交流。
同时我也会在这个公众号上每周更新我的原创文章,喜欢的小伙伴或者老伙计可以支持一下!
如果需要转发,麻烦注明作者。十分感谢!
公众号名称:后现代泼痞浪漫主义奠基人