目前區塊鏈技術架構均源自比特幣的底層技術,從最早在區塊鏈技術引入圖靈完備的智慧合約的以太坊,到廣泛用於聯盟鏈的Hyperledger Fabric,從多執行緒架構的EOS,再到同構多鏈架構的迅雷鏈,儘管它們在具體實現上各有不同,但在整體架構上卻存在很多共同的特點。如下圖所示,區塊鏈平臺整體上可劃分為6個層次:資料層、網路層、共識層、合約層、應用層、介面層,另外通常還有客戶端為使用者提供訪問介面。
2.1. 資料層
常見的區塊鏈儲存方式有:檔案儲存、關係型資料庫(如MySQL)和非關係型資料庫(如LevelDB)。需要儲存的資料包括公共資料(例如:交易資料、事務資料、狀態資料等)和本地的私有資料等。
區塊鏈的帶時間戳的雜湊鏈式結構借鑑了Scott Stornetta和Stuart Haber在90年代提出的“加密數字時間戳”的發明,他們設計了基於文件時間戳的數字公證服務以證明各類電子文件的建立時間,基本方案是使用時間戳服務對新建文件的時間及之前的文件的雜湊指標進行簽名,形成一個基於時間戳的簽名鏈,鏈中的時間戳無法篡改;此外他們還提出用Merkle樹組織文件等方案。他們最初的設計需要一個第三方信任機構的存在,要求信任一個外部渠道,但這樣的第三方信任機構仍然可以篡改記錄。他們無法解決這個問題,因此他們決定去證明人們無法解決這個問題。Stornetta在訪談中說到:“有趣的是,最終在證明我們無法解決這個問題的過程中,我們找到了如何去解決問題的方法。最根本的解決辦法是——既然我們始終要去信任某個人或者機構來確保數字文件的準確性,那就去信任每一個人,也就是說,讓世界上的每一個人都是數字文件記錄的見證者。……我們設想去構建一個網路,能夠讓所有的數字記錄在被創造的時候就傳輸到每一個使用者那裡,這樣就沒有人可以篡改這個記錄。這就是最早區塊鏈概念的誕生。”
區塊鏈中,每個區塊包含區塊頭和區塊體兩部分,區塊體存放交易資料,區塊頭存放Merkle根、前塊雜湊、時間戳等資料。基於塊內交易資料雜湊生成的Merkle根實現了塊內交易資料的不可篡改性與簡單支付驗證; 基於前一區塊內容生成的前塊雜湊將孤立的區塊連結在一起,形成了區塊鏈;時間戳表明了該區塊的生成時間。
在資料模型的設計上,比特幣首創了基於交易的資料模型,簡稱UTXO(Unspent Transaction Output,未花費交易輸出),每筆交易由表明交易來源的輸入和表明交易去向的輸出組成,所有交易透過輸入與輸出連結在一起,使得每一筆交易都可追溯;以太坊與Hyperledger Fabric需要支援功能豐富的通用應用,因此採用了基於賬戶的模型,可基於賬戶快速查詢到當前餘額或狀態。
2.2. 網路層
網路層負責節點間通訊,包括網路節點發現、資料收發等功能。區塊鏈系統由眾多節點透過網路連線構成, 特別是在公有鏈系統中,節點數量往往很大。因此,區塊鏈平臺通常選擇完全分散式且可容忍單點故障的P2P協議作為網路傳輸協議,任何時刻每個節點也可自由加入或退出網路,每個節點需要透過網路發現協議發現鄰居節點,並與鄰居節點建立鏈路,網路節點具有平等、自治、分佈等特性,所有節點以扁平拓撲結構相互連通,不存在任何中心化的權威節點和層級結構,每個節點均擁有路由發現、廣播交易、廣播區塊、發現新節點等功能。
比特幣的P2P網路基於TCP協議實現,節點發現使用DNS種子節點(DNS-seed),比特幣社羣維護著一些域名用於節點發現,此外還硬編碼一些seed-node,當所有的種子節點全失效時,全節點會嘗試連線這些種子節點。
以太坊的P2P網路採用了 Kademlia(簡稱 Kad) 演算法實現,所以以太坊節點的節點發現是基於 UDP 的,找到節點以後會切換到 TCP 協議上進行資料傳輸。
Hyperledger Fabric是用gRPC來做P2P通訊的,而gRPC又基於HTTP/2,因此也可以說Hyperledger Fabric是基於HTTP/2協議的。
比特幣和以太坊均使用了 UPnP (Universal Plug and Play)協議做NAT穿透,而Hyperledger Fabric是主要面向聯盟鏈和私有鏈場景,不支援NAT穿透。
2.3. 共識層
共識層執行某種共識演算法,負責協調保證全網節點資料記錄的一致性。
在中心化的分散式系統中,所有節點都由單一機構管理維護,可以認為所有節點都是可信的,共識演算法只需支援崩潰容錯(Crash Fault-Tolerant, CFT)的情況。CFT已有一些經典的解決演算法,包括Paxos、Raft及其變種等。
對於去中心化的區塊鏈系統,其網路節點可由任何一方提供 ,部分節點可能是惡意節點,因此需要支援拜占庭容錯(Byzantine Fault Tolerance, BFT)。區塊鏈常用的BFT容錯的共識演算法有工作量證明演算法(Proof of Work, PoW)、權益證明演算法(Proof of Stake, PoS)和委託權益證明演算法(Delegated Proof of Stake, DPoS)、實用拜占庭容錯(Practical Byzantine Fault Tolerance , PBFT)等。根據演算法採取的策略,BFT類演算法可以被分為兩大類,即概率一致性演算法和絕對一致性演算法。其中PoW、PoS、DPoS是概率一致性演算法,PBFT是絕對一致性演算法。
比特幣和以太坊採用PoW機制,Hyperledger Fabric採用PBFT演算法。
2.4. 合約層
合約層負責智慧合約的執行。智慧合約(Smart Contract)是一段在區塊鏈上儲存、驗證和執行的程式碼。
智慧合約的概念早在1994由密碼學家Nick Szabo年提出,但由於缺少可信的執行環境,智慧合約並沒有被應用到實際產業中。比特幣誕生後,人們認識到比特幣的底層技術區塊鏈天生可以為智慧合約提供可信的執行環境。
將合約以數字化的形式寫入區塊鏈中,因區塊鏈的特性,資料將無法刪除、修改,只能新增,整個過程透明可跟蹤,保證了歷史的可追溯性; 因行為將被永久記錄,可極大程度避免惡意行為對合約正常執行的干擾;區塊鏈的去中心化特性,避免了中心化因素的影響,提高智慧合約在成本效率方面的優勢;當滿足合約內容時,將自動啟動智慧合約的程式碼,既避免了手動過程,同時又保障了發行者無法違約;由區塊鏈自帶的共識演算法構建出一套狀態機系統,使得智慧合約能夠安全、高效地執行,並保證結果可信任。
比特幣指令碼是非圖靈完備的,指令型別簡單、實現功能有限;以太坊首先提供了圖靈完備的智慧合約程式語言Solidity與執行環境EVM(Ethereum Virtual Machine);Hyperledger Fabric的智慧合約稱為chaincode,其執行在docker容器中,可以用go與java等通用程式語言編寫智慧合約。
2.5. 應用層
應用層負責適配區塊鏈的各類應用場景,為使用者提供各種服務和應用。
比特幣平臺上的應用主要是基於比特幣的資料貨幣的發行和流通。以太坊以圖靈完備的智慧合約為基礎,除了數字貨幣交易外,還支援去中心化應用(Decentralized Application, Dapp), Dapp是由javascript構建的Web前端應用,透過Json-RPC與執行在以太坊節點上的智慧合約進行通訊。Hyperledger Fabric主要面向聯盟鏈和私有鏈應用,並沒有提供數字貨幣,基於其docker的智慧合約可實現包括數字貨幣在內的各種業務應用。
2.6. 介面層
介面層用於完成功能模組的封裝,為客戶端應用提供簡潔的訪問介面。
比特幣節點提供了基於JSON RPC介面,可供應用開發者使用各種開發語言例如JavaScript、Java、Python等訪問比特幣系統,包括訪問區塊和交易資訊、節點控制、網路相關、交易發起等功能。
以太坊為客戶端提供JSON RPC介面,客戶端可以使用go、python、javascript等程式語言與區塊鏈服務的RPC埠進行通訊。其中,go語言可以直接使用go-ethereum專案的rpc庫與以太坊通訊、python語言有web3.py庫、javascript語言下有web3.js庫。web3庫是以太坊提供的一個對JSON RPC介面的封裝庫,提供了一系列與區塊鏈互動的物件和函式,包括檢視網路狀態,檢視本地賬戶、檢視交易和區塊、傳送交易、編譯/部署智慧合約、呼叫智慧合約等,其中最重要的就是與智慧合約互動的API。
Hyperledger Fabric提供gRPC或REST介面,客戶端可基於Go、Java、Python等語言構建,並與Hyperledger Fabric節點上的智慧合約通訊
2.7. 客戶端
客戶端為使用者提供友好易操作的訪問介面。比特幣和以太坊都存在多平臺、多樣化的客戶端,第三方客戶端的開發非常活躍。
3. 3層劃分模型
以太坊社羣在可擴充套件性問題的討論中,將擴充套件方案分類為“Layer 1層改進”和“Layer 2層改進”。Layer 1層改進是指透過對區塊鏈本身的改進來提升它的可擴充套件性,即On-Chain鏈上改進,Layer 1層包括區塊鏈的資料層、網路層、共識層和合約層;Layer 2層改進是指不影響區塊鏈本身,透過其他方式來實現可擴充套件性的提升,即Off-Chain(鏈下)的改進, Layer 2層包括區塊鏈的應用層、介面層等。為了架構的完整性,我們將基礎設施也納入考慮,新增一個Layer 0層,最後劃分如下圖所示:
進一步劃分為3層模型的好處是可以讓我們討論方案時可以使用Layer 1這樣的術語來表示相互關聯的那幾個分層。
Layer 0層是基礎設施層,包括網路基礎設施、儲存基礎設施和計算基礎設施,與IaaS(Infrastructure as a Service,基礎設施即服務)的” 基礎設施”的概念一致。在以太坊這樣的公鏈社羣通常對Layer 0層的改進很少討論,因為公鏈的基礎設施是去中心化的,無法控制的。而企業構建區塊鏈平臺時,則需要自己提供基礎設施服務,是可控制的,討論改進方案時也應該要考慮Layer 0層的改進,例如網路拓撲結構改進、網路節點選擇、高速網路建設、儲存硬體選型、分散式儲存方案改進、計算節點的排程等等。
Layer 1層包括區塊鏈的資料層、網路層、共識層和合約層,這層改進的出發點是賬本資料的儲存、交易的廣播和驗證、共識演算法的改進、合約效能的改進等。例如以太坊的sharding方案,Casper共識演算法、EOS的DPoS+aBFT共識演算法、迅雷鏈的同構多鏈架構和DPoA+PBFT共識演算法等,都是Layer 1層的改進方案。
Layer 2層包括區塊鏈的應用層、介面層等,這層的擴充套件性改進方案有閃電網路、側鏈、狀態通道、Plasma等,不影響區塊鏈本身,在公鏈社羣是比較容易實施的方案,但這些鏈下改進的方案需要引入為人所詬病的中心化的模組。
4. 小結
區塊鏈與其說是一種新技術,不如說是一種新的分散式系統架構,其整合了P2P網路、共識演算法、密碼學、儲存技術等一系列已有技術,帶來的是大量的新概念、新思維。
以整體架構為脈絡,我們可以有針對性的掌握區塊鏈技術的基本知識,也可以此為框架來分析新出現的區塊鏈專案,對其加以研究,識別其關鍵技術點,考察其是否存在技術創新。