二维码

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

1389 人阅读 | 时间:2021年01月15日 01:20
11.1 准备超级账本运行环境 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

11.1 准备超级账本运行环境

1328 人参与  2018年10月10日 13:04  分类 : 区块链精品文章  评论

第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 准备超级账本运行环境 - 数据结构 - 机器学习

图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的端口映射列表

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

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常用命令

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

更多的命令可以查看官方文档,或者通过参数-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.1 准备超级账本运行环境 - 数据结构 - 机器学习

图11-2 在Virtualbox上新建虚拟机

当虚拟机新建完成以后,在虚拟机列表中选择创建的虚拟机,如图11-3所示。

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

图11-3 启动虚拟机

这个时候虚拟机是没有安装操作系统的,在启动过程中可以选择刚刚下载的iso文件,如图11-4所示。

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

图11-4 选择操作系统安装文件

在弹出的文件浏览器中选择文件,按默认步骤安装就可以了,如图11-5所示。

11.1 准备超级账本运行环境 - 数据结构 - 机器学习

图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 超级账本镜像文件

11.1 准备超级账本运行环境 - 数据结构 - 机器学习编译超级账本镜像用到很多的免费开源软件(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

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

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"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
关闭广告
关闭广告
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×