文章目錄
- 摘要
- 一、Fabric環境搭建
- 1.1 安裝docker
- 1.2 安裝go
- 1.3 安裝Node.js
- 1.4 部署hyperledger Fabric
- 二、Fabric的概念
- 2.1 邏輯架構
- 2.2 Fabric基礎概念
- 2.3、Fabric交易流程
- 三、基于Fabric的區塊鏈系統開發(未完)
- 總結
摘要
位元幣和以太坊都是公鏈,鏈中存盤的資料任何人都可查詢,不適合用來做對隱私有較高要求的企業開發,且其都用了作業量證明機制,能耗成本很高,資料存盤效率低(尤其是位元幣,大約每10分鐘生成一個新塊),Fabric引入了證書頒發機構和通道的概念,使得不被授權的用戶無法訪問鏈中資料,保證了資料的隱私性,Fabric還采用背書策略代替了作業量證明機制,在保證資料安全的同時,消除了"挖礦"的能耗,提高了存盤效率,本文基于Fabric進行區塊鏈的系統開發,詳述了在linux作業系統(Unbuntu)上Fabric環境的搭建、Fabric的基本概念、用Fabric開發區塊鏈系統(未完),
在總結處細述了Fabric的一個交易提案是如何一步步部署到區塊鏈上的,
一、Fabric環境搭建
1. 官方幫助檔案:https://hyperledger-fabric.readthedocs.io/en/release-1.2/
2. 安裝 cURL( https://curl.haxx.se/download.html ), curl --version 查詢版本
3. 安裝docker, docker --version 查詢版本
4. 安裝docker-compose, docker-compose --version 查詢版本
5. 安裝 go 語言環境, go version 查詢版本
6. 安裝node.js, node -v 查詢版本
7. Python 版本要求為 2.7, python --version 查詢版本
1.1 安裝docker
- 基礎軟體安裝
# 安裝基本軟體
$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl git software- properties-common lrzsz -y
- 添加阿里的docker鏡像倉庫
# 添加阿里的docker鏡像倉庫
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker- ce/linux/ubuntu $(lsb_release -cs) stable"
# 更新軟體源
$ sudo apt-get update
- 安裝docker
# 安裝docker
$ sudo apt-get install docker-ce -y
# 查看安裝的docker版本
$ docker version
# 當前用戶直接操作docker時, 權限不夠,
需要做下面的第4步操作
- 將當前用戶添加到docker組
# 將用戶加入該 group 內,然后退出并重新登錄就生效啦, $ sudo gpasswd -a ${USER} docker
# 重啟docker服務
$ systemctl restart docker
# 當前用戶切換到docker群組
$ newgrp - docker
$ docker version
1.2 安裝go
下載地址:
https://golang.org/dl/ - 翻墻 https://studygolang.com/dl - 國內鏡像源
如果沒有進行安裝包下載, 可直接使用如下命令(目前最新版本):
# 1. 使用wget工具下載安裝包
$ wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
# 2. 解壓tar包到/usr/local
$ sudo tar zxvf go1.11.linux-amd64.tar.gz -C /usr/local
# 3. 創建Go目錄
$ mkdir $HOME/go
# 4. 用vi打開~./bashrc,配置環境變數
$ vim ~/.bashrc
# 5. 增加下面的環境變數,保存退出
export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
# 6. 使環境變數立即生效, 一些命令二選一
$ source ~/.bashrc $ . ~/.bashrc
# 7. 檢測go是否安裝好
$ go version
1.3 安裝Node.js
#安裝包
sudo apt-get install nodejs
1.4 部署hyperledger Fabric
- 下載并執行fabric的引導腳本bootstrap.sh
# 創建放置的目錄,然后進入該目錄,用curl下載腳本,
$ cd ~ # 這里在家目錄下創建放置目錄
$ mkdir hyperledger-fabric
# 創建放置目錄
$ cd hyperledger-fabric
#不翻墻的安裝命令
$ curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.2.0 1.2.0 0.4.10
運行./bash.sh up出現 "Error: error getting endorser client for channel: endorser client failed to connect to peer0 "時,.
二、Fabric的概念
2.1 邏輯架構

身份管理 (Fabric中的“賬戶”體系.)
- 成員服務
- 注冊登錄和屬性證書:首先用戶填寫資訊(身份資訊等)生成證書明文F發送注冊請求,證書頒發機構CA對明文進行摘要(進行一次hash運算)得到h1,CA用自己的私鑰對h1進行加密得到密文F ',驗證證書時,用CA公鑰對F '解密得到h2,比較h2是否等于h1,(Hyperledger Fabric注冊及CA證書頒發.)
賬本管理
- 區塊鏈:區塊鏈中存盤著所有的交易記錄,
- 世界狀態:根據區塊鏈中的交易記錄得到的資料狀態,每當有一個新區塊生成時,世界狀態也隨之更新,每個節點的世界狀態都存在其節點的資料庫中,
交易管理
- 客戶端發送某一型別提案,根據提案型別對應的背書測略,指定對應的背書節點peer,背書節點peer執行鏈碼,如果成功則生成實際賬本,當一定數量的背書節點認可該提案后,該提案通過排序節點廣播給所有節點,每個節點驗證并執行該提案,從而更新賬本,(深入理解Fabric的交易背書)
智能合約
- 智能合約是用來進行業務邏輯操作的代碼,在docker容器中運行,和以太坊相比,Fabric的智能合約和底層賬本是分開的,升級鏈碼并不需要將賬本遷移到新的區塊鏈上,真正實作了邏輯與資料的分離,(Fabric的智能合約詳解)
2.2 Fabric基礎概念
(Fabric基本概念—很好的文章)
組織
- fabric系統是通過組織來劃分的,每個組織內都有承擔不同功能的peer節點,同時每個組織都有自己對應的fabric-ca服務器,fabric系統中所有的組織共用一個orderer集群,fabric中的組織在現實世界中可以是一個公司、一個企業,或者一個協會,在fabric中,組織是承擔著資料信用責任的區塊鏈系統參與方,在設計一個fabric系統時,第一步就是要確定系統的參與方,然后從這些參與者中選出組織(生成對應的組織編號、域名、證書等),然后再確認組織的管理方式,組織的管理方式是指組織在遇到問題時的協作方式(如新組織的加入),
通道(Channel)
- fabric的資料存盤結構被設計成多賬本體系,每個賬本在fabric中被稱為channel,每個channel中都有一個完全獨立的賬本,同一個channel中的所有peer節點都保存一份相同的資料,
通道由成員(組織)、每個成員的錨節點、賬本、鏈碼應用程式和排序服務節點定義,網路上的每個交易都是在一個通道上執行的,在該通道上,每一方都必須經過身份驗證和授權才能在該通道上進行交易,加入通道的每一個peer都有其自己的身份,由成員服務提供者(MSP)提供,
賬本
- Fabric有一個賬本子系統包含兩個組件:世界狀態和交易日志,世界狀態是代表當前資料的狀態,交易日志組件存放在資料庫中,它記錄了所有的交易記錄,世界狀態是根據交易日志得到的,
世界狀態中有一個屬性——版本號,版本號從0開始,每當狀態更新時版本號就遞增,狀態更新時會首先檢查版本號,以確保當前狀態的版本與背書時的版本一致(避免并發更新),
節點(peer)
是區塊鏈的通信物體,是一個邏輯概念,不同型別的多個節點可以運行在同一個物理服務器上,節點主要有以下四種:
-
客戶端節點:客戶端必須連接到某一個peer節點或排序服務節點上才能與區塊鏈網路進行通信,客戶端向背書節點(endorser)提交交易提案(transaction proposal),當收集到足夠背書后,向排序服務節點廣播交易提案,進行排序,生成區塊,
-
普通節點peer:peer節點根據所承擔的角色又可以分為記賬節點(committer)、背書節點(endorser)、主節點(leader)和錨節點(anchor),
- 記賬節點:所有的peer節點都是記賬節點(committer),負責驗證排序服務節點區塊里的交易,維護狀態和總賬(Ledger)的副本,該節點會定期從orderer節點獲取包含交易的區塊,在對這些區塊進行核發驗證之后,會把這些區塊加入到區塊鏈中,committer節點無法通過組態檔配置,需要在當前客戶端或者命令列發起交易請求的時候手動指定相關的committer節點,記賬節點可以有多個,
- 背書節點:部分節點還會執行交易并對結果進行簽名背書,充當背書節點(endorser)的角色,背書節點是動態的角色,是與具體鏈碼系結的,每個鏈碼在實體化的時候都會設定背書策略,指定哪些節點對交易背書后交易才是有效的,并且只有應用程式向它發起交易背書請求的時候才是背書節點,其他時候都是普通的記賬節點,只負責驗證交易并記賬,背書節點也無法通過組態檔指定,而是由發起交易請求的客戶端指定,背書節點可以有多個,
- 錨節點:peer節點還可以是錨節點(anchor peer),錨節點主要負責代表組織和其他組織進行資訊交換,每個組織都有一個錨節點,錨節點對于組織來說非常重要,如果錨節點出現問題,當前組織就會與其他組織失去聯系,錨節點的配置資訊是在configtxgen模塊的組態檔configtx.yaml中配置的,錨節點只能有一個,
- 主節點:peer節點還可以是主節點(leader peer),能與排序服務節點通信,負責從排序服務節點獲取最新的區塊并在組織內部同步,主節點在整個組織中只能有一個,
-
排序服務節點orderer:接收包含背書簽名的交易,對未打包的交易進行排序生成區塊,廣播給peer節點,排序服務提供的是原子廣播,保證同一個鏈上的節點接收到相同的資訊,并且有相同的邏輯順序,
-
CA節點:fabric1.0的證書頒發機構,由服務器和客戶端組成,CA節點接收客戶端的注冊申請,回傳注冊密碼用于用戶登錄,以便獲取身份證書,區塊鏈上的所有操作都需要驗證用戶身份,
區塊結構
- 由三個部分組成,分別是區塊頭、區塊資料和區塊元資料,
- 區塊頭包含三個屬性(區塊號、當前區塊哈希、前一個區塊的哈希),當一個區塊被創建時寫入,
- 區塊資料包含的是排序后的交易串列,當區塊被ordering service創建時寫入,
- 區塊元資料包括區塊的寫入時間,以及區塊寫入者的證書、公鑰和簽名,
2.3、Fabric交易流程
前提假設是各節點已經提前頒發好證書,且已正常啟動,并加入已經創建好的通道,此流程介紹的是在已經實體化了的鏈碼通道上從發起一個呼叫交易到最終結賬的全程序,
-
提交交易提案
應用程式(客戶端節點)構造好交易提案(交易提案中包含本次交易要呼叫的合約標識、合約方法和引數資訊以及客戶端簽名等)請求后,根據背書策略選擇背書節點執行交易提案并進行背書簽名,背書節點是鏈代碼中背書策略指定的節點,正常情況下背書節點執行后的結果是一致的,只有背書節點對結果的簽名不一樣, -
模擬執行提案并進行背書
背書節點在收到交易提案后會進行一些驗證,驗證通過后,背書節點會根據當前賬本資料模擬執行鏈碼中的業務邏輯并生成讀寫集(RwSet),模擬執行時不會更新賬本資料,然后背書節點對這些讀寫集進行簽名生成提案回應(proposal response),然后回傳給應用程式, -
收集交易的背書(回傳模擬執行結果)
應用程式收到proposal response后會對背書節點的簽名進行驗證(所有節點接收到任何訊息時都需要先驗證訊息的合法性),如果鏈碼只進行賬本查詢操作,應用程式只需要檢查查詢回應,并不會將交易提交給排序服務節點,如果鏈碼對賬本進行了invoke操作,則需要提交交易給排序服務進行賬本更新(提交前會判斷背書策略是否滿足), -
構造交易請求并發送給排序服務節點
應用程式接收到所有背書節點的簽名后,根據背書簽名呼叫SDK生成交易,并廣播給排序服務節點,其中生成交易的程序很簡單,只需要確認所有背書節點的執行結果完全一致,再將交易提案、提案回應和背書簽名打包生成交易即可, -
排序服務節點對交易進行排序并生成區塊
排序服務節點接收到網路中所有通道發出的交易資訊,讀取交易信封獲取通道名稱,按各個通道上交易的接收時間順序對交易資訊進行排序(多通道隔離),生成區塊,(在這個程序中,排序服務節點不會關心交易是否正確,只是負責排序和打包,交易的有效性在第7步進行驗證)
-
排序服務節點廣播區塊給主節點
排序服務節點生成區塊后會廣播給通道上不同組織的主節點,
-
記賬節點驗證區塊內容并寫入到賬本
所有的peer節點都是記賬節點,記錄的是節點已加入通道的賬本資料,記賬節點接收到的排序服務節點生成的區塊后,會驗證區塊交易的有效性,然后提交到本地賬本并產生一個生成區塊的事件,監聽區塊事件的應用程式會進行后續的處理,(如果接收的是配置區塊,則會更新快取的配置資訊)
-
主節點在組織內部同步最新的區塊
如果交易是無效的,也會更新區塊,但不會更新世界狀態,(區塊存盤的是操作陳述句,而世界狀態存盤的是被處理的資料,
三、基于Fabric的區塊鏈系統開發(未完)
目前開發是準備先做一個簡單的系統,在該系統中有一個排序節點,2個組織,每個組織中分別有3個Peer節點和2個用戶,系統還未完成,就只展示目前的進度,不詳述了,

總結
客戶端節點發送交易提案(proposal),根據該型別提案對應的背書策略,指定對應的背書節點,背書節點收到提案請求后,會根據當前賬本資料,模擬執行鏈碼中的業務邏輯,生成一個讀寫集(RwSet),然后背書節點對讀寫集進行簽名生成提案回應(proposal response)并回傳給客戶端節點,客戶端收到一定數量正的提案回應后,便會將該交易發送給排序節點,排序節點收到所有通道發出的交易資訊,按其發送時間對其進行排序(多通道隔離),生成區塊,將其廣播給各個通道的主節點,記賬節點對生成的區塊中的資料進行校驗,然后將其提交到本地賬本,更新區塊鏈賬本和世界狀態,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333410.html
標籤:區塊鏈
