深度学习
第11章 从零开始部署超级账本网络
在第2章我们简要地搭建了超级账本的网络,本章我们详细地介绍如何从头进行初始化的配置,手动部署超级账本的节点和链码,调用链码实现智能合约的功能。
11.1 准备超级账本运行环境
本节介绍多种构建超级账本运行环境的方法,然后介绍如何编译超级账本的镜像文件。
11.1.1 超级账本运行环境
链码依赖于Docker才能启动运行,超级账本的各节点也推荐运行在Docker容器中,方便系统的运维管理。在开发的过程中,有多种运行方式可以选择:基于Vagrant的运行环境、基于Virtualbox的运行环境和基于Docker的运行环境。
1.基于Vagrant的运行环境
Vagrant用一致的工作流程提供了易于配置、可重复、便携的工作环境,让开发人员可以快速地创建和销毁虚拟 机,帮助团队最大限度地提高生产力和灵活性。图11-1是基于Vagrant的运行环境示意图,Vagrant同时支持Linux、MacOS或 Windows等不同的平台,通过相同的配置文件Vagrantfile启动Virtuabox虚拟机。虚拟机的操作系统是Ubuntu 16.04,启动的过程会调用脚本devenv/setup.sh安装所需要的软件并做相应配置,包括安装Docker、Docker Compose、Golang、Node.js、OpenJDK、Gradle等,还会修改系统的文件描述符数等,这样统一用同一套配置运行相同的程序, 就不会再有“我的环境有问题”的借口了,也不会存在工作习惯划分出不同阵营的情况,非常适合工作团队合作。图11-1是基于Vagrant的运行环境示意 图。
图11-1 基于Vagrant的运行环境示意图
(1)配置文件Vagrantfile
我们先来看一下配置文件Vagrantfile的内容。
SRCMOUNT = "/hyperledger"
LOCALDEV = "/local-dev"
$script = <<SCRIPT
set -x
echo "127.0.0.1 couchdb" | tee -a /etc/hosts
export DOCKER_STORAGE_BACKEND="#{ENV['DOCKER_STORAGE_BACKEND']}"
cd //{SRCMOUNT}/devenv
./setup.sh
SCRIPT
Vagrant.require_version ">= 1.7.4"
Vagrant.configure('2') do |config|
config.vm.box = "ubuntu/xenial64" // 基础镜像
config.vm.network :forwarded_port, guest: 7050, host: 7050, id: "orderer",
host_ip: "localhost", auto_correct: true // 排序服务
config.vm.network :forwarded_port, guest: 7051, host: 7051, id: "peer", host_ip:
"localhost", auto_correct: true // Peer节点
config.vm.network :forwarded_port, guest: 7053, host: 7053, id: "peer_event",
host_ip: "localhost", auto_correct: true // 事件服务
config.vm.network :forwarded_port, guest: 7054, host: 7054, id: "ca", host_ip:
"localhost", auto_correct: true // fabric-ca
config.vm.network :forwarded_port, guest: 5984, host: 15984, id: "couchdb",
host_ip: "localhost", auto_correct: true // CouchDB
config.vm.synced_folder "..", "#{SRCMOUNT}" // 同步目录
config.vm.synced_folder "..", "/opt/gopath/src/github.com/hyperledger/fabric" //同步目录
config.vm.synced_folder ENV.fetch('LOCALDEVDIR', ".."), "#{LOCALDEV}" // 同步目录
if File.exist?("../../fabric-ca")
config.vm.synced_folder "../../fabric-ca", "/opt/gopath/src/github.com/
hyperledger/ fabric-ca"
end
config.vm.provider :virtualbox do |vb|
vb.name = "hyperledger" // 虚拟机名称
vb.customize ['modifyvm', :id, '--memory', '4096'] // 内存大小
vb.cpus = 2 // CPU
storage_backend = ENV['DOCKER_STORAGE_BACKEND']
case storage_backend
when nil,"","aufs","AUFS"
// 不需要额外的操作
when "btrfs","BTRFS"
// 添加一个btrfs的卷
IO.popen("VBoxManage list systemproperties") { |f|
success = false
while line = f.gets do
// 查找虚拟机文件存储目录
machine_folder = line.sub(/^Default machine folder:\s*/,"")
if line != machine_folder
btrfs_disk = File.join(machine_folder, vb.name, 'btrfs.vdi')
unless File.exist?(btrfs_disk)
// 创建btrfs磁盘
vb.customize ['createhd', '--filename', btrfs_disk,
'--format', 'VDI', '--size', 20 * 1024]
end
// 添加磁盘到虚拟机
vb.customize ['storageattach', :id, '--storagectl', 'SATA
Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', btrfs_disk]
success = true
break
end
end
raise Vagrant::Errors::VagrantError.new, "Could not provision btrfs
disk" if !success
}
else
raise Vagrant::Errors::VagrantError.new, "Unknown storage backend type:
{storage_backend}"
end
end
config.vm.provision :shell, inline: $script
end
Vagrant.require_version“>=1.7.4”是对Vagrant本身版本的要求,这 里定义的版本必须大于等于1.7.4。config.vm.box定义了基础镜像的名称和版本,config.vm.network定义了与宿主机之间的 端口转发,预留端口间的对应关系如表11-1所示。实际用途可以自己定义,也可以修改这个文件增加端口的映射。
表11-1 Vagrant的端口映射列表
config.vm.synced_folder是和宿主机共享目录的配置,默认是把源代码的目录映射到了 /hyperledger、/local-dev、/opt/gopath/src/github.com/hyperledger/fabric等几个 目录下,任何一个目录下修改都能在其他目录下看到变化,和宿主机上的目录是同步的。
(2)Vagrant镜像文件Box
Vagrant生成的镜像叫Box,官方提供了存储仓库:https://atlas.hashicorp.com/boxes/search,可以搜索到公开的Box,比如hyperldger的基础镜像https://atlas.hashicorp.com/hyperledger/boxes/fabric-baseimage,最新版本是0.3.0。目前官方并不推荐使用Vagrant的方式构建开发环境,已经很久没有更新了。
Box支持Docker、Hyper-V、VMware、VirtualBox等不同的Provider类型。 Box是采用tar、tar.gz或者zip压缩的,压缩包里的内容根据Provider不同有所区别,例如,本地的一个baseimage- public.box里包含内容如下。
localhost:fabric-baseimage clarity$ tar -tf baseimage-public.box
Vagrantfile
box.ovf
metadata.json
packer-virtualbox-iso-1482837643-disk1.vmdk
其中metadata.json是必须的,需要指定Privider的类型,内容如下:
localhost:fabric-baseimage clarity$ cat metadata.json
{"provider":"virtualbox"}
VirtualBox的虚拟机默认使用第一个网卡进行通信,需要设置成NAT模式,Vagrantfile里的config.vm.base_mac设置的就是NAT网络设备的macOS地址:
localhost:fabric-baseimage clarity$ cat Vagrantfile
Vagrant.configure("2") do |config|
config.vm.base_mac = "08002730B696"
end
Vagrant启动VirtualBox虚拟机的时候会导入压缩包里的box.ovf文件,OVF是Open Virtualization Format的简称,是一种开放的虚拟机打包和分发的标准,更多的内容参考http://www.dmtf.org/standards/ovf。根据“References->File的ovf:href”读取真正的虚拟机文件,其他是CPU、网络、内存等的设置。
(3)Vagrant支持的虚拟机环境
Provider是Vagrant支持的虚拟机运行环境,目前支持Docker、Hyper-V、VMware、VirtualBox等几种类型,是和Box的文件格式相对应的。除此之外,还可以对Provider进行定制,https://github.com/mitchellh/vagrant-aws以插件的形式提供了对AWS的支持,也可以用Ruby语言编写自己的插件。
(4)Vagrant常用命令(见表11-2)
表11-2 Vagrant常用命令
更多的命令可以查看官方文档,或者通过参数-h查看:
vagrant -h
(5)Vagrant的安装和使用
安装过程比较简单,MacOS、Windows、Debian、CentOS等平台都有安装包,直接到下载页面https://www.vagrantup.com/downloads.html下 载最新版本安装即可。提醒一下,在实际的测试过程中发现Vagrant和VirtualBox也存在版本依赖的情况,比如Vagrant 1.8.4和Virtualbox的5.1.X的版本会有冲突,出现“No usable default provider could be found for your system.”的问题。安装的时候不要下载和Virtualbox有冲突的版本就可以。
安装完成以后进入超级账本源码子目录devenv,执行如下命令就可以自动配置好开发环境了:
// 进入超级账本源码子目录devenv
cd $GOPATH/src/github.com/hyperledger/fabric/devenv/
// 启动Vagrant环境,自动配置开发环境。如果vagrant环境已经启动,则不需要执行
vagrant up
// 进入虚拟机环境
vagrant ssh
配置Vagrant环境的过程可能会比较慢,可能会有一些网络方面的问题,可以参考本章后面要介绍的编译镜像文件 部分做修改。配置完成以后就安装好了Golang、Docker、Docker Compose等环境。准备好开发环境就可以进行源码编译了,参考本章后面编译镜像文件的内容。
2.基于Virtualbox的运行环境
基于Vagrant的运行环境最大的好处是能自动地配置开发环境,不过Vagrant也会存在和操作系统兼容性的 问题,比如在Windows 7上很容易安装失败,最新版本中超级账本官方并不推荐采用Vagrant的方式。我们可以在虚拟机的基础上自行构建所需要的开发环境,这里我们以 Virtualbox为例。
VirtualBox也支持Windows、MacOS、Linux、Solaris等多个平台,直接在官网https://www.virtualbox.org/wiki/Downloads下载安装即可。这里简单地介绍一下在Virtualbox上安装Ubuntu 16.04的过程,先从国内的镜像源下载镜像文件:http://mirrors.163.com/ubuntu-releases/16.04/ubuntu-16.04.3-server-amd64.iso。
在打开的VirtualBox控制台上点击新建虚拟机,在操作系统类型中选择Ubuntu,虚拟机的名称可以自定义,比如Ubuntu,如图11-2所示,然后按照默认选项点击下一步的按钮。
图11-2 在Virtualbox上新建虚拟机
当虚拟机新建完成以后,在虚拟机列表中选择创建的虚拟机,如图11-3所示。
图11-3 启动虚拟机
这个时候虚拟机是没有安装操作系统的,在启动过程中可以选择刚刚下载的iso文件,如图11-4所示。
图11-4 选择操作系统安装文件
在弹出的文件浏览器中选择文件,按默认步骤安装就可以了,如图11-5所示。
图11-5 选择操作系统安装文件
当操作系统安装完成以后就可以安装一些基础环境了,Docker和Docker Compose的安装请参考第2章的内容。
(1)安装Golang
进入Golang的官网下载页面http://golang.org/dl,选择不同平台上的安装包安装即可,目前Vagrant里指定的版本是1.7.5,也可以选择最新稳定版。如果由于网络原因无法下载的话,可以选择国内的下载地址http://golangtc.com/download。Ubuntu系统可以直接通过命令安装:
sudo apt-get install golang
直接通过源安装的版本是1.6.2,安装完成以后需要设置环境变量GOROOT和GOPATH,比如:
clarity@ubuntu:~/gopath$ cat ~/.bashrc
export GOROOT=/usr/local/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
(2)安装libtool
需要安装libtool,否则后面编译的时候会报错:'ltdl.h'file not found。
wget http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz
tar -zxvf libtool-2.4.6.tar.gz
cd libtool-2.4.6
sudo apt-get install automake
./configure --prefix=/usr
sudo make && sudo make install
做了上述准备以后,就可以开始编译超级账本镜像文件了。
3.基于Docker的运行环境
超级账本在Docker官方镜像仓库Docker Hub维护了不同版本的镜像文件:https://hub.docker.com/u/hyperledger,可以直接下载部署使用,详细使用方法参考第2章的内容。下面我们介绍源码编译的方法生成镜像。
上述所有的方法中,建议初次部署超级账本网络的时候使用基于Docker的运行环境,能对超级账本的运行流程有最 直观的感受。但是Windows和Mac OS上的Docker都极不稳定,容易出现异常,深入研究和最终部署的时候建议采用基于Virtuabox或者申请云主机镜像搭建运行环境。
11.1.2 编译超级账本镜像文件
由于国内网络的原因,我们需要先做一些准备工作才能编译超级账本镜像文件。
1.编译超级账本镜像文件
下面是通过Github下载golang.org/x/tools库的方法,否则可能由于网络问题安装失败。
// 通过Github下载golang.org/x/tools库
sed -i 's/.*@mkdir -p $@\/bin $@\/obj.*/&\n\t@cd $(TOOLS_SRC)\/tools || (mkdir -p
$(TOOLS_SRC) \&\& cd $(TOOLS_SRC) \&\& git clone
https:\/\/github.com\/golang\/tools.git)/' Makefile
sed -i 's/.*@mkdir -p $@\/bin $@\/obj.*/&\n\t@$(eval TOOLS_DST = \/opt\/gotools\/
obj\/gopath\/src\/golang.org\/x)/' Makefile
sed -i 's/.*@mkdir -p $@\/bin $@\/obj.*/&\n\t$(eval TOOLS_SRC = $(dir $(abspath
$<))\/build\/gopath\/src\/golang.org\/x)/' Makefile
// 映射下载的目录到临时构建容器中
sed -i 's/.*-v $(abspath $@):\/opt\/gotools.*/&\n\t\t-u root -v $(TOOLS_
SRC):$(TOOLS_DST) \\/' Makefile
// 构建完成删除增加sudo权限
sed -i 's/rm -rf build /sudo rm -rf build /' Makefile
编译完成以后生成的临时目录build/docker/gotools/obj权限变成了root,在make clean需要sudo权限才能删除。
Hyperledger Fabric 1.0.0中Zookeeper的版本是3.4.9,已经不维护了,替换为最新的稳定版本3.4.10:
sed -i 's/zookeeper-3.4.9/zookeeper-3.4.10/'
images/zookeeper/Dockerfile.in
做好前面的准备工作后,超级账本源码编译就比较简单了,只需要在超级账本的源代码目录下执行如下命令,就可以自动编译出所有的镜像文件了。
# 下载fabric源代码
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
cd fabric
git checkout -b v1.0.0 v1.0.0
# 编译镜像文件
make docker
下面是编译fabric-ca的镜像文件:
# 下载fabric-ca源代码
mkdir -p $GOPATH/src/github.com/hyperledger
cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric-ca.git
cd fabric-ca
git checkout -b v1.0.0 v1.0.0
# 编译镜像文件
make docker
2.超级账本镜像文件
编译生成的超级账本镜像文件,如表11-3所示。
表11-3 超级账本镜像文件
编译超级账本镜像用到很多的免费开源软件(Free and Open-source Software,FOSS),基于Ubuntu 16.04的镜像文件ubuntu/xenial64构建出镜像文件hyperledger/fabric-baseos,这是所有其他镜像文件的基础。 镜像文件较小,包含的内容也只在ubuntu/xenial64基础上增加了软件下载工具wget和时区配置工具tzdata。Golang的链码是在 hyperledger/fabric-baseos基础上包含通过hyperledger/fabric-ccenv编译出的二进制文件构建的链码容 器,这样构建出的链码容器相对较小。镜像文件hyperledger/fabric-basejvm包含了OpenJDK 8的Java编译运行环境,Java的链码基于hyperledger/fabric-javaenv的运行环境,包含了Java的链码SDK的内容。
来源:我是码农,转载请保留出处和链接!
本文链接:http://www.54manong.com/?id=1050
微信号:qq444848023 QQ号:444848023
加入【我是码农】QQ群:864689844(加群验证:我是码农)
全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试
var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!
评论专区