如何在本地編譯Fabric Code

深藍發表於2017-12-13

之前的部落格都是拿官方現成的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 1: 安裝必要的一些系統工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證照
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟體源資訊
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝 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.6-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

檢視當前的映象列表:

image

5.其他Docker映象的編譯

除了上面我們看到的這些映象外,實際上我們可能還會用到CouchDB做狀態資料庫,用Kafka做共識,用Zookeeper做Kafka的高可用支援,這些工具都有對應的Docker映象,我們仍然可以使用make命令來生成他們。

執行以下命令,系統會給我們生成一整套的Fabric映象:

make docker

這裡一般來說沒什麼坑,主要是從網上下載一些包下來,會花一些時間。完成後,我們仍然執行

docker images

可以看到我們生成的所有Fabric映象:

image

三、總結

如果沒有牆的存在,那麼我們編譯和生成Fabric映象將非常簡單,直接一個make all命令即可。可惜因為牆的存在,所以有些地方需要特殊處理。下一篇部落格我會講到如何執行Fabric中的測試程式碼。只要我們能夠自己編譯Fabric,能夠跑Fabric的Test,那麼我們就可以很方便的對Fabric程式碼進行修改,並驗證我們的修改,更進一步我們就可以將自己的程式碼提交到社群,為Fabric的壯大添磚加瓦。

最後再補充一句,如果我們對之前生成的映象不滿意,對程式碼進行調整後需要重新生成,可以使用

make clean

命令刪除之前make的所有東西。然後重新執行make命令編譯Fabric。

相關文章