深度探索區塊鏈/超級帳本初體驗(2)

本內容基於Hyperledger Fabric1.0(《深度探索區塊鏈》html

一。基礎環境安裝

Hyperledger fabric1.0依賴Docker執行「智能合約」,須要先安裝Docker和Docker-Compose的運行環境。python

(一)。Docker的安裝和使用

1。Docker安裝

Docker支持Linux,Mac,Windows等多平臺,安裝文檔參考:https://docs.docker.com/engine/installationlinux

Linux環境下docker安裝(爲了學習本課程,電腦安裝visualbox虛擬機,同時安裝ubuntu鏡像)git

//0.安裝curl
sudo apt install curl

//1.Ubuntu,debian,centos等linux系統,可經過官方提供的腳本進行安裝:
curl -sSL https://get.docker.com | sh

//2.將用戶加入到docker組,非root用戶USER能夠執行docker命令(可能須要從新登陸生效)
sudo usermod -aG docker $USER

//如果ubuntu/debian操做系統,修改Docker配置文件/etc/default/docker,增長Docker的socket綁訂,運行在Docker中的進程才能經過映射的socket調用Docker的API執行鏡像編譯和建立容器等操做。
DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock "

//3.重啓docker服務,讓配置生效
sudo service docker start

docker version //查看docker版本號

2。Docker國內鏡像倉庫

阿里雲和DaoCloud :提供鏡像加速的服務,須要登陸註冊才能使用。(可使用github帳號登陸)github

阿里雲:登陸容器Hub服務:https://cr.console.aliyun.com的控制檯 (左側加速器幫助頁面會顯示爲你獨立分配的加速地址)docker

DaoCloud:在https://www.daocloud.io進行註冊登陸 (點擊加速器獲取加速器相關配置)json

修改Docker鏡像倉庫的辦法:在DOCKER_OPTS里加入registry-mirror參數bootstrap

如:ubuntu

DOCKER_OPTS="-s=aufs -r=true --api-cors-header='*' -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --registry-mirror=http://069f616f.m.daocloud.io"

點擊加速器,跳轉:windows

//編輯docker文件,添加加速器
$ cd /etc/default

$ vi docker

重啓docker服務,便可以使用鏡像加速。(Docker在mac/windows能夠在圖形界面添加鏡像倉庫)

3。Docker經常使用命令

【1】。docker images:查看主機上的鏡像文件列表

【2】。docker pull:從鏡像倉庫中下載鏡你文件(如:docker pull hyperledger/fabric-peer)

【3】。docker tag:給鏡像文件打標籤,x86_64-1.0.0標記爲latest

         (如:docker tag hyperledger/fabric-tools:x86_64-1.0.0 hyperledger/fabric-tools:latest)

【4】。docker run:從鏡像中啓動容器,

      如:docker run -it --name cli ubuntu / bin/bash

      其中:cli是容器名稱,ubuntu是鏡像名稱,-it是以交互方式啓動,/bin/bash是啓動容器時執行的命令

【5】。docker logs:查看容器日誌(如:docker logs -f cli)

【6】。docker ps:查看主機上的容器,其中:參數-a會顯示已經中止的容器(docker ps -a)

【7】。docker port:查看容器映射的端口(如:docker port peer0.org1.example.com)

【8】。docker rm:刪除容器,其中:cli爲容器名稱或者id (docker rm cli)

【9】。docker --help:查看幫助文檔

以上,更多命令查看幫助文檔:https://docs.docker.com/engine/reference/commandline/docker

(二)。Docker Compose的安裝和使用

說明:

Docker Compose可以在一個主機上建立出相互隔離的網絡。

經過命令行管理多個Docker容器,快速啓動,中止和更新容器。

1。Docker Compose安裝(linux環境)

//方式一:經過pip進行安裝
sudo apt-get install python-pip
sudo pip install docker-compose  或$ pip install docker-compose>=1.8.0
//方式二:直接下載文件 curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-'uname -s' - 'uname -m' -o /usr/local/bin/docker-composechmod +x /usr/local/bin/docker-compose

推薦方式一。本人試用過,沒有問題。方式二方式會出現docker compose文件亂碼。

查看docker compose版本號:$ docker-compose -version

2。Docker Compose的配置文件

說明:Compose採用YAML文件定義Docker容器之間的依賴,設置環境變量和文件的持久化。

配置文件:/examples/e2e_cli/base/docker-compose-base.yaml

說明:

【1】。version:(version:'2')採用version 2的語法

【2】。services:定義服務列表

【3】。orderer.example.com:(根據服務名稱自定義)自定義的服務名稱,須要保持惟一。

【4】。container_name:容器名稱(如:container_name:orderer.example.com)

【5】。image:容器使用的鏡像文件(如:image:hyperledger/fabric-orderer)

【6】。environment:傳遞給容器的環境變量(-CORE_PEER_LOCALMSPID=Org1MSP)

【7】。working_dir:容器啓動的工做目錄(working_dir:/opt/gopath/src/github.com/hyperledger/fabric)

【8】。command:容器啓動的命令(command:orderer)

【9】。volumes:宿主機和容器之間的目錄映射(-/var/run/:/host/var/run/)

【10】。ports:宿主機和容器之間的端口映射(-7050:7050)

【11】。extends:服務擴展,基於common.yml文件(file:common.yml)

【12】。extends:服務擴展,基礎服務是peer-base(service:peer-base)

3。Docker Compose的經常使用命令

【1】。docker-compose up :根據配置文件docker-compose-cli.yaml啓動容器。

如:docker-compose -f docker-compose-cli.yaml up -d

其中 -f指定配置文件的名稱 -d設置之後臺方式運行

【2】。docker-compose down :中止配置文件docker-compose-cli.yaml的容器

如:docker-compose -f docker-compose-cli.yaml down

【3】。docker-compose pull:批量下載所需的鏡像文件

如:docker-compose -f docker-compose-cli.yaml pull

更多命令查看幫助文檔和在線文檔:https://docs.docker.com/compose/reference

(三)。下載超級帳本源代碼

超級帳本源代碼都託管在https://gerrit.hyperledger.org/r/#/admin/projects下面。

並在https://github.com/hyperledger上提供只讀代碼。

 Git命令下載

$ sudo apt install git     //安裝git

$ git version //查看git版本

$ git clone https://github.com/hyperledger/fabric.git //下載fabric源碼

本實例:

$ cd /opt

$ sudo mkdir -p ./gopath/src/github.com/hyperledger


$ cd ~/gopath/src/github.com/hyperledger

$ git clone -b release-1.0 https://github.com/hyperledger/fabric.git
 

也可打包下載文件後解壓:

https://github.com/hyperledger/fabric/archive/release.zip

(四)。超級帳本部署調用

1。下載Docker鏡像文件

說明:超級帳本scripts目錄下有多個下載鏡像的腳本,咱們能夠修改權限後直接運行。

//進入fabric/scripts 目錄
$ chmod +x bootstrap-1.0.0.sh 

//MacOS執行以下命令(不下載二進制文件)
$ sed -i '' 's/curl/#curl/g' bootstrap-1.0.0.sh

//其餘操做系統執行以下命令(不下載二進制文件)
$ sed -i 's/curl/#curl/g' bootstrap-1.0.0.sh

//直接下載Docker鏡像文件
$ ./bootstrap-1.0.0.sh

上述下載鏡像文件有9個:

Repository表明的是鏡像的倉庫名稱。每一個倉庫下面都有打了不一樣TAG的標籤名稱。表明不一樣的版本。

一般最少有2個標籤,一個是latest,另外一個的命名規則爲「主機CPU類型-超級帳本主版本號-snapshot-代碼庫版本號」

2。部署超級帳本網絡

說明:運行超級帳本須要設置較多的初始化配置,咱們先繞開初始化過程,用fabric-samples工程中已經生成的配置文件來體驗部署安裝的過程:

//下載目錄位置:/opt/src/github.com/hyperledger/
git clone -b release-1.0 https://github.com/hyperledger/fabric-samples.git

//上述也可不指定版本,直接下載最新fabric,利用git版本切換到1.0

進入basic-network目錄,利用docker-compose啓動容器

$ cd fabric-samples/basic-network

//利用docker-compose啓動容器
$ sudo docker-compose -f docker-compose.yml up -d  

//查看已經啓動的容器
$ docker ps

切換到管理員用戶再建立通道和加入通道:

//建立管理員密碼
su passwd root

//輸入密碼

//切換到管理員root身份
su root
#切換環境到管理員用戶的MSP,進入peer節點容器peer0.org1.example.com
docker exec -it -e "CORE_PEER_MSPCONFIGPATH=/etc/hyperledger/msp/users/Admin@org1.example.com/msp" peer0.org1.example.com bash

#建立通道
peer channel create -o orderer.example.com:7050 -c mychannel -f /etc/hyperledger/configtx/channel.tx

#加入通道
peer channel join -b mychannel.block

#退出peer節點容器peer0.org1.example.com
exit
  #退出peer節點容器peer0.org1.example.com,進入cli容器安裝鏈碼和實例化:
  #進入cli容器
docker exec
-it cli /bin/bash #給peer節點peer0.org1.example.com安裝鏈碼 peer chaincode install -n mycc -v v0 -p github.com/chaincode_example02 #實例化鏈碼 peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mycc -v v0 -c '{"Args":["init","a","100","b","200"]}'

 

 

上述鏈碼實例化後,能夠查詢初始值。一樣是在cli容器裏執行下面的操做:

peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'

調用鏈碼,從a轉移10到b

//a向b轉10
peer chaincode invoke -C mychannel -n mycc -v v0 -c '{"Args":["invoke","a","b","10"]}'

//查詢a值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","a"]}'
//查詢b值
peer chaincode query -C mychannel -n mycc -v v0 -c '{"Args":["query","b"]}'

3。節點的配置參數傳遞規則

說明:在docker-compose.yml文件中,有ORDERER_GENERAL_LEDGERTYPE=ram的設置,這是傳遞給節點的參數。

給節點傳遞參數的方法有多種方式:

【1】。環境變量

【2】。配置文件

【3】。動態環境變量

【4】。默認值

程序在啓動時,會讀取配置文件和環境變量的值,分別保存到不一樣變量緩存起來,

在程序獲取某個變量值的時候,不一樣傳遞方法參數讀取流程圖以下所示:

從圖中能夠看到,若是配置了自動從環境變量獲取參數的值,那麼每次都實時地從環境變量中獲取,不然依次讀取程序啓動時從環境變量、配置文件中讀取後緩存到內存中的值,優先獲取到的值做爲返回值。若是都沒有獲取到,則返回空,交給程序進行處理,程序可能會以默認值運行,也可能會報錯中止運行,這跟業務邏輯有關係。因此,只有在設置了自動從環境變量中獲取參數的狀況下,才能在運行時經過修改環境變量改變參數的值

每一個環境變量的名稱都有一個前綴,每一個模塊都是單獨設置的,好比ORDERER_GENERAL_LEDGERTYPE的前綴是ORDERER,一般每一個模塊的前綴是不同的。好比這裏的ORDERER表明的是排序服務節點Peer節點的變量名稱前綴是CORE環境變量名稱是以「_」做爲分隔符的,表明一種層級,是和配置文件一一對應的,好比ORDERER_GENERAL_LEDGERTYPE對應orderer.yaml配置文件的General.LedgerType。環境變量和配置文件的變量名稱都是不區分大小寫的,內部會統一轉換成小寫的變量名稱進行處理。

配置文件路徑優先讀取環境變量設置的路徑,排序服務節點和Peer節點都是相同的環境變量。若是沒有設置環境變量,則默認是應用程序所在的目錄,而後環境變量GOPATH路徑對應到模塊代碼工程下的目錄,好比排序服務節點的目錄是GOPATH/src/github.com/hyperledger/fabric/peer。

通常狀況下,配置文件的名稱設置成模塊前綴的小寫,好比排序服務節點的配置文件名稱是orderer,Peer節點的配置文件名稱是core。配置文件名稱的後綴支持:json、toml、yaml、properties、props、prop,它們分別對應JSON文件、TOML文件、YAML文件和Properties文件,程序設置配置文件的時候若是不指定後綴,則按支持的後綴順序在配置文件路徑下進行搜索,找到第一個匹配的文件做爲最終的配置文件。文件路徑和文件後綴按照廣度優先的搜索順序,即在同一路徑下匹配完全部文件後綴再進入下一個文件路徑。假設Peer節點沒有設置配置文件路徑,$GOPATH的路徑是/opt/gopath,則有兩個目錄下的文件以下所示:

vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree .

.

├── core.yaml

└── peer

vagrant@hyperledger-devenv:v0.2.2-58cde93: /opt/gopath/bin$ tree /opt/gopath/

src/github.com/hyperledger/fabric/peer

.

├── core.json

└── peer

搜索路徑順序是:

./core.json

./core.toml

./core.yaml

./core.properties

./core.props

./core.prop

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.toml

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.yaml

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.properties

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.props

/opt/gopath/src/github.com/hyperledger/fabric/peer/core.prop

因此最終獲取到的配置文件是:./core.yaml。

而不是/opt/gopath/src/github.com/hyperledger/fabric/peer/core.json。 

二。go及goland環境安裝

配置Go環境變量

下載Goland

linux環境下,安裝Goland

//linux默認下載位置 /tmp/mozilla_shiyufeng0
cd /tmp/mozilla_shiyufeng0

ls

//拷備goland的tar文件到 /usr/local下
cp -i goland-2018.2.tar.gz /usr/local/

//解壓縮到/opt目錄下
sudo tar -zxvf goland-2018.2.tar.gz -C /opt

cd  /opt/goland-2018.2/bin

//啓動goland
./goland.sh

goland激活碼:http://idea.youbbs.org (可隨時在網上查找)

導入fabric項目,效果以下所示:

上述basic-network和first-network可用於部署區塊鏈網絡示例。 

########### Docker經常使用命令 ###########

相關文章
相關標籤/搜索