学习区块链技术有段时间了,刚好晚上有空把超级账本子项目fabric v1.0部署运行及开发环境的搭建过程整理下,编写的内容主要参照官方文档。由于fabric项目目前还处于孵化阶段,正式版本预计5月份才会到来。近期官方示例和文档也频繁更新中,本文内容主要基于源码中 “examples” 和 “devenv” 来完成fabric入门示例的快速部署运行和统一开发环境的搭建。
一、 入门示例部署
流程:WIN主机 -> VBox -> Ubuntu -> Docker -> Fabric Example
准备:VirtualBox 5.1.8、Ubuntu 16.04 LTS、Git 2.12.2、Go1.8、Docker CE17、Pip2
步骤:
1、 安装 VirtualBox
官方下载安装包“VirtualBox-5.1.18-114002-Win.exe”,双击运行按默认方式安装即可,由于新建虚拟机占用空间较大,调整默认存储位置,如下设置:Vbox>管理>全局设定
2、 安装 Ubuntu
官方下载Ubuntu桌面版IOS镜像“ubuntu-16.04.2-desktop-amd64.iso”,进入VBox点击新建按钮,弹出窗口名称输入“hyperledger”,类型选择“Linux”版本选择“Ubuntu (64-bit);继续下一步,内存大小输入4096MB,默认方式点击下一步,创建,下一步,下一步,虚拟硬盘输入30GB然后点击创建,虚拟机配置基本设置好了。接下来设置光盘启动安装系统,回到Vbox主界面选中刚新建的“hyperledger”项目后点击设置,界面如下:
选择磁盘弹出窗口选择刚下载好的ISO镜像,点击OK回到主界面点击启动,接下来就是Ubuntu系统安装过程了,安装过程按提示安装即可。最后进入Ubuntu系统安装增强工具(分辨率自动适应窗口大小),如下:
Vbox增强工具安装好重启系统,接下来工作主要在是Terminal下操作,建议启用root用户来安装后续工具软件。(sudo passwd更改root密码,后续直接su 就可切换至root用户了)
3、 安装Git
$ apt-get update
$ apt-get install git
4、 安装Go
$ wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz
$ tar -C /usr/local -xzf go1.8.linux-amd64.tar.gz
$ vi /etc/profile
追加内容
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
$ source /etc/profile
5、 安装Pip
$ apt-get install python-pip
6、 安装Dockker及Docker Compose
1) 安装Docker
$ 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 -
$ add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
$ apt-get update
$ apt-get install docker-ce
// 测试,正确结果将返回“Hello from Docker!”等信息
$ docker run hello-world
2) 安装Docker-compose
$ pip install docker-compose>=1.8.0
7、 部署示例hackfest
1) 创建工作目录
$ mkdir -p /opt/workspace/hackfest
$ cd /opt/workspace/hackfest
2) 下载示例代码
$ curl -L https://raw.githubusercontent.com/hyperledger/fabric/master/examples/sfhackfest/sfhackfest.tar.gz -o sfhackfest.tar.gz 2> /dev/null; tar -xvf sfhackfest.tar.gz
解压后文件目录如下:
├── ccenv
│ └── Dockerfile
├── channel_test.sh
├── docker-compose-gettingstarted.yml
├── sfhackfest.tar.gz
├── src
│ └── github.com
└── tmp
├── ca
├── orderer
├── peer0
├── peer1
├── peer2
└── peer3
3) 使用Docker构建应用网络
// 构建示例的Docker镜像,此镜像将从Docker Hub镜像库下载:
$ docker-compose -f docker-compose-gettingstarted.yml build
// 通过Docker-compose构建应用网络
$ docker-compose -f docker-compose-gettingstarted.yml up –d
执行后会产生6个Docker容器,3个peer、一个order、一个cli、一个ca。可能通过以下命令查看:
$ docker ps
// 进入客户端,确保channel已创建并且已加入peers
$ docker exec -it cli bash
$ more results.txt
看到以上结果,说明示例已部署成功,接下来通过CLI端进行资产转移测试。
8、 CLI测试
1) 进入cli容器
$ docker exec -it cli bash
2) 创建新的channel(myc2)
$ CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050
$ peer channel create -c myc2
执行后将产生一个创始块myc2.block
3)将channel分别加入到3个peer
$ CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer0:7051 peer channel join -b myc2.block
$ CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer1:7051 peer channel join -b myc2.block
$ CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 CORE_PEER_ADDRESS=peer2:7051 peer channel join -b myc2.block
4)部署chaincode,初始化资产a,b的值分别为100,200
$ CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode deploy -C myc2 -n mycc -p github.com/hyperledger/fabric/examples -c '{"Args":["init","a","100","b","200"]}'
5) 调用invoke命令,资产a向b转移10单位数据
$ CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode invoke -C myc2 -n mycc -c '{"function":"invoke","Args":["move","a","b","10"]}'
6)查询a和b当前的值
$ CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode query -C myc2 -n mycc -c '{"function":"invoke","Args":["query","a"]}'
$ CORE_PEER_ADDRESS=peer0:7051 CORE_PEER_COMMITTER_LEDGER_ORDERER=orderer:7050 peer chaincode query -C myc2 -n mycc -c '{"function":"invoke","Args":["query","b"]}'
从查询结果看出a,b之间资产已成功转移
7)清理并关闭容器
$ docker-compose -f docker-compose-gettingstarted.yml down
至处已完成hackfest示例部署运行,Fabric项目的examples目录下还有其它演示案例,运行原理基本相似,如“e2e_cli”。Hyperledger官方已将编译好的镜像上传到Docker Hub仓库中,示例都是基于仓库的镜像通过docker-compse进行容器编排运行的。
二、 开发环境搭建
Fabric项目开发环境使用Vagrant运行Ubuntu镜像,从而启动Docker容器部署运行应用。这样使得不同平台(如MacOSX,Windows,Linux)开发人员拥有了一致的开发体验。
流程:WIN|MAC主机 -> Vagrant -> VBox -> Ubuntu -> Docker
准备:VirtualBox 5.1.8、Vagrant1.9.3、Git 2.12.2、Go1.8
步骤:
1、 安装 VirtualBox
官方下载安装包“VirtualBox-5.1.18-114002-Win.exe”,双击运行按默认方式安装即可,由于新建虚拟机占用空间较大,可整默认存储位置,如下设置:Vbox>管理>全局设定
2、 安装Vagrant
官方下载安装包“vagrant_1.9.3.msi”,双击按默认方式安装即可。注意安装之前确保Vbox已安装好。
3、 安装Git
官方下载安装包“Git-2.12.2-64-bit.exe”,双击按默认方式安装即可。
4、 安装Go
官方下载安装包“go1.8.windows-amd64.msi”,双击按默认方式安装即可。安装完后需要在系统变量PATH中追加 “;c:\Go\bin”。
5、 下载源码
1) 创建项目目录
E:/ GoProjects/src/github.com/hyperledger
2) 下载github源码
git clone https://github.com/hyperledger/fabric.git
git clone https://github.com/hyperledger/fabric-ca.git
CMD目录结构如下:
6、 启动Vagrant
cd E:\GoProjects\src\github.com\hyperledger\fabric\devenv
vagrant up
Vagrant将根据devenv目录下的配置文件Vagrantfile,自动完成很多任务:
1) 从Vagrant官方下载基础镜像“hyperledger/fabric-baseimage”,此镜像已安装好了fabric项目运行环境相关软件;
2) 将当前工作目录自动挂载到Ubuntu镜像下的gopath目录,这样主机维护的代码自动同步到虚拟机运行环境中。而不同平台开发人员可以根据自己的喜好使用任意IDE维护工作目录的代码。
3) 执行shell定义的各种批量任务,包括Vbox管理、Ubuntu运行都在命令行中进行控制。
Vagrant启动完后,fabric的基础开发运行环境已配置好,接下来获取ssh配置信息:
7、 SSH远程登录
由于vagrant在windows环境下vagrant ssh不能直接进去,可以根据上面的ssh配置信息通过Xshell等软件远程登录:
点击导入按钮选择之前生成的ssh密钥:
E:/GoProjects/src/github.com/hyperledger/fabric/devenv/.vagrant/machines/default/virtualbox/private_key
成功安装登录后的界面如下:
8、 编译源码
进入fabric工程目录,执行make命令:make dist-clean all
由于编译过程需要下载很多相关软件及Docker镜像,第一次编译过程特别耗时,中间还可能存在网络被墙问题,需要针对性去解决,成功编译后将产生如下镜像文件:
同时在build目录下产生如下可执行程序:
源码编译完成,开发运行环境基本就搭建好了,接下来可以在宿主机器上工作目录(WINDOWS/MAC/LINUX)使用自己喜爱的IDE开发智能合约chaincode业务逻辑,ca成员认证管理,web控制台等,部署到VM中Docker中运行,通过端口映射在宿主机直接使用等。
三、 疑问?
1、 下载外网的软件很慢,经常出现timeout或无法访问问题?
很多原因是网络服务在国内被封了,Google生态相关的服务尤其明显,建议使用VPN或翻墙软件, 如Shadowsocks。
2、 Docker镜像下载特别慢,经常中断?
建议使用国内免费Docker镜像加速服务,国内的网易、DaoCloud和阿里云等提供的下载速度可以达1M/S以上,阿里云镜像加速可访问:https://dev.aliyun.com
3、 Go语言开发工具选择?
目前可选的工具有liteIDE(国产)、Visual Studio Code、GoSubmlime、Goclipse等,从体验来看个人更倾向Gogland的IDE,它是Jetbrains公司近期推出的EAP版,使用过IDEA、WebStorm都知道该公司的出来的IDE都是精品。
4、 启动Docker-compose部署fbric服务时出现grpc连接超时问题?
Vbox下注意虚拟机操作系统网络设置是否为桥接模式,另外可以排查下是否是DNS解析问题引起的。
5、 Vbox不能安装64位Linux系统?
检查电脑CPU是否支持虚拟化技术,BOIS设置是否开启虚拟支持。
6、 Windows10系统安装Docker套件后,Vbox不能启动?
Docker套件安装完后默认会开启Windows10自带的虚拟技术,此时Vbox使用的CPU支持虚拟技术将无法使用。因此WIN10下两软件默认不兼容。
7、 目前项目坑太多,习惯折腾就好 >> 哈哈~~~