首頁 > 軟體

在Ubuntu中部署並測試HyperLedger Fabric

2020-06-16 17:19:03

最近開始研究區塊鏈,對這個新興的技術有了基本概念上的了解,所以打算基於一個開源專案做做實驗。如果是做數位貨幣,那麼位元幣的原始碼是最好的了,不過這算是區塊鏈1.0吧,已經有很多改進的競爭幣和山寨幣出來了,所以打算對區塊鏈2.0,也就是智慧合約入手。

智慧合約比較成功的就是以太坊了。以太坊主要是公有鏈,其實對企業應用來說並不是特別合適,而且本身並沒有許可權控制功能,面向企業的,主要還是超級賬本HyperLedger的Fabric和剛剛開源出來的R3的Corda。關於這些專案的應用場景和區別,我覺得這篇文章寫的比較好:http://www.linuxidc.com/Linux/2017-03/141949.htm

經過比較,覺得Fabric目前比較合適,所以就以這個專案為基礎,學習智慧合約。

一、環境準備

1.1 安裝VirtualBox並在其中安裝好Ubuntu

這一步其實沒啥好說的,下載好最新版的VirtualBox,下載Ubuntu Server,我用的是16.10 X64。在安裝完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

1.2 安裝Docker

安裝Docker也會遇到外國網路慢的問題,幸好國內有很好的映象,推薦DaoClound,安裝Docker的命令是:

curl -sSL https://get.daocloud.io/docker | sh
安裝完成後,執行以下指令碼將當前使用者新增到Docker的組中
sudo usermod -aG docker studyzy
重新登入當前使用者,接下來修改 Docker 服務設定(/etc/default/docker 檔案)。
sudo vi /etc/default/docker
新增以下內容:
DOCKER_OPTS="$DOCKER_OPTS -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --api-cors-header='*'"
接下來就需要設定國內的Docker映象地址,需要註冊一個賬號,然後在加速器頁面提供了設定Docker映象的指令碼,加速器頁面是:
https://www.daocloud.io/mirror 我提供的指令碼是:
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://d4cc5789.m.daocloud.io
執行完指令碼後,重新啟動Docker服務
sudo service docker restart

1.3 安裝docker-compose

Docker-compose是支援通過模板指令碼批次建立Docker容器的一個元件。在安裝Docker-Compose之前,需要安裝Python-pip,執行指令碼:

sudo apt-get install python-pip

安裝完成後,接下來從DaoClound安裝Docker-compose,執行指令碼:

curl -L https://get.daocloud.io/docker/compose/releases/download/1.10.1/docker-compose-`uname -s`-`uname -m` > ~/docker-compose 
sudo mv ~/docker-compose /usr/local/bin/docker-compose 
chmod +x /usr/local/bin/docker-compose

二、Fabric部署

2.1 下載Fabric映象

Fabric的Docker映象是在https://hub.docker.com/r/hyperledger/ 我們要做實驗主要用到peer,baseimage,membersrvc,先現在Peer和membersrvc,這兩個映象提供了latest版本,所以直接pull下來即可。

docker pull hyperledger/fabric-peer
docker pull hyperledger/fabric-membersrvc

但是baseimage是沒有latest版本,所以我們可以下載一個新一點的版本,然後rename成latest。

docker pull hyperledger/fabric-baseimage:x86_64-0.3.0
docker tag hyperledger/fabric-baseimage:x86_64-0.3.0 hyperledger/fabric-baseimage:latest

現在我們執行docker images命令,可以看到我們準備好的映象:

REPOSITORY                      TAG                IMAGE ID            CREATED            SIZE
hyperledger/fabric-baseimage    latest              f4751a503f02        7 days ago          1.27 GB
hyperledger/fabric-baseimage    x86_64-0.3.0        f4751a503f02        7 days ago          1.27 GB
hyperledger/fabric-membersrvc  latest              b3654d32e4f9        3 months ago        1.42 GB
hyperledger/fabric-peer        latest              21cb00fb27f4        3 months ago        1.42 GB

2.2 使用Git下載Docker-compose模板

如果沒有安裝Git,那麼需要先安裝Git,安裝Git很簡單:

sudo apt-get install git

感謝yeasy提供的很好的HyperLedger的模板,我們先克隆到本地:

git clone https://github.com/yeasy/docker-compose-files

2.3 以PBFT模式啟動Fabric

先進入Git下載下來的Docker-compose目錄:

cd docker-compose-files/hyperledger/0.6/pbft/

這裡提供了多種模式的啟動方案,一種是啟動4個節點的Peer,沒有許可權認證:4-peers.yml 另一種是在4節點Peer的基礎上,再加上MembershipService節點,也就是需要許可權認證的:4-peers-with-membersrvc.yml 另外還有再進一步,提供了web的Explorer的:4-peers-with-membersrvc-explorer.yml

這裡我們就簡單點,直接忽略掉MembershipService和Explorer,只啟用4個節點的PBFT:

docker-compose -f 4-peers.yml up

系統會列印出啟動的紀錄檔:

Creating network "pbft_default" with the default driver 
Creating pbft_vp0_1 
Creating pbft_vp3_1 
Creating pbft_vp2_1 
Creating pbft_vp1_1
……

至此,我們的環境搭建完畢,接下來我們就可以在上面跑鏈上程式碼了。

三、測試Fabric

3.1 在CLI中測試Example02

我們前面建立了4個容器,開啟另外一個命令列視窗,輸入docker ps命令,可以看到當前容器的狀態:
CONTAINER ID        IMAGE                            COMMAND            CREATED            STATUS              PORTS                                  NAMES
2131cede4ade        hyperledger/fabric-peer:latest  "peer node start"  3 minutes ago      Up 3 minutes        7050-7059/tcp                          pbft_vp1_1
5acea88f21bc        hyperledger/fabric-peer:latest  "peer node start"  3 minutes ago      Up 3 minutes        7050-7059/tcp                          pbft_vp2_1
546b103d904d        hyperledger/fabric-peer:latest  "peer node start"  3 minutes ago      Up 3 minutes        7050-7059/tcp                          pbft_vp3_1
327ab874b2e3        hyperledger/fabric-peer:latest  "peer node start"  3 minutes ago      Up 3 minutes        0.0.0.0:7050->7050/tcp, 7051-7059/tcp  pbft_vp0_1

這裡我們可以看到,最後一個容器pbft_vp0_1其啟用了埠對映的,容器上面的7050埠會對映到Ubuntu的7050埠上。我們要執行命令列程式碼,需要先連線到這個容器內部:

docker exec -it pbft_vp0_1 bash

進入容器後,命令列會變為:root@vp0:/opt/gopath/src/github.com/hyperledger/fabric#

這裡的容器已經幫我們把測試程式碼都放在了容器裡面,所以我們不需要再下載測試程式碼。

3.1.1部署Go語言的ChainCode並初始化

下面我們部署Example02到Fabric上:

peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}'

這個範例是初始化兩個賬戶a和b,a有餘額100元,b有餘額200元,這是執行結果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode deploy -p github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02 -c '{"Function":"init", "Args": ["a","100", "b", "200"]}' 
08:37:12.187 [chaincodeCmd] chaincodeDeploy -> INFO 001 Deploy result: type:GOLANG chaincodeID:<path:"github.com/hyperledger/fabric/examples/chaincode/go/chaincode_example02" name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" > ctorMsg:<args:"init" args:"a" args:"100" args:"b" args:"200" > 
Deploy chaincode: ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539 
08:37:12.188 [main] main -> INFO 002 Exiting..... 

這裡我們可以看到已經部署成功,並返回了ChainCode的ID:ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539

3.1.2查詢ChainCode

下面我們把這個ID放入一個變數中:

CC_ID="ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539"

下面我們來查詢一下a賬戶的餘額:

peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}'

這是執行結果:

root@vp0:/opt/gopath/src/github.com/hyperledger/fabric# peer chaincode query -n ${CC_ID} -c '{"Function": "query", "Args": ["a"]}' 
08:41:17.780 [chaincodeCmd] chaincodeInvokeOrQuery -> INFO 001 Successfully queried transaction: chaincodeSpec:<type:GOLANG chaincodeID:<name:"ee5b24a1f17c356dd5f6e37307922e39ddba12e5d2e203ed93401d7d05eb0dd194fb9070549c5dc31eb63f4e654dbd5a1d86cbb30c48e3ab1812590cd0f78539" > ctorMsg:<args:"query" args:"a" > > 
Query Result: 100 
08:41:17.781 [main] main -> INFO 002 Exiting.....

可以看到查詢結果是100元。

注意:這裡如果遇到了丟擲異常:


IT145.com E-mail:sddin#qq.com