天天看點

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

    • 1 hyperledger介紹
    • 2 Fabric介紹
    • 3 Fabric的邏輯架構
      • 3.1 身份管理
      • 3.2 賬本管理與交易
        • 3.2.1 賬本管理
        • 3.2.2 交易
      • 3.3 智能合約
    • 4 Fabric開發
    • 5 基礎概念
      • 5.1 節點
        • 5.1.1 用戶端
        • 5.1.2 peer節點
        • 5.1.3 orderer節點
      • 5.2 peer節點、賬本和智能合約之間的關系
    • 5.3 通道(channel)

關于Fabric最完整的資料莫過于其官網上的文檔介紹,英文閱讀能力好的朋友可以去那裡看一下,講的很全面:

https://hyperledger-fabric.readthedocs.io/en/release-1.4/whatis.html

1 hyperledger介紹

比特币是第一個廣為人知的區塊鍊應用。後面一路走紅的基于以太坊和比特币均屬于一類區塊鍊,我将他們歸類為公共許可區塊鍊技術。也就是說該區塊鍊網絡是屬于公共網絡,任何人均可以加入公網進行交易和匿名互動。

後來為了滿足區塊鍊在企業級項目上的應用,Linux基金會與2015年創立了hyperledger項目。之前區塊鍊技術幾乎都是應用在數字加密貨币上,hyperledger項目的創立也是為了實作區塊鍊技術跨行業的轉變。hyperledger擁有一個開發社群,現在已經發展到有超過35個組織和近200個開發人員在維護這個項目。

與前面的比特币和以太坊相比,hyperledger是基于私有網絡,任何參與者必須獲得網絡的許可才可以進入。同時交易确認的延遲非常低,也大大保護了與商業有關的交易和資料的隐私性和機密性。

2 Fabric介紹

hyperleder Fabric是hyperledger中的一個區塊鍊項目。功能上與其他區塊鍊技術一樣,擁有賬本和智能合約。Fabric可以了解為是一個管理私有網絡中所有交易的系統。

概括地講,Fabric具有以下特點:

  1. 具有高度子產品化和可配置的架構,良好地适應跨行業的需求;
  2. Fabric是第一個支援在通用程式設計語言(如Java,Go和Node.js)中建立的智能合約的分布式賬本平台(以太坊的隻能合約隻能用solidity來編寫);
  3. 不需要本地加密貨币的共識協定來激活昂貴的采礦或推動智能合約執行。

3 Fabric的邏輯架構

我畫了一張圖,簡單地概述了以下Fabric的邏輯架構。

Fabric的架夠核心包括三個部分:

  1. 身份管理
  2. 賬本管理與交易
  3. 智能合約

如果裡面有一些詞目不了解也沒有關系,我後面會有講解。

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

3.1 身份管理

為了做到網絡的私有化,hyperledger Fabric提供了成員身份管理服務。該服務用于管理所有私有網絡中的使用者ID并對所有想通路該網絡和做操作的使用者進行身份驗證。例如,沒有注冊的使用者是無法進入網絡以及允許特定ID的使用者調用鍊碼應用程式但不允許其部署新的鍊碼等。

Fabric是目前為止在設計上最貼近聯盟鍊思想的區塊鍊。

在Fabric中,使用者身份大體上可以分為如下幾類:

  1. orderer節點:就是排序節點,功能類似于比特币中的礦工。
  2. peer節點:該節點中擁有賬本,用來存儲資料。
  3. 用戶端程式:用戶端程式可以通路orderer節點和peer節點。同時用戶端程式通路的權限有兩種:管理者權限和普通使用者權限。

3.2 賬本管理與交易

Fabric使用建立在HTTP/2上的P2P協定來管理分布式賬本。采取可插拔的方式來根據具體需求來設定共識協定,比如PBFT,Raft,PoW和PoS等。

Fabric的賬本分為區塊鍊和世界狀态兩個部分。

3.2.1 賬本管理

區塊鍊用來記錄曆史交易,每個區塊記憶體有前區塊和本區塊的哈希值,具有無法篡改的特性。世界狀态指目前賬本的最新狀态,即最近的一個區塊的資訊。它是一個key-value型資料庫。Fabric預設采用levelDB,也可以替換成其他的key-value資料庫,如couchDB(在《Michael.W談hyperledger Fabric第1期-環境搭建》中做環境搭建時,從網絡倉庫中拉取下來的鏡像中就有couchDB的鏡像)。

3.2.2 交易

Fabric上的交易分為兩種:部署交易和調用交易。

部署交易:将鍊碼部署到peer節點上。當一個部署交易被成功執行時,鍊碼就被部署到各個peer節點上。

調用交易:用戶端程式通過Fabric提供的API調用已部署好的某個鍊碼的某個函數來執行交易,并相應地讀取和寫入key-value資料庫。最後傳回執行成功或失敗。

3.3 智能合約

Fabric的隻能合約就是前面我屢次提起的鍊碼(chaincode)。它是一段代碼,用來處理網絡内成員所同意的業務邏輯。

和Ethereum(以太坊)相比,Fabric的鍊碼和底層賬本是分離的。更新鍊碼後并不需要将之前的賬本資料轉移到新的鍊碼中,真正做到了邏輯與資料分離!這個是Ethereum不具備的。

鍊碼可采用通用程式設計語言Node.js、Golang和Java來編寫(最新版本似乎已經不支援Java)。

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

Fabric利用Docker容器來運作鍊碼編譯出的應用程式。一旦鍊碼容器被啟動,它就會通過gPRC與啟動這個鍊碼的peer節點連接配接。

智能合約不僅是封裝資訊并使整個網絡保持簡單的關鍵機制,還可以通過編寫它們以允許參與者某些方面的交易自動執行。

4 Fabric開發

個人看所謂的Fabric開發,其實就是指伺服器端應用程式的開發和用戶端應用程式的開發。

伺服器端:Fabric提供API對服務端的鍊碼進行開發。

用戶端:Fabric目前提供Node.js、Golang SDK,未來計劃支援Python。

對于開發者,還可以通過用戶端快速測試鍊碼或者去查詢交易狀态。在區塊鍊網絡裡,節點和鍊碼會發送events來出發一些監聽動作,友善與其他外部系統的內建。

5 基礎概念

5.1 節點

節點可以分為三類:orderer節點、peer節點和用戶端。

5.1.1 用戶端

用戶端:用戶端的功能就是連接配接peer節點或連接配接orderer節點。用戶端是由使用者來操作的。同時注意,用戶端是沒有賬本的!

5.1.2 peer節點

peer節點:peer節點都擁有賬本,賬本包含兩個東西:交易記錄(區塊鍊)和世界狀态(最近的區塊資訊,key-value鍵值對)。在整個分布式區塊鍊網絡中,分布着很多的peer節點。當其中一個peer節點的資料被修改,這種修改會被自動同步到其他的peer節點。

peer節點在職責上還可以劃分成:背書節點、送出節點、錨節點和主節點。關于這些節點的細節我這裡就不多介紹,在後面我在工程中遇到會給大家解釋。

5.1.3 orderer節點

orderer節點上沒有賬本,相當于礦工這個角色。但是Fabric并不像比特币和以太坊需要礦工去挖礦,orderer節點的實際工作是對資料進行排序并打包。打包後,資料就變成了區塊。之後,orderer節點将資料區塊發送給peer節點,再有peer節點寫入到其賬本中。

那麼至于多少時間打一次包?多少條資料打一次包?或者多大資料量打一個包呢?

這些都是可以在環境變量裡設定的,非常智能。

但是為什麼要排序呢?其實是為了解決“雙花”問題。假如我在同一時間我用手裡的100元錢發起了兩筆交易,一筆買了甲的腎寶,一筆買了乙的枸杞。當這兩條交易資訊到達Fabric網絡時,為了讓系統鑒定出這100元我花了兩次,就令orderer節點對齊排序。即使是做到了同時發起,但是一旦經過排序就會出現前後順序。這樣系統就能識别出來真是兩筆交易,而杜絕了“雙花”的情況産生。

orderer節點的排序算法有兩種:solo和kafka

solo是測試用的,利用一個隊列進行排序,效率很低。kafka是分布式的排序伺服器,效率非常高,屬于企業級。

orderer節點雖然負責排序,但是它并不是排序的最終執行者。它隻是負責調用排序伺服器!

5.2 peer節點、賬本和智能合約之間的關系

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

圖中P為peer節點,S為智能合約,L為賬本。

由圖可知,賬本和智能合約都安裝在peer節點上。賬本是peer節點預設就有的(天生自帶),但是智能合約需要程式員去編寫然後安裝到peer節點上。

當有交易資訊産生時,用戶端調用鍊碼(智能合約),鍊碼修改賬本。

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

由圖可知,一個peer節點上面可以同時存在多個不同的賬本。一個賬本可以對應一個智能合約也可以對應多個智能合約。每個合約可以了解為做一件事(一種業務邏輯),一個賬本對應多個智能合約表示:分别做了不同的幾件事,然後将結果寫入一個賬本中。

一個節點上的不同賬本之間是不可見的,互相隔離!

5.3 通道(channel)

通道是用來隔離資料。使用者在不同的通道中, 使用的資料是不同的。同時資料不共享, 可以将不同的通道了解為不同的微信群!不在同一個群中的人是看不到群内的聊天記錄的。

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

由上圖可知:

  1. 因為peer節點P1和P2屬于同一個通道C,是以他們在該通道内的賬本資料相同(都是L1)。
  2. 雖然圖中P1和P2上安裝的智能合約都是S1,但是實際開發中是允許同一個通道中的節點安裝不同的智能合約。
  3. 用戶端A想連接配接節點P1或P2,就必須連入通道C。即,節點必須在同一通道中才能互相之間進行通信。
  4. 隻要多個peer節點處于同一通道,那麼他們的賬本資料就是保持一緻的,與peer節點上安裝的智能合約是否相同無關。
  5. 假如說這個通道裡還有其他peer節點,P1和P2想進行秘密的通信不想讓通道内的其他節點看到,那麼P1和P2可以自己再建立一個通道,然後在那裡面進行通信。

ps:

本人熱愛圖靈,熱愛中本聰,熱愛V神,熱愛一切被梨花照過的姑娘。

以下是我個人的公衆号,如果有技術問題可以關注我的公衆号來跟我交流。

同時我也會在這個公衆号上每周更新我的原創文章,喜歡的小夥伴或者老夥計可以支援一下!

如果需要轉發,麻煩注明作者。十分感謝!

Michael.W談hyperledger Fabric第2期-關于Fabric你所需要知道的基本知識一

公衆号名稱:後現代潑痞浪漫主義創始者