聯盟鏈初識以及Fabric環境搭建流程

這篇文章首先簡單介紹了聯盟鏈是什麼,再詳細的介紹了Fabric環境搭建的整個流程。

區塊鏈分類:

以參與方式分類,區塊鏈可以分爲:公有鏈、聯盟鏈和私有鏈。

定義:

我們知道區塊鏈就是一個分佈式的,去中心化的公共數據庫(或稱公共賬本)。而聯盟鏈是區塊鏈的一個分支,所以它本身也是一個分佈式的,去中心化的公共數據庫,跟其他鏈的區別就是它是針對特定羣體的成員和有限的第三方,其內部指定多個預選節點爲記賬人,其共識過程受到預選節點控制的區塊鏈

本質

聯盟鏈本質仍然是一種私有鏈,只不過它要比單個小組織開發的私有鏈更大,但是卻沒有公有鏈這麼大的規模,可以理解爲它是介於公有鏈和私有鏈的一種區塊鏈。

聯盟鏈的特點

  • 交易速度快
    我們知道對於公有鏈來說,要想達成共識,必須得由區塊鏈中的所有節點來決定,本身公有鏈的節點數量就非常龐大,所以處理速度很慢。但對於聯盟鏈來說,由於其節點不多的原因,而且只要當網絡上2/3的節點達成共識,就可以完成交易,交易速度自然也就快很多。
  • 數據默認不會公開
    不同於公有鏈,聯盟鏈上的信息並不是所有有訪問條件的人就可以訪問的,聯盟鏈的數據只限於聯盟裏的機構及其用戶纔有權限進行訪問。
  • 部分去中心化
    與公有鏈不同,聯盟鏈某種程度上只屬於聯盟內部的所有成員所有,且很容易達成共識,因爲其節點數畢竟是有限的。

    聯盟鏈的應用

    R3:由40多加銀行參與的區塊鏈聯盟R3,包括世界著名的銀行(如摩根大通、高盛、瑞信、伯克萊、匯豐銀行等),IT巨頭(如IBM、微軟)。
    超級賬本(Hyperledger):由 Linux基金會在2015年12月主導發起該項目, 成員包括金融,銀行,物聯網,供應鏈,製造和科技行業的領頭羊。

    Fabric介紹

    我們知道智能合約比較成功的就是以太坊了。以太坊主要是公有鏈,其實對企業應用來說並不是特別合適,而且本身並沒有權限控制功能,面向企業的,主要還是HyperLedger Fabric,當然還有R3的Corda。這裏我們主要是講Fabric。
    Fabric是一個面向企業應用的區塊鏈框架,基於Fabric的開發可以粗略分爲幾個層面:
    1. 參與Fabric的底層開發,這主要是fabric,fabric-ca和sdk等核心組件。
    2. 參與Fabric周邊生態的開發,如支持如支持fabric的工具explorer, composer等。
    3. 利用fabric平臺開發應用,這就是利用fabirc提供的各種sdk來爲應用服務(應用開發)
    大部分企業會參與2-3的內容,以3爲主來服務應用場景,以2爲輔。因爲現在除了區塊鏈核心功能尚未完善外,對區塊鏈的管理,運維,監控,測試,優化,調試等工具非常匱乏。企業將不得不面對自己開發一些工作。

    Fabric環境依賴

    fabric官方推薦的開發環境是基於docker搭建的,使用docker搭建需要一下前置條件:

  • docker一一Docker version 17.06.2-ce 或以上版本
  • Docker Compose一一1.14或以上版本
  • Go一一1.10或以上版本, Node.js一一8.9.x或以上版本
  • Python一一主要是python-pip

    Fabric環境搭建具體步驟:

    這裏使用的是Ubuntu 16.04.4版本

1.安裝go及環境變量配置
(1)下載最新版本的go二進制文件

$ wget https://dl.google.com/go/go1.9.2.linux-amd64.tar.gz

(2)解壓文件

$ sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz

(3)配置環境變量

vim ~/.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

2.安裝docker
Fabric的chaincode是運行在docker裏的。
(1) 由於apt官方庫裏的docker版本可能比較舊,所以先卸載可能存在的舊版本:

sudo apt-get remove docker docker-engine docker-ce docker.io

(2) 更新apt包索引:

sudo apt-get update

(3) 安裝以下包以使apt可以通過HTTPS使用存儲庫(repository):

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

(4) 添加Docker官方的GPG密鑰:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
備註:可驗證祕鑰指紋 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
使用如下命令驗證:
sudo apt-key fingerprint 0EBFCD88

(5) 使用下面的命令來設置stable存儲庫:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

(6) 再更新一下apt包索引:

sudo apt-get update

(7) 安裝最新版本的Docker CE:

sudo apt-get install -y docker-ce
注意:在生產系統上,可能會需要應該安裝一個特定版本的Docker CE,而不是總是使用最新版本:
列出可用的版本:apt-cache madison docker-ce
選擇要安裝的特定版本,第二列是版本字符串,第三列是存儲庫名稱,它指示包來自哪個存儲庫,以及擴展它的穩定性級別。要安裝一個特定的版本,將版本字符串附加到包名中,並通過等號(=)分隔它們:
sudo apt-get install docker-ce=<VERSION>

(8) 測試是否安裝成功

docker --version

(9) 使用阿里提供的鏡像,否則後面下載Fabric鏡像會非常慢
cd到/etc/docker目錄下,創建文件daemon.json,輸入下面的內容:

{
 "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"]
}

保存並退出,接着執行:

sudo systemctl daemon-reload
sudo systemctl restart docker

(10) 查看docker服務是否啓動:

systemctl status docker

(11) 若未啓動,則啓動docker服務:

sudo service docker start或者sudo systemctl start docker

3.安裝最新版本的Docker-compose
(1) Docker-compose是支持通過模板腳本批量創建Docker容器的一個組件。在安裝Docker-Compose之前,需要安裝Python-pip,運行腳本:

sudo apt-get install python-pip

(2) 安裝Docker-compose:

pip install docker-compose

(3) 驗證是否成功:

sudo docker-compose --version

(這部分還可以看下此篇文章https://blog.csdn.net/so5418418/article/details/78355868)

4.Fabric×××
(1) 新建存放測試、部署代碼的目錄。

mkdir -p ~/go/src/github.com/hyperledger/

(2) cd到剛創建的目錄

cd ~/go/src/github.com/hyperledger

(3) 下載Fabric,這裏使用使用git命令下載源碼:

git clone https://github.com/hyperledger/fabric.git

特別注意這裏:
直接使用上面的git clone下載會非常慢,因爲github.global.ssl.fastly.Net域名被限制了。只要找到這個域名對應的ip地址,然後在hosts文件中加上ip–>域名的映射,刷新DNS緩存就可以了。
解決辦法:
步驟【1】:查詢域名global-ssl.fastly.Netgithub.com 公網地址
可以使用https://www.ipaddress.com/ 這個查。
分別查找下面這兩個域名的ip地址:

    github.global.ssl.fastly.net
    github.com

步驟【2】:將ip地址添加到hosts文件

sudo vim /etc/hosts

在文件下方輸入下面內容並保存,前面兩個ip就是我們剛纔上面查找到的ip:

151.101.185.194 github.global.ssl.fastly.net
192.30.253.113 github.com

步驟【3】:修改完hosts還不會立即生效,你需要刷新DNS緩存,告訴電腦我的hosts文件已經修改了。
輸入指令:
sudo /etc/init.d/networking restart 即可,如果不行也可以嘗試重啓一下電腦。
接下來再去git clone就快很多了。

(4) 由於Fabric一直在更新,新版本的並不穩定,所有我們並不需要最新的源碼,需要切換到v1.0.0版本的源碼:

git checkout v1.0.0

5.下載Fabric Docker鏡像
(1) 前面步驟4下載完成後,我們可以看到當前工作目錄(~/go/src/github.com/hyperledger/)下多了一個fabric的文件夾,
接下來我們cd到~/go/src/github.com/hyperledger/fabric/examples/e2e_cli目錄下執行:

source download-dockerimages.sh -c x86_64-1.0.0 -f x86_64-1.0.0 

(注:一定要下載完所有鏡像並且鏡像版本要和Fabric版本一致如何沒有下載問繼續執行source download-dockerimages.sh命令直到在完如圖所有鏡像),執行完所有會用到的Fabric docker鏡像都會下載下來了。
運行以下命令檢查下載的鏡像列表:

docker images

注意:如果下載時遇到權限問題,需要切換到root用戶下:su root
(2) 重啓docker

service docker restart

6.測試Fabric環境是否成功
在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli下執行如下命令啓動測試

./network_setup.sh up

這個指令具體進行了如下操作:

  1. 編譯生成Fabric公私鑰、證書的程序,程序在目錄:fabric/release/linux-amd64/bin
  2. 基於configtx.yaml生成創世區塊和通道相關信息,並保存在channel-artifacts文件夾。基於configtx.yaml生成創世區塊和通道相關信息,並保存在channel-artifacts文件夾。
  3. 基於crypto-config.yaml生成公私鑰和證書信息,並保存在crypto-config文件夾中。基於crypto-config.yaml生成公私鑰和證書信息,並保存在crypto-config文件夾中。
  4. 基於docker-compose-cli.yaml啓動1Orderer+4Peer+1CLI的Fabric容器。基於docker-compose-cli.yaml啓動1Orderer+4Peer+1CLI的Fabric容器。
    在CLI啓動的時候,會運行scripts/script.sh文件,這個腳本文件包含了創建Channel,加入Channel,安裝Example02,運行Example02等功能。

運行完如果出現下圖所示,說明整個Fabric網絡已經通了。
在這裏插入圖片描述

這裏記錄本人測試Fabric環境是否成功時遇到的問題

1. 如果發現運行 ./network_setup.sh up命令 後提示在...fabric/release/linux-amd64/bin文件夾下找不到指定文件
解決辦法
可以在~/go/src/github.com/hyperledger/fabric/scripts文件下找到 bootstrap.1.0.0.sh文件,手動運行它 ./bootstrap.1.0.0.sh, 此時可以在當前文件夾生成一個bin文件夾,bin裏面的文件就是我們需要的,將它拷貝到前面的...fabric/release/linux-amd64/bin文件夾下

2. 如果出現:Error on outputBlock: Error writing genesis block: open ./channel-artifacts/genesis.block: is a directory不能生成創世塊的錯誤。
解決辦法:
可以在~/go/src/github.com/hyperledger/fabric/examples/e2e_cli/channel-artifacts目錄下,將genesis.block這個目錄刪除,rm -rf genesis.block/

3. 如果出現:.ERROR: for orderer.example.com Cannot start service orderer.example.com: b'OCI runtime create failed: container_linux.go:348: starting container process caused "process_linux.go:402: container init caused \"rootfs_linux.go:58:
解決辦法:
執行./network_setup.sh down 清除網絡後再啓動即可

接下來我們手動測試下Fabric網絡:

fabric提供了SDK和CLI兩種交互方式,這裏我們使用的是CLI。
這裏我們使用官方提供的小例子進行測試,在官方例子中,channel名字是mychannel,鏈碼(智能合約)的名字是mycc。
首先要登錄到CLI這個容器中,才能執行Fabric的CLI命令:

docker exec -it cli bash

這時用戶名變爲root@caa22f87a5bf,當前目錄變爲/opt/go/src/github.com/hyperledger/fabric/peer#,接着可執行peer命令,體驗區塊鏈的命令行使用方式。
1.查看a賬戶的餘額

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

此時我們可以看到控制檯輸出有:

Query Result: 90

這裏90就是a賬戶的餘額
2.調用鏈碼,轉賬
這裏我們讓b賬戶向a賬戶轉賬10:

peer chaincode invoke -o orderer.example.com:7050  --tls true --cafile /opt/go/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem  -C mychannel -n mycc -c '{"Args":["invoke","b","a","10"]}'

轉賬成功後,我們可以看到有輸出如下提示:

DEBU 009 ESCC invoke result: version:1 response:<status:200 message:"OK" 

接下來我們使用前面的命令繼續查看a賬戶的餘額,輸出結果如下:

Query Result: 100

很明顯我們已經轉賬成功了。
退出cli容器:
直接執行

exit

最後如果我們要關閉Fabric網絡,cd到~/go/src/github.com/hyperledger/fabric/examples/e2e_cli下(注意這裏的路徑按自己前面創建的,不一定要和我一樣),執行:

./network_setup.sh down

參看鏈接:
https://blog.csdn.net/github_34965845/article/details/80610060
https://www.cnblogs.com/preminem/p/7729497.html
https://www.cnblogs.com/gao90/p/8692642.html
https://blog.csdn.net/so5418418/article/details/78355868
https://blog.csdn.net/iflow/article/details/77951610
https://blog.csdn.net/vivian_ll/article/details/79966210

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章