簡介

Quorum是一個聯盟鏈方案,由摩根大通開發的企業級分佈式賬本和智能合約平臺,它是在以太坊(Ethereum)的基礎上開發的,提供私有智能合約執行方案,並滿足企業級的性能要求。適用於需要高速交易以及高吞吐量處理聯盟間進行私有交易的應用場景,主要是為瞭解決區塊鏈技術在金融及其他行業應用的特殊挑戰而設計。

Quorum是基於以太坊的Golang版本(go-ethereum)開發而成,為金融服務行業提供以太坊許可鏈方案,可以方便的支持交易與合約的隱私性。在go-ethereum的基礎上,主要的改動點有如下幾項:

  • 添加瞭交易與合約的隱私性:對於一筆交易來說,隻有交易的相關方才能看到交易的細節,非相關方是看不到交易細節的
  • 網絡/節點的許可管理:由於Quorum不是公鏈,而是聯盟鏈,這個特點決定瞭不是任何節點都是能夠隨意加入區塊鏈的,隻有經過授權的節點才能夠加入區塊鏈
  • 調整瞭共識機制:把以太坊原有的PoW調整為基於Raft的共識機制
  • 更高性能:由於共識算法的調整,創建新塊的步驟和整個區塊鏈對新塊達成共識的速度大大提高

Quorum的系統架構

如下圖所示,這是Quorum企業級區塊鏈的系統架構圖:

從架構圖中我們可以看到,Quorum是基於以太坊的Golang版本開發。Quorum做設計之初就確定盡可能避免重復造輪子,盡量復用更多的已有技術,盡可能的減少對以太坊的修改,以便於未來合並以太坊升級之後的代碼更容易。

整個Quorum的系統架構分為上下兩層,

下層是傳統的區塊鏈層

這一層為整個Quorum提供基礎的區塊鏈功能服務,作為上層應用層的基礎設施,為上層提供相應的編程接口,使得應用層能夠充分的利用底層的區塊鏈功能。

從圖中可以明顯的看出來,這一層包含瞭三大組件:

  1. 基於以太坊的Quorum節點
  2. 事物管理器(Transaction Manager)
  3. 飛地(Enclave)

Quorum節點,就是修改後的以太坊的Golang版本實現,用以存儲公共的交易和私有交易。Quorum對geth做瞭以下改動:

  • 把PoW共識算法,修改成基於Raft的共識算法
  • P2P網絡層,修改成隻有授權節點才能加入網絡
  • 區塊生成邏輯,由檢查“全局狀態root”改為檢查“全局公開狀態root”
  • 區塊驗證邏輯,在區塊頭,將“全局狀態root”替換成“全局公開狀態root”
  • 狀態樹,分成公開狀態樹和私有狀態樹
  • 區塊鏈驗證邏輯,修改成處理“私有事務”
  • 創建事務,修改成允許交易數據被加密哈希替代,以維護必需的隱私數據
  • 刪除以太坊中Gas的定價,盡管保留Gas本身

另外就是包含瞭Quorum添加進來的最重要的Constellation模塊,這個模塊我們可以想象它是一個分佈式的密鑰服務器,等同於用PGP加密消息的MTA(消息傳輸代理)網絡,做為一個獨立的模塊,它可以適用於包括區塊鏈在內的許多類型的應用程序,它是實現Quorum的“隱私引擎”,目前的版本使用Haskell語言編寫。

Constellation模塊又進一步的細分為兩個子模塊:

  1. 事務管理器(Transaction Manager): 允許訪問私有事務的加密交易數據、管理本地數據存儲以及與其他事務管理器的通信。它做隱私數據的數據層,提供數據的安全訪問並利用Enclave來實現數據的安全加密。
  2. 飛地(Enclave) Enclave就是為瞭解決區塊鏈中記帳的真實性和安全性而實現的一個模塊。它通過事務隔離和特定的加密措施來提供並行操作,大大提高瞭性能。正如上面所講,隱私數據的安全處理基本都是通過Enclave來實現的。

上層是商業邏輯層

具體的業務應用程序全部都在這一層,應用層使用底層提供的區塊鏈功能來實現傳統的商業業務到區塊鏈系統的移植。這一層又細分為三個子模塊:

  1. 智能合約模塊(Smart Contracts):
  2. DApps模塊
  3. 已有的App集成模塊

Quorum的解決方案,是使用密碼學技術來對私有交易數據加密,以防止交易方以外的人看到敏感數據。這種方案使用一個單獨的共享區塊鏈,一個智能合約框架,以及修改後的以太坊;其中智能合約框架對隱私數據進行瞭隔離。對go-ethereum代碼庫進行的修改,包括區塊提案和驗證過程的修改。區塊驗證過程,是通過執行交易合約代碼來進行的,比如所有節點都對公開交易、和與交易方相關的私有交易進行驗證;對於其他私有交易,節點將會忽略合約代碼的執行過程。

這種設計,把狀態數據庫切分成為瞭兩部分,一部分是公開狀態數據庫,一部分是私有狀態數據庫。其中公開狀態數據庫存儲所有公開的數據,比如原始以太坊的所有交易信息都是公開數據。而私有狀態數據庫則隻保存私有的交易信息,而且這類交易信息隻有交易的相關方才能對其解密和查看,非交易相關方則無法查看交易的詳細信息,這都是通過Constellation模塊的加密所完成的。另外,鏈上所有的事物仍然可以同步到所有節點,為防止篡改和隱私而做瞭安全加密處理。如下圖所示:

123ff0ba6b72a653479da90f07aadb4f

交易隱私性

交易隱私性是Quorum的獨有特點,是其核心功能之一。為此,Quorum引入“公開交易”和“私有交易”這兩個概念。註意,這隻是一個理論上的概念,實際上Quorum並未引入新的事務類型;隻是在以太坊事務模型的基礎上擴展包含一個可選的privateFor參數,這個私有參數會使得Quorum把這一類事務當做私有事務,另外加入一個IsPrivate方法來識別交易是否是私有事務類型。

下面我們以處理私有交易的流程為例解釋Quorum的事務流程,如下圖所示:

ea6f6c6bffffdd286b51e9eecf292e19

在這個案例中,A和B構成瞭私有交易AB的交易雙方,而C機構不參與該交易。

  1. A將隱私交易發送到Quorum節點,節點指定交易的有效載荷(內容),並為A和B指定PrivateFor參數為A和B的公鑰。
  2. 節點將Tx發送到對應的Transaction Manager並存儲相關的交易數據。
  3. Transaction Manager調用加密的Enclave模塊相關函數請求對Tx加密。
  4. 節點A的Enclave檢驗A的私鑰,如果驗證通過,就進行下列動作:
  5. 第一步,生成一個對稱密鑰和隨機值(說明一下這裡使用對稱密鑰的作用是為瞭加快速度)。
  6. 第二步,使用上一步生成的密鑰加密Tx及相關內容。
  7. 第三步,由SHA3-512來計算加密後的Tx的內容的HASH值。
  8. 第四步,遍歷交易方列表(此處為A和B)使用第一步產生的密鑰對用第一步中的public key加密,然後生成一個新的值(加密方法PGP)。
  9. 第五步,將上述二三四步的結果返回給Transaction Manager.
  10. A的Transaction Manager使用從 Enclave 中獲取的 hash 值作為索引把加密後的TX以及加密後的密鑰保存到本地。同時,Transaction Manager會把hash值,加密後的Tx,public_key_B加密的密鑰這三項通過HTTPS發送給PartyB的Transaction Manager。PartyB的Transaction Manager收到數據後,會進行ACK/NACK的應答。需要註意的是,如果A沒有收到應答,那麼交易不會在網上傳播,也就是說,接收人存儲通信的有效載荷是網絡傳播的前提條件。
  11. 一旦發往B的Transaction Manager的交易成功,A的事務管理器便將hash值返回給其對應的Quorum節點。該節點用hash值來替換原來Tx的交易內容(有效載荷)。修改Tx的V值為37或者38(Private Transaction的標識)。其他節點可以通過這個V的值來判斷其是否為已加密交易內容的相關私有交易;否則,即為一個無意義的字節碼相關的公開交易。
  12. 使用標準的以太坊的通信協議將節點通過P2P方式廣播給整個網絡。
  13. 此交易被打包到區塊中,並分發到各個網絡用戶。
  14. 節點收到這個Tx的區塊後,發現這個Tx的V值為37或38。表明這個Tx是隱私的交易,需要解密,需要調用本地的事務管理器,最終決定是否同意這筆交易(使用hash索引查找)。
  15. 因為用戶C的節點不能控制這筆Tx,所以它隻會接收到一個NotARecipient的消息,從而忽略這筆交易——c用戶不會更新自己的私有狀態數據庫。A和B將會在自己的事務管理器中查找哈希值,識別他們的確同意該交易,然後它們調用對應的Enclave模塊,傳遞已加密交易內容和加密的系統密鑰和簽名。
  16. Enclave模塊驗證簽名,然後使用在Enclave中保存的該用戶的私鑰解密對稱密鑰,使用解密的密鑰對交易內容進行解密,然後將解密的交易內容返回給事務管理器。
  17. 用戶A和B的事務管理器,將解密的Tx後通過EVM執行。執行完成後將執行結果返回給Quorum節點,並更新Quorum節點的私有狀態。註意:一旦代碼被執行後將會被拋棄,因此在不經過上述過程的情況下,它無法被讀取。

基於Raft的共識機制

Quorum放棄瞭以太坊本身的PoW共識算法,而是使用瞭基於Raft的共識機制,其使用瞭etcd的Raft實現源代碼。Quorum認為對於這類聯盟鏈來說,不存在作惡節點,所以不需要拜占庭容錯並且需要更快的出塊時間(以毫秒而非秒為單位)和事務最終確認(不存在分叉)。還有一個特點是,這種共識機制不會去創建空白區塊,而是按照需要更快、更有效的創建新區塊。

在geth命令添加 –raft 標志,就會使得geth節點運行raft共識算法。

Raft和Ethereum都有自己的“節點”概念,但它們稍微有點兒不一樣。

在Raft裡面,一個“節點”在正常操作的時候,要麼是Leader,要麼是Follower。在整個集群裡面,隻有一個Leader,所有其他的節點都要從這個Leader來獲取日志數據。這裡還有一個Candidate的概念,不過僅僅是在Leader選舉期間才有。

但是在Ethereum裡面卻沒有Leader和Follower這樣的概念,對於任何一個節點來說,都可以創建一個新塊(隻要計算足夠快),這就類似於Raft裡面的Leader。

在基於Raft的共識算法中,在Raft和Ethereum節點之間做瞭一對一的對應關系,每個Ethereum節點也是Raft節點,並且按照約定,Raft集群的Leader是產生新塊的唯一Ethereum節點。這個Leader負責將交易打包成一個區塊,但不提供工作量證明(PoW)。

68a63f859850bd08ee20e09f5f0cb9a1

在這裡把Leader和產生新塊的節點綁定到一起的主要原因有兩點:第一是為瞭方便,因為Raft確保一次隻有一個Leader,第二是為瞭避免從節點創建新塊到Leader的網絡跳轉,所有的Raft寫入操作都必須通過該跳轉。Quorum的實現關註Raft Leader的變化——如果一個節點成為Leader,它將開始產生新塊,如果一個節點失去Leader地位,它將停止產生新塊。

Quorum使用現有的Etherum P2P傳輸層來負責在節點之間的通訊,但是隻通過Raft的傳輸層來傳輸Block。它們是由Leader創造的,並從那裡傳輸到集群的其餘部分,總是以相同的順序通過Raft傳輸。

當Leader創建新塊時,不像在Ethereum中,塊被寫入數據庫並立即成為鏈的新Head,隻在新塊通過Raft傳輸之後才插入塊或將其設置為鏈的新Head。所有節點都會在鎖定步驟中將鏈擴展到新的狀態,就好像是他們在Raft中同步日志。

節點授權與安全

節點授權,是用來控制哪些節點可以連接到指定節點、以及可以從哪些指定節點移除的功能。目前,當啟動節點的時候,通過指定–permissioned參數在節點級別處進行管理。

如果指定瞭–permissioned參數,節點將查找名為permissioned-nodes.json的文件。此文件包含此節點可以連接並接受來自其連接的enodes白名單。因此,啟用權限後,隻有permissioned-nodes.json文件中列出的節點成為網絡的一部分。 如果指定瞭–permissioned參數,但沒有節點添加到permissioned-nodes.json文件,則該節點既不能連接到任何節點也不能接受任何接入的連接。

總結

Quorum通過對網絡節點的授權管理,使得隻有被授權的節點才能夠加入網絡;對共識算法的調整,使得Quorum擁有更高的速度和性能;創新的隱私模型,尤其私有交易的處理,使得交易的隱私性大大加強,這一切都使得Quorum非常適合為金融場景服務。