《區塊鏈底層設計Java實戰》之第二章區塊鏈架構
第2 章 區塊鏈架構
會當凌絕頂 一覽眾山小
正如開篇所言:會當凌絕頂,一覽眾山小。進入區塊鏈底層開發前,我們需要
瞭解區塊鏈底層的通用架構是如何設計的,從上而下地審視區塊鏈底層的結構,做
到了然於胸,才能胸有成竹。
他山之石,可以攻玉。在介紹區塊鏈底層通用架構之前,我們不妨先從比特幣、
以太坊、Hyperledger 的架構解讀開始。
2.1 比特幣架構
根據中本聰的論文“Bitcoin: A Peer-to-Peer Electronic Cash System”中對比特幣
系統的描述,我們可以整理出如圖2-1 所示的比特幣系統架構。
圖2-1 比特幣系統架構
如圖2-1 所示,比特幣系統分為6 層,由下至上依次是儲存層、資料層、網路層、
共識層、RPC 層、應用層。
其中,儲存層主要用於儲存比特幣系統執行中的日誌資料及區塊鏈元資料,存
儲技術主要使用檔案系統和LevelDB。
資料層主要用於處理比特幣交易中的各類資料,如將資料打包成區塊,將區塊
維護成鏈式結構,區塊中內容的加密與雜湊計算,區塊內容的數字簽名及增加時間
戳印記,將交易資料構建成Merkle 樹,並計算Merkle 樹根節點的雜湊值等。
區塊構成的鏈有可能分叉,在比特幣系統中,節點始終都將最長的鏈條視為正
確的鏈條,並持續在其後增加新的區塊。
網路層用於構建比特幣底層的P2P 網路,支援多節點動態加入和離開,對網路
連線進行有效管理,為比特幣資料傳輸和共識達成提供基礎網路支援服務。
共識層主要採用了PoW(Proof Of Work)共識演算法。在比特幣系統中,每個節
點都不斷地計算一個隨機數(Nonce),直到找到符合要求的隨機數為止。在一定
的時間段內,第一個找到符合條件的隨機數將得到打包區塊的權利,這構建了一
個工作量證明機制。從PoW 的角度,是不是發現PoW 和分散式鎖有異曲同工之
妙呢?
RPC 層實現了RPC 服務,並提供JSON API 供客戶端訪問區塊鏈底層服務。
應用層主要承載各種比特幣的應用,如比特幣開原始碼中提供了bitcoin client。
該層主要是作為RPC 客戶端,通過JSON API 與bitcoin 底層互動。除此之外,位元
幣錢包及衍生應用都架設在應用層上。
2.2 以太坊架構
根據以太坊白皮書A Next-Generation Smart Contract and Decentralized
Application Platform 的描述,以太坊架構如圖2-2 所示。
如圖2-2 所示,以太坊架構分為7 層,由下至上依次是儲存層、資料層、網路層、
協議層、共識層、合約層、應用層。
其中儲存層主要用於儲存以太坊系統執行中的日誌資料及區塊鏈元資料,儲存
技術主要使用檔案系統和LevelDB。
資料層主要用於處理以太坊交易中的各類資料,如將資料打包成區塊,將區塊
維護成鏈式結構,區塊中內容的加密與雜湊計算,區塊內容的數字簽名及增加時間
戳印記,將交易資料構建成Merkle 樹,並計算Merkle 樹根節點的hash 值等。
與比特幣的不同之處在於以太坊引入了交易和交易池的概念。交易指的是一個
賬戶向另一個賬戶傳送被簽名的資料包的過程。而交易池則存放通過節點驗證的交
易,這些交易會放在礦工挖出的新區塊裡。
以太坊的Event(事件)指的是和以太坊虛擬機器提供的日誌介面,當事件被呼叫
時,對應的日誌資訊被儲存在日誌檔案中。
與比特幣一樣,以太坊的系統也是基於P2P 網路的,在網路中每個節點既有客
戶端角色,又有服務端角色。
協議層是以太坊提供的供系統各模組相互呼叫的協議支援,主要有HTTP、RPC
協議、LES、ETH 協議、Whipser 協議等。
以太坊基於HTTP Client 實現了對HTTP 的支援,實現了GET、POST 等HTTP
方法。外部程式通過JSON RPC 呼叫以太坊的API 時需通過RPC(遠端過程呼叫)
協議。
Whisper 協議用於DApp 間通訊。
LES 的全稱是輕量級以太坊子協議(Light Ethereum Sub-protocol),允許以太坊
節點同步獲取區塊時僅下載區塊的頭部,在需要時再獲取區塊的其他部分。
共識層在以太坊系統中有PoW(Proof of Work)和PoS(Proof of Stake)兩種共
識演算法。
合約層分為兩層,底層是EVM(Ethereum Virtual Machine,即以太坊虛擬機器),
上層的智慧合約執行在EVM 中。智慧合約是執行在以太坊上的程式碼的統稱,一個智
能合約往往包含資料和程式碼兩部分。智慧合約系統將約定或合同程式碼化,由特定事
件驅動觸發執行。因此,在原理上適用於對安全性、信任性、長期性的約定或合同
場景。在以太坊系統中,智慧合約的預設程式語言是Solidity,一般學過 JavaScript
語言的讀者很容易上手Solidity。
應用層有DApp(Decentralized Application,分散式應用)、以太坊錢包等多種衍
生應用,是目前開發者最活躍的一層。
2.3 Hyperledger 架構
超級賬本(Hyperledger)是Linux 基金會於2015 年發起的推進區塊鏈數字技術
和交易驗證的開源專案,該專案的目標是推進區塊鏈及分散式記賬系統的跨行業發
展與協作。
目前該專案最著名的子專案是Fabric,由IBM 主導開發。按官方網站描述,
Hyperledger Fabric 是分散式記賬解決方案的平臺,以模組化體系結構為基礎,提供
高度的彈性、靈活性和可擴充套件性。它旨在支援不同元件的可插拔實現,並適應整個
經濟生態系統中存在的複雜性。
Hyperledger Fabric 提供了一種獨特的彈性和可擴充套件的體系結構,使其不同於其
他區塊鏈解決方案。我們必須在經過充分審查的開源架構之上對區塊鏈企業的未來
進行規劃。超級賬本是企業級應用快速構建的起點。
目前,Hyperledger Fabric 經歷了兩大版本架構的迭代,分別是0.6 版和1.0 版。
其中,0.6 版的架構相對簡單,Peer 節點集眾多功能於一身,模組化和可拓展性較差。
1.0 版對0.6 版的Peer 節點功能進行了模組化分解。目前最新的1.1 版本處於Alpha
階段。
在1.0 版中,Peer 節點可分為peers 節點和orderers 節點。peers 節點用於維護狀
態(State)和賬本(Ledger),orderers 節點負責對賬本中的各條交易達成共識。
系統中還引入了認證節點(Endorsing Peers),認證節點是一類特殊的peers 節點,
負責同時執行鏈碼(Chaincode)和交易的認證(Endorsing Transactions)。
Hyperledger Fabric 的分層架構設計如圖2-3 所示。
Hyperledger Fabric 可以分為7 層,分別是儲存層、資料層、通道層、網路層、
共識層、合約層、應用層。
其中儲存層主要對賬本和交易狀態進行儲存。賬本狀態儲存在資料庫中,儲存
的內容是所有交易過程中出現的鍵值對資訊。比如,在交易處理過程中,呼叫鏈碼
執行交易可以改變狀態資料。狀態儲存的資料庫可以使用 LevelDB 或者 CouchDB。
LevelDB 是系統預設的內建的資料庫,CouchDB 是可選的第三方資料庫。區塊鏈的
賬本則在檔案系統中儲存。
資料層主要由交易(Transaction)、狀態(State)和賬本(Ledger)三部分組成。
其中,交易有兩種型別:
部署交易:以程式作為引數來建立新的交易。部署交易成功執行後, 鏈碼就
被安裝到區塊鏈上。
呼叫交易:在上一步部署好的鏈碼上執行操作。鏈碼執行特定的函式,這
個函式可能會修改狀態資料,並返回結果。
狀態對應了交易資料的變化。在Hyperledger Fabric 中,區塊鏈的狀態是版本化
的,用 key/value store(KVS)表示。其中key 是名字,value 是任意的文字內容,版
本號標識這條記錄的版本。這些資料內容由鏈碼通過PUT 和GET 操作來管理。如存
儲層的描述,狀態是持久化儲存到資料庫的,對狀態的更新是被檔案系統記錄的。
賬本提供了所有成功狀態資料的改變及不成功的嘗試改變的歷史。
賬本是由Ordering Service 構建的一個完全有序的交易塊組成的區塊雜湊鏈
(Hash Chain)。
賬本既可以儲存在所有的peers 節點上,又可以選擇儲存在幾個orderers 節點上。
此外,賬本允許重做所有交易的歷史記錄,並且重建狀態資料。
通道層指的是通道(Channel),通道是一種Hyperledger Fabric 資料隔離機制,
用於保證交易資訊只有交易參與方可見。每個通道都是一個獨立的區塊鏈,因此多
個使用者可以共用同一個區塊鏈系統,而不用擔心資訊洩漏問題。
網路層用於給區塊鏈網路中各個通訊節點提供P2P 網路支援,是保障區塊鏈賬
本一致性的基礎服務之一。
在Hyperledger Fabric 中,Node 是區塊鏈的通訊實體。Node 僅僅是一個邏輯上
的功能,多個不同型別的Node 可以執行在同一個物理伺服器中。Node 有三種類型,
分別是客戶端、peers 節點和Ordering Service。
其中,客戶端用於把使用者的交易請求傳送到區塊鏈網路中。
peers 節點負責維護區塊鏈賬本,peers 節點可以分為endoring peers 和committing
peers 兩種。endoring peers 為交易作認證,認證的邏輯包含驗證交易的有效性,並對
交易進行簽名;committing peers 接收打包好的區塊,並寫入區塊鏈中。與Node 類似,
peers 節點也是邏輯概念,endoring peers 和committing peers 可以同時部署在一臺物
理機上。
Ordering Service 會接收交易資訊,並將其排序後打包成區塊,然後,寫入區塊
鏈中,最後將結果返回給committing peers。
共識層基於Kafka、SBTF 等共識演算法實現。Hyperledger Fabric 利用Kafka 對交
易資訊進行排序處理,提供高吞吐、低延時的處理能力,並且在叢集內部支援節點
故障容錯。相比於Kafka,SBFT(簡單拜占庭演算法)能提供更加可靠的排序演算法,
包括容忍節點故障以及一定數量的惡意節點。
合約層是Hyperledger Fabric 的智慧合約層Blockchain,Blockchain 預設由Go 語
言實現。Blockchain 執行的程式叫作鏈碼,持有狀態和賬本資料,並負責執行交易。
在Hyperledger Fabric 中,只有被認可的交易才能被提交。而交易是對鏈碼上的操作
的呼叫,因此鏈碼是核心內容。同時還有一類稱之為系統鏈碼的特殊鏈碼,用於管
理函式和引數。
應用層是Hyperledger Fabric 的各個應用程式。
此外,既然是聯盟鏈,在Hyperledger Fabric 中還有一個模組專門用於對聯盟內
的成員進行管理,即Membership Service Provider(MSP),MSP 用於管理成員認證
資訊,為客戶端和peers 節點提供成員授權服務。