Fabric基礎架構原理(1):主要元件

買賣虛擬貨幣

本文選自新書《區塊鏈核心技術與應用》,略有刪節,Linux基金會於2015年12月啟動了名為“超級賬本”(HyperLedger)的開源專案,旨在推動各方協作,共同打造基於區塊鏈的企業級分散式賬本底層技術,用於構建支撐業務的行業應用和平臺。

超級賬本里包括10個專案(project),其中區塊鏈框架類專案5個:Fabric,Sawtooth,Iroha,Burrow和Indy;區塊鏈工具類專案5個:Cello,Composer,Explorer, Caliper 和 Quilt 。

Fabric 於 2017 年 7月釋出了1.0 GA版本,並得到社羣較廣泛的使用。本文主要介紹Fabric的總體架構。

Fabric基礎架構

Fabric 專案的目標是實現一個通用的許可權區塊鏈(Permissioned Chain)的底層基礎框架,為了適用於不同的場合,採用模組化架構提供可切換和可擴充套件的元件,包括共識演算法、加密安全、數字資產、智慧合約和身份鑑權等服務。

Fabric 克服了比特幣等公有鏈專案的缺陷,如吞吐量低、交易公開無隱私性、無最終確定性以及共識演算法低效等問題,使得使用者能夠方便地開發商業應用。

另一方面,Fabric 也存在不足之處,如 v1.2 的共識演算法尚不支援 BFT 型別,交易過程還有併發控制的侷限性,整體效能還有待提高等。

主要元件

Fabric 的元件包括客戶端(Client),網路節點(Peer),CA(Certificate Authority)節點和排序節點(Orderer)。各個元件的相互關係如圖所示。

Fabric元件關係

客戶端的主要作用是和 Fabric 系統互動,實現對區塊鏈系統的操作。這些操作分為管理類和鏈碼類的兩種。管理類包括啟停節點和配置網路等;鏈碼類操作主要是鏈碼的生命週期管理,如安裝、例項化以及呼叫鏈碼。最常用的客戶端是命令列客戶端(CLI),此外是用 Fabric SDK 開發的應用客戶端。使用者透過不同的客戶端使用 Fabric 系統的功能。

網路節點(Peer)是區塊鏈去中心化網路中的對等節點,按照功能主要分為背書節點(Endorser)和確認節點(Committer)。背書節點主要對交易預案進行校驗、模擬執行和背書。確認節點主要負責檢驗交易的合法性,並更新和維護區塊鏈資料和賬本狀態。在實際部署中,背書節點和確認節點既可以部署在同一物理節點上,也可以分開部署。

排序節點(Orderer)主要職責是對各個節點發來的交易進行排序。在併發的情況下,各個節點交易的先後時序需要透過排序節點來確定並達成共識。排序節點按照一定規則確定交易順序之後,發給各個節點把交易持久化到區塊鏈的賬本中。排序節點支援互相隔離的多個通道,使得交易只傳送給相關的節點(Peer)。

CA 節點主要給FabriC網路中的成員提供基於數字證書的身份資訊,可以生成或取消成員的身份證書(certificate)。在成員身份明確的基礎上,Fabric可以實現許可權控制的管理。

Fabric 網路的元件往往歸屬於不同的組織,在組織之間形成對等的去中心化網路。每個組織通常擁有自己的客戶端、網路節點和 CA 節點,並且可以根據需要建立一個或多個不同的型別節點。排序節點不屬於某個組織的實體,屬於組織共同維護的元件。

通道

商業應用的一個重要的需求是私密性交易,為此 Fabric 設計了通道(Channel)來提供成員之間的隱私保護。通道是部分網路成員之間擁有獨立的通訊渠道,在通道中傳送的交易只有屬於通道的成員才可見,因此通道可以看作是Fabric的網路中部分成員的私有通訊“子網”。

通道由排序服務管理。在建立通道的時候,需要定義它的成員和組織、錨節點(anchor peer)和排序服務的節點,一條和通道對應的區塊鏈結構也同時生成,用於記錄賬本的交易,通道的初始配置資訊記錄在區塊鏈的創世塊(第一個區塊)中。通道的配置資訊可以用增加一個新的配置區塊來更改。

每個組織可有多個節點加入同一個通道,這些節點中可以指定一個錨節點(或多個錨節點做備份)。錨節點代表本組織與其他組織的節點互動,從而發現通道中的所有節點。另外,同一組織的節點會選舉或指定主導節點( leading peer ),主導節點負責接收從排序服務發來的區塊,然後轉發給本組織的其他節點。主導節點可以透過特定的演算法選出,因此保證了在節點數量不斷變動的情況下仍能維持整個網路的穩定性。

在 Fabric 的網路中,可能同時存在多個彼此隔離的通道,每個通道包含一條私有的區塊鏈和一個私有賬本,通道中可以例項化一個或多個鏈碼,以操作區塊鏈上的資料。由此可見,Fabric 是以通道為基礎的多鏈多賬本系統。

分散式賬本

Fabric 裡的資料以分散式賬本的形式儲存。賬本由一系列有順序和防篡改的記錄組成,記錄包含著資料的全部狀態改變。賬本中的資料項以鍵值對的形式存放,賬本中所有的鍵值對構成了賬本的狀態,也稱為“世界狀態”( World State )。

每個通道中有唯一的賬本,由通道中所有成員共同維護著這個賬本,每個確認節點上都儲存了它所屬通道的賬本的一個副本,因而是分散式賬本。對賬本的訪問需要透過鏈碼實現對賬本鍵值對的增加、刪除、更新和查詢等的操作。

賬本由區塊鏈和狀態資料庫兩部分組成。

區塊鏈是一組不可更改的有序的區塊(資料塊),記錄著全部交易的日誌。每個區塊中包含若干個交易的資料,不同區塊所包含的交易數量可以不同。區塊之間用雜湊鏈( Hashed-link )關聯:每個區塊頭包含該區塊所有交易的雜湊值,以及上一個區塊頭的雜湊值。這樣的鏈式架構可以確保每個區塊的資料不可更改,以及每個區塊之間的順序關係不可更改。這個特點決定了區塊鏈的區塊只可以新增在鏈的尾部。

狀態資料庫記錄了賬本中所有鍵值對的當前值,相當於對當前賬本的交易日誌做了索引。鏈碼執行交易的時候需要讀取賬本的當前狀態,從狀態資料庫可以迅速獲取鍵值的最新狀態。

如果沒有狀態資料庫,要獲得某個鍵值時,需要遍歷整個區塊鏈中和該鍵值相關的交易,效率非常低,因此,讀取狀態資料庫可以認為是快速定位和訪問某個鍵值的方法。另外,當狀態資料庫出現故障的時候,可以透過遍歷賬本重新生成。

當一個區塊附加到區塊鏈尾部的時候,如果區塊中的有效交易修改了鍵值對,則會在狀態資料庫中作相應的更新,這樣區塊鏈和狀態資料庫始終保持一致。

區塊鏈的資料塊以檔案形式儲存在各個節點中。狀態資料庫原理上可以是各種鍵值資料庫,Fabric 預設使用的是 LevelDB ,也支援 CouchDB 的選項。CouchDB 除了支援鍵值資料之外,也支援 JSON 格式的文件模型,能夠做複雜的查詢。

(未完待續)

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;