深度解析企業級區塊鏈解決方案——Quorum (中)

買賣虛擬貨幣
導讀:Quorum是由摩根大通開發的企業級分散式賬本和智慧合約平臺,主要是為了解決區塊鏈技術在金融及其他行業應用的特殊挑戰而設計。我們將對Quorum最重要的幾個特性做分析,本文是這個系列的第二篇(《》《》),Quorum隱私分析。一、隱私性設計
privacy(隱私性)是Quorum的重要的部分,Quorum的一個重要特點就是在以太坊的基礎上增加了隱私性(參看白皮書)。將交易和資料進行了隱私性隔離,包括加密和零知識證明等。在將隱私性相關抽象出來以後,導致的一個結果就是,狀態資料庫的分裂。

在以太坊中,MTP主宰的狀態樹控制著整個以太坊的世界,任何的風吹草動,都必須納入狀態資料庫的更新。但是在Quorum中,公有的資料仍然保持在全域性狀態的更新,但是私有的資料不被更新到全域性狀態中,而是被加密儲存到節點上,同樣透過分散式的事務等同步到所有的節點上。

透過上圖可以看到,隱私分成了兩部分即ZSL和Constellation兩部分。


· ZSL:Zero-knowledge Security Layer,即零知識證明安全層。它主要使用ZCASH的零知識證明的zk-SNARKs來增強Constellation機制。
· Constellation:P2P的加密訊息交換系統,提供整個Quorum的資訊保安交換的模組。


一個私有交易的簡單流程:

合約交易狀態:


下面的交易是允許的:
S -> A -> B
S -> (A) -> (B)
S -> (A) -> [B -> C]


而下面的交易是不支援的:
(S) -> A
(S) -> (A)


說明:

S = sender
(X) = private
X = public
-> = direction
[] = read only mode


透過上述的分析可以看出,Quorum的隱私設計是基於加密的安全演算法來實現的。不管是在ZSL還是在Constellation,它都提供了相關的Token來進行相應的支援。


二、Constellation


在Quorum的架構文件中可以看到,Constellation是其重要的一個模組。你可以想象它是一個分散式的金鑰伺服器,等同於用PGP加密訊息的MTA(訊息傳輸代理)網路,做為一個獨立的模組,它可以適用於包括區塊鏈在內的許多型別的應用程式,它是實現Quorum的“隱私引擎”,目前使用的版本是使用Haskell實現。 Constellation模組由兩個子模組組成:

1、事務管理器(Transaction Manager):

事務管理器,允許訪問私有事務的加密交易資料、管理器本地資料儲存以及與其他事務管理器的通訊。它做隱私資料的資料層,提供資料的安全訪問並利用Enclave來實現資料的安全加密。


2、飛地(Enclave)

Enclave就是為了解決區塊鏈中記帳的真實性和安全性而實現的一個模組。它透過事務隔離和特定的加密措施來提供並行操作,大大提高了效能。正如上面所講,隱私的資料的安全處理基本都是透過Enclave來實現的。

三、ZSL


ZSL在Quorum中是單獨提供的,它提供了兩種支援的方法,一種是直接在其JS平臺中呼叫相關的介面,另外一種是使用C++ libsnark library提供的基本庫來供Golang使用。具體的使用辦法和介面參看下面的地址:

(https://github.com/jpmorganchase/zsl-q/blob/master/README.md)


在Quorum中,1.5和1.6版本都提供了對ZSL的支援,但在最新的版本中,沒有提供對ZSL的支援。猜測可能是JP想把ZSL專門做為一個特別的部分來提供相應的服務,而不是廣泛的整合到整體的Quorum這個專案中去。 下圖是一個相關的簡單股權交易用例:

ZSL的使用還是比較複雜的,需要下載相關的庫和相關的模組。如果想完整執行一個ZSL的Quorum專案,請參照下面的地址:
https://github.com/jpmorganchase/zsl-q/blob/master/README.md


四、原始碼分析


1、隱私交易流程介紹


Quorum的交易有兩類即”Public Transaction” 和 “Privat Transaction”,也就是公共交易型別和隱私交易型別。在實際的交易中,前者完全相容以太坊的交易。而在後者的隱私交易中,在原有以太坊的 Transaction 模型上,進行了部分修改。在Quorum 交易tx模型基礎上增加了 “privateFor” 欄位。另外在還其內部增加了一個判斷是否公共或者隱私交易型別的方法 “IsPrivate”。


先看一個官方WIKI上的隱私交易的流程圖,這個圖中,一筆交易與使用者A和使用者B有關係,但是和使用者C沒有關係:

說明:


1. 使用者A將隱私交易傳送到Quorum節點,節點指定交易的有效載荷(內容),併為A和B指定PrivateFor引數為A和B的公鑰。
2. 節點將Tx傳送到對應的Transaction Manager並儲存相關的交易資料。
3. Transaction Manager呼叫加密的Enclave模組相關函式請求對Tx加密。
4. 節點A的Enclave檢驗A的私鑰,如果驗證透過,就進行下列動作:


第一步,生成一個對稱金鑰和隨機值(說明一下這裡使用對稱金鑰的作用是為了加快速度)。
第二步,使上一步生成的金鑰加密Tx及相關內容。
第三步,由SHA3-512來計算加密後的Tx的內容的HASH值。
第四步,遍歷交易方列表(此處為A和B)使用第一步產生的金鑰對用第一步中的public key加密,然後生成一個新的值(加密方法PGP)。
第五步,將上述二三四步的結果返回給Transaction Manager.


5.A的Transaction Manager使用從 Enclave 中獲取的 hash 值作為索引把加密後的TX以及加密後的金鑰儲存到本地。同時,Transaction Manager會把hash值,加密後的TX,public_key_B加密的金鑰這三項透過HTTPS傳送給PartyB的Transaction Manager。PartyB的Tx Manager收到資料後,會進行ACK/NACK的應答。需要注意的同如果A沒有收到應答,那麼交易不會在網上傳播,也就是說,接收人儲存通訊的有效載荷是網路傳播的前提條件。

6.一旦發往B的Transaction Manager的交易成功,A的事務管理器便將hash值返回給其對應的Quorum節點。該節點用hash值來替換原來TX的交易內容(有效載荷)。修改TX的 V 值為 37 或者 38(Private Transaction的標識)。其他節點可以透過這個 V 的值來判斷其是否為已加密交易內容的相關私有交易;否則,即為一個無意義的位元組碼相關的公開交易。

7.使用標準的以太坊的通訊協議將節點透過P2P方式廣播給整個網路。
8.此交易被打包到區塊中,並分發到各個網路使用者。

9. 節點收到這個TX的區塊後,發現這個TX的 V 值為37或38。表明這個Tx是隱私的交易,需要解密,需要呼叫本地的事務管理器,最終決定是否同意這筆交易(使用hash索引查詢)。

10. 因為使用者C的節點不能控制這筆TX,所以它只會接收到一個NotARecipient的訊息,從而忽略這筆交易——c使用者不會更新自己的私有狀態資料庫。A和B將會在自己的事務管理器中查詢雜湊值,識別他們的確同意該交易,然後它們呼叫對應的Enclave模組,傳遞已加密交易內容和加密的系統金鑰和簽名。
11. Enclave模組驗證簽名,然後使用在Enclave中儲存的該使用者的私鑰解密對稱金鑰,使用解密的金鑰對交易內容進行解密,然後將解密的交易內容返回給事務管理器。
12. 使用者A和B的事務管理器,將解密的TX後透過EVM執行。執行完成後將執行結果返回給Quorum節點,並更新Quorum節點的私有狀態。注意:一旦程式碼被執行將會無效,因此在不經過上述過程的情況下,它無法被讀取。


2、隱私交易流程的原始碼


隱私交易的部分在Quorum中只有Transaction Manager部分,Enclave部分是在另外的專案constellation中,用haskell語言編寫完成。下面分別介紹這兩個部分。在瞭解了私有交易的流程後,看一下相關的程式碼:


1)隱私交易


2)Transaction Manager模組
這個模塊包含private.go和node.go以及constellation.go幾個模組。在private.go中實現了:


而在Constellation這個結構體中實現了這個介面:


Constellation透過RPC呼叫Haskell的介面:


透過上述的一系列呼叫,就產生一個RPC的請求,傳遞到Enclave.



3)Enclave模組
在Haskell的專案中主要有以下幾個模組:主模組、Enclave模組、Node模組和相關的工具模組,這裡重點介紹Enclave模組。



相關的RPC:


API介面訊息處理:


邏輯節點的訊息處理:API介面訊息處理:


haskell的程式碼純數學的,理解起來有點頭大啊,又回到從前的感覺。


2、ZSL的分析


在Quorum中,ZSL是定位於增強Constellation模組的。下面簡要的分析一下ZSL的程式碼:


1)在Quorum中增加的ZSL部分


在1.6版本中,core,internal,params,eth中都增加ZSL的相關程式碼或者模組,在vendor的引用庫中,也增加了相關的zsl的庫的引用。
其中主要的程式碼在core/zsl/api.go中,它主要引用了用GO封裝的ZSL相關的介面,在程式碼中有一個註釋說明:






注意,這裡只簡要說明一下零知識證明,不詳細闡述零知識證明的相關演算法,如果對其有興趣,可在網上查詢相關的資料。


零知識證明過程即參與的一方向另一方證明自己掌握某個秘密(或者說證明者向驗證者證明自己掌握某個秘密)。在這個過程中,證明的一方並不想讓另外一方知道這個秘密是什麼。所以二者要按照一個約定,進行一系列的互動,然後最終由另外一方驗證一方確實知道某個秘密。


在計算機領域,一般做法是把原始問題對映到NP問題。驗證者只要驗證證明者給出的NP問題的解即可,這個計算量需求不大。Quorum是和zcash合作,在Zash中使用的NP問題是QAP(把向量表示式表示為多項式,從而把向量的驗證轉化為多項式的驗證,這個過程稱為QAP(Quadratic Arithmetic Programs))


零知識證明的缺點,就在互動上,互動就意味著時間的延長,所以目前使用零知識證明的相關的程式,耗時都是一個瓶頸。


其它的幾個模組中,也增加了相應的介面說明和相關的模組,但基本都是給這個API介面做服務的。


2)零知識證明的snark相關


在Quorum中,使用Golang封裝了相關的庫。形成了一個單獨的專案zsl-q(還有一個與其相關的zsl-q-params專案)。


在封裝的snark.go中:


這些程式碼和在Quorum中的Golang程式碼互相響應,但是真正的演算法呼叫在下面:




在向下的程式碼,就是零知識證明的c++實現和庫了,這裡就不再分析,有興趣的可以將原始碼下來,學習一下。


五、總結

透過上述的分析,可以看到,Quorum把privacy獨立出來,確實想法比較不錯,既可以依賴以太坊的公網技術實現區塊鏈的功能,又可以在其基礎上開發相應的專門的聯盟鏈的分支,達到自己的目的。
不管是從設計上還是技術的實現上,Quorum力求簡單明瞭,在整個原始碼的閱讀過程中,看不到什麼特別的設計技巧,顯得非常的接地氣。


來源:360區塊鏈實驗室

更多區塊鏈資訊:www.qukuaiwang.com.cn/news

免責聲明:

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

推荐阅读

;