如何在本地编译Fabric Code
之前的博客都是拿官方现成的Docker镜像来用,但是并没有自己动手做镜像,也没有说到如何去开发和测试Fabric的代码。这一篇博客就从入门的角度讲解如何编译、测试和开发Fabric。
一、环境准备
要进行相关的开发工作,当然第一步是准备好环境,还是老生常谈,主要是安装Docker、安装Go,下载最新Fabric代码等工作。我这里使用的是VirtualBox里面安装的Ubuntu 16.04,如果您使用的不是这个版本,可能有些命令会有所区别。Fabric开发依赖的工具主要还是参考官方文档:http://hyperledger-fabric.readthedocs.io/en/latest/dev-setup/devenv.html
1. 使用VirtualBox并在其中安装好Ubuntu
这一步其实没啥好说的,下载好最新版的VirtualBox,下载Ubuntu Server,我用的是Ubuntu16.04.2 X64 Server。我使用的用户是studyzy,不建议直接在root下执行命令。在安装完Ubuntu后,需要保证apt source是国内的,不然如果是国外的话会很慢很慢的。具体做法是
sudo vi /etc/apt/sources.list
打开这个apt源列表,如果其中看到是http://us.xxxxxx之类的,那么就是外国的,如果看到是http://cn.xxxxx之类的,那么就不用换的。我的是美国的源,所以需要做一下批量的替换。在命令模式下,输入:
:%s/us./cn./g
就可以把所有的us.改为cn.了。然后输入:wq即可保存退出。
sudo apt-get update
更新一下源。
然后安装ssh,这样接下来就可以用putty或者SecureCRT之类的客户端远程连接Ubuntu了。
sudo apt-get install ssh
2. Go的安装
Ubuntu的apt-get虽然提供了Go的安装,但是版本比较旧,最好的方法还是参考官方网站https://golang.org/dl/ ,下载最新版的Go。具体涉及到的命令包括:
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
【注意:不要使用apt方式安装go,apt的go版本太低了!】
接下来编辑当前用户的环境变量:
vi ~/.profile
添加以下内容:
export PATH=$PATH:/usr/local/go/bin
export GOROOT=/usr/local/go
export GOPATH=$HOME/go
export PATH=$PATH:$HOME/go/bin
编辑保存并退出vi后,记得把这些环境载入:
source ~/.profile
我们把go的目录GOPATH设置为当前用户的文件夹下,所以记得创建go文件夹
cd ~
mkdir go
运行以下命令查看当前go的版本,如果能够显示go版本,那么说明我们的go安装成功.
go version
3. Docker安装
我们可以使用阿里提供的镜像,安装也非常方便,参考:https://yq.aliyun.com/articles/110806 ,其中Ubuntu的脚本是:
# step : 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step : 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step : 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step : 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
安装完成后需要修改当前用户(我使用的用户叫studyzy)权限:
sudo usermod -aG docker studyzy
注销并重新登录,然后添加阿里云的Docker Hub镜像:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
不同的版本添加方法是不一样的,官方的文档如下:
https://cr.console.aliyun.com/#/accelerator
当然觉得阿里云镜像不好用,喜欢用DaoClound的也可以用DaoClound的镜像。DaoCloud的镜像设置文档为:https://www.daocloud.io/mirror#accelerator-doc
4. Docker-Compose的安装
Docker-compose是支持通过模板脚本批量创建Docker容器的一个组件。
然后是安装docker-compose,我们从官方网站(https://github.com/docker/compose/releases)下载,运行脚本:
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
5.Pip的安装
Pip是基于Python的一个工具,需要安装Python-pip,运行脚本:
sudo apt-get install python-pip
这个脚本会安装Pip所依赖的Python和各种库,所以安装pip完毕后我们也有了Python的环境。运行以下命令可以检查pip和Python的版本:
pip –V
apt安装的版本可能不够新,我们使用以下命令可以更新pip版本:
pip install --upgrade pip
6. Go Tools安装
Fabric使用GO开发,其中用到了一些官方或者第三方的工具,我们也需要下载。尤其是golang的网址被墙了,我们只有访问GitHub的镜像。
mkdir –p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/tools.git
等tools下载完毕,我们可以运行以下命令来安装Fabric可能用到的Go工具:
go get github.com/kardianos/govendor
go get github.com/golang/lint/golint
go get golang.org/x/tools/cmd/goimports
go get github.com/onsi/ginkgo/ginkgo
go get github.com/axw/gocov/...
go get github.com/client9/misspell/cmd/misspell
go get github.com/AlekSi/gocov-xml
go get github.com/golang/protobuf/protoc-gen-go
7. 第三方库安装
Fabric依赖的第三方库里面,有些库又依赖了其他库,而这些库是需要我们先手动准备好的。比如libltdl-dev,这是PKCS11用到的一个库,我们需要安装:
sudo apt-get install libltdl-dev
8. Fabric源码下载
我们可以使用Git命令下载源码,首先需要建立对应的目录,然后进入该目录,Git下载源码:
mkdir -p ~/go/src/github.com/hyperledger
cd ~/go/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git
等Fabric下载完毕后,我们就切换到Fabric源码的文件夹:
cd ~/go/src/github.com/hyperledger/fabric
二、编译Fabric
编译Fabric的代码主要是通过make命令来完成,因为官方已经写好了完整的Makefile,所以我们要编译各个Fabric的组件还是比较简单的。关于make的基础知识,可以参考这篇博客:http://www.ruanyifeng.com/blog/2015/02/make.html
下面我们就分步骤来编译Fabric。
1.Orderer节点的编译
Orderer节点容器里面运行的是orderer服务,我们要生成Orderer镜像,就需要先编译出Orderer程序。执行:
make orderer
这是我在CLI下执行的结果:
studyzy@ubuntu1:~/go/src/github.com/hyperledger/fabric$ make orderer
build/bin/orderer
CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.6-snapshot-a8728bc -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/orderer
Binary available as build/bin/orderer
从日志可以看出,Orderer编译完成后,会把二进制文件放在build/bin/orderer。
2.Peer节点的编译
Peer节点的编译会比Orderer复杂很多,因为墙的原因,我们需要做一些额外的操作。另外链码是运行在Peer所在的机器上,所以需要给ChainCode准备运行基础环境,也就是ccenv和javaenv两个镜像。在make peer之前我们必须先保证本地没有对应的镜像文件,如果有,那么就用docker rmi命令删除之前下载或者编译好的镜像。
还记得前面下载的Go Tools吗,这里需要copy到Fabric目录里面来:
mkdir -p build/docker/gotools/bin
cp ~/go/bin/* build/docker/gotools/bin
以上操作纯粹是为了绕开墙,如果你本身不存在墙的问题,那么完全可以不用如此多此一举。
接下来直接运行以下命令即可编译生成Peer节点的Docker镜像:
make peer
运行该命令后,系统首先会下载hyperledger/fabric-baseimage:x86_64-0.3.2这个镜像到本地,这是所有Fabric镜像的基础镜像文件。
下载后会从官网下载chaintool的jar包,下载地址:https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/chaintool-1.0.0/hyperledger-fabric-chaintool-1.0.0.jar
这个地址没有被墙,一般来说是能够正常下载下来的。
下载chaintool完毕后,接下来就开始创建fabric-ccenv镜像。所有创建Docker镜像都是基于Dockerfile,我们可以在Fabric目录下的images文件夹看到所有Fabric镜像Build的步骤配置。
在创建fabric-ccenv镜像后,接下来是创建java版ChainCode的基础镜像,也就是fabric-javaenv,最后才是build peer程序,运行成功后看到的日志大概是这样的:
…… Successfully built b8f69c7b3c4c
Successfully tagged hyperledger/fabric-javaenv:latest
docker tag hyperledger/fabric-javaenv hyperledger/fabric-javaenv:x86_64-1.0.-snapshot-a8728bc
build/bin/peer
CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.6-snapshot-a8728bc -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/peer
Binary available as build/bin/peer
3.Fabric 工具编译
Fabric除了Orderer和Peer外,还为我们提供了几个很方便的工具,在搭建Fabric网络时我们就用到过。那就是:
- configtxgen
- cryptogen
- configtxlator
这三个工具的编译也很简单,直接运行以下命令即可:
make configtxgen
make cryptogen
make configtxlator
4.Docker镜像的生成
前面三步只是生成了Fabric的二进制文件,我们并不能直接使用,而是需要分别将这些二进制文件打包到Docker镜像中。所以我们接下来需要Build Docker Image。
要生成Orderer镜像,那么需要运行命令:
make orderer-docker
由于没有网络文件的依赖,所以这时应该很快就能完成。然后我们继续生成Peer镜像:
make peer-docker
再然后是客户端,也就是fabric-tools,对应的命令是:
make tools-docker
以上3个最重要的镜像生成完成,我们可以用
docker images
查看当前的镜像列表:

5.其他Docker镜像的编译
除了上面我们看到的这些镜像外,实际上我们可能还会用到CouchDB做状态数据库,用Kafka做共识,用Zookeeper做Kafka的高可用支持,这些工具都有对应的Docker镜像,我们仍然可以使用make命令来生成他们。
运行以下命令,系统会给我们生成一整套的Fabric镜像:
make docker
这里一般来说没什么坑,主要是从网上下载一些包下来,会花一些时间。完成后,我们仍然运行
docker images
可以看到我们生成的所有Fabric镜像:

三、总结
如果没有墙的存在,那么我们编译和生成Fabric镜像将非常简单,直接一个make all命令即可。可惜因为墙的存在,所以有些地方需要特殊处理。下一篇博客我会讲到如何运行Fabric中的测试代码。只要我们能够自己编译Fabric,能够跑Fabric的Test,那么我们就可以很方便的对Fabric代码进行修改,并验证我们的修改,更进一步我们就可以将自己的代码提交到社区,为Fabric的壮大添砖加瓦。
最后再补充一句,如果我们对之前生成的镜像不满意,对代码进行调整后需要重新生成,可以使用
make clean
命令删除之前make的所有东西。然后重新执行make命令编译Fabric。
如何在本地编译Fabric Code的更多相关文章
- 如何在本地测试Fabric Code
前一篇博客讲到了如何编译本地的Fabric Code成镜像文件,那么如果我们想改Fabric源代码,实现一些Fabric官方并没有提供的功能,该怎么办呢?这时我们除了改源码,增加需要的功能外,还需要能 ...
- day111:MoFang:邀请好友流程&生成邀请好友二维码&第三方应用识别二维码&本地编译测试&记录邀请人信息
目录 1.邀请业务逻辑流程图 2.邀请好友-前端 3.邀请好友-后端接口(生成二维码) 4.前端获取后端生成的二维码 5.前端长按页面,保存图片到相册 6.客户端通过第三方识别微信二维码,服务端提供对 ...
- CentOS 7 编译安装 Code::Blocks
CentOS 7 编译安装 Code::Blocks yum install cairo-devel yum install pango-devel yum install atk-devel yum ...
- 【转】用串口登录Beaglebone Black、用usb共享电脑网络、内核模块的本地编译
原文网址:http://bbs.eeworld.com.cn/thread-431507-1-1.html 串口连接BBB使用usb线可以连接BBB和电脑,用ssh就可以登录BBB来进行操作.但有时候 ...
- Sql server2014 内存优化表 本地编译存储过程
参考文献:http://www.infoq.com/cn/news/2013/09/Compiled-Queries http://www.bianceng.cn/database/SQLServer ...
- 【Service Fabric】小白入门记录 本地Service Fabric集群安装及设置
本篇内容是自学自记,现在我还不知道Service Fabric究竟是怎么个入门法,反正按照入门教程先进行本地Service Fabric集群的安装,万里路始于足下,要学习总得先把环境装好了才能开始学习 ...
- Apollo-3.0本地编译
Apollo-3.0本地编译 用docker编译所用的dev.x86_64.dockerfile文件(具体位置在apollo/docker/build)中有所有的依赖库或包, 还会执行一些shell脚 ...
- Saiku本地编译运行后Debug调试(十二)
Saiku源码拉下来在本地编译通过,然后想进行单元测试 发现不知道怎么写测试类了... 幸好有同事大佬的帮助,教了一招哈哈哈哈... 1.将本地编译通过的Saiku打包好(mvn clean inst ...
- oracle本地编译问题
oracle10.2: --将过程重新编译为本地编译方式,提示有编译错误,经查提示未设置plsql_native_library_dir 参数 SQL> alter procedure p_xx ...
随机推荐
- 深入理解 new 操作符
和其他高级语言一样 JavaScript 也有 new 操作符,我们知道 new 可以用来实例化一个类,从而在内存中分配一个实例对象. 但在 JavaScript 中,万物皆对象,为什么还要通过 ne ...
- T5大牛带你解析:如何实现分布式技术
1.分布式事务 2. 分布式锁 Java 原生 API 虽然有并发锁,但并没有提供分布式锁的能力,所以针对分布式场景中的锁需要解决的方案. 分布式锁的解决方案大致有以下几种: 基于数据库实现 基于缓存 ...
- 我是如何拿到蚂蚁金服 offer 的 ?
阅读本文大概需要 5.6 分钟. 作者:翟洪毅 一.梦想和被拒 二.积累 三.结语 首先介绍一下投稿作者 翟洪毅,16年华理计算机本科毕业.在年前拿到了蚂蚁金服Java开发的offer,P6. 工 ...
- 在Coding上搭建Hexo个人博客
先注册一个Coding账号,然后创建一个项目这个项目的名字应该是{username}.coding.me 安装hexo脚手架 $ npm install -g hexo-cli 建站 安装完 Hexo ...
- 使用Maven的assembly插件实现自定义打包
一.背景 最近我们项目越来越多了,然后我就在想如何才能把基础服务的打包方式统一起来,并且可以实现按照我们的要求来生成,通过研究,我们通过使用maven的assembly插件完美的实现了该需求,爽爆了有 ...
- 从B站的代码泄露事件中,我们能学到些什么?
先声明一下,本文不聊ISSUE中的七七八八,也不聊代码是否写的好,更不聊是不是跟蔡徐坤有关之类的吃瓜内容.仅站在技术人的角度,从这次的代码泄露事件,聊聊在代码的安全管理上,通常都需要做哪些事来预防此类 ...
- 🕵️ 如何绕过 BKY 对 script 的屏蔽
Conmajia January 20, 2019 警告 这是试验,警告个屁,请不要多多尝试用它做多余的事. 果不其然,这篇文章立刻被移出主页了,我就说嘛,BKY 哪儿会那么包容和坦然呢? 原文 do ...
- 盘点 Python 中的那些冷知识(一)
小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来. 现在已经积攒了一些了,最近打算整理一波,发出来给大家补补.一篇只分享五个,有时间了就整理.不想错过的,千万记得关注一下. 1. 省略号 ...
- springboot源码分析-SpringApplication
SpringApplication SpringApplication类提供了一种方便的方法来引导从main()方法启动的Spring应用程序 SpringBoot 包扫描注解源码分析 @Spring ...
- 观察者模式 Observer 发布订阅模式 源 监听 行为型 设计模式(二十三)
观察者模式 Observer 意图 定义对象一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖他的对象都得到通知并自动更新. 别名:依赖(Dependents),发布订阅(Publish-Su ...