JPM Coin 三部曲 (中) - 摩根大通為何青睞 Quorum 區塊鏈?
本篇是三部曲的第二部分,聊一聊 JPM coin 背後的區塊鏈網路 - Quorum,詳解其特點、共識機制,及其如何滿足傳統銀行業的商業需求。
Quorum 被認為是“企業級以太坊”,從2016年起由摩根大通銀行啟動的開源專案。
(https://github.com/jpmorganchase/quorum)
相對於一般的區塊鏈,Quorum 有以下幾個特點:
- 相容以太坊合約
- 准入系統,已知節點
- 鏈下+鏈上隱私保護
- 靈活支援多種共識機制
- 高效能、速度快、抗分叉
以太坊的克隆
Quorum 之所以可以相容以太坊的合約,其本身是以太坊客戶端 Go 語言版本 (go-ethereum) 的“克隆”,並根據 go-ethereum 釋出進行更新。 這意味著所有在以太坊上跑的合約,包括如 Truffle 一樣的開發框架,都可以直接部署在 Quorum 上。
但這不代表 Quorum 和以太坊網路之間當下可以互通 (Interoperability)。Quorum 更多是一個聯盟鏈,不是所有人都可以隨意加入網路。節點的加入與去除需要授權,並且是已知的身份。這個網路裡沒有挖礦機制,也沒有原生代幣。儘管保留 Gas 本身,但是刪除了以太坊中 Gas 的定價,即 gasPrice = 0,轉賬時沒有礦工費。
注重隱私與監管友好
以太坊的特點是賬本公開透明,普通人開啟一個以太坊瀏覽器,就可以查到每筆交易的全部資訊。 透明性對於公鏈是一個優點,到了傳統行業,卻成了無法匹配的痛點 。對於金融業而言,資料的隱私非常重要,銀行不希望將自己的資產狀況和交易記錄公之於眾,更不願意這些資料被競爭者獲取。
保護隱私性是 Quorum 的核心功能之一,Quorum 將交易分為公開交易與私人交易。
公開交易直接在主鏈節點間完成,與以太坊基本一致。
而私人交易會放在鏈下獨立的伺服器進行加密處理。Quorum 主鏈上只儲存加密後資料的雜湊值,而私有交易的資料將儲存在鏈下,通過管理引擎(Tessera 和 Constellation)在節點間共享。只有交易的相關方(以及監管部門)才能看到交易的細節,非相關方無法獲取交易細節。
主鏈中所有節點的狀態公開,達成絕對的狀態共識,而私有狀態資料庫的情況則不同,不儲存全域性狀態。如果你希望進行一筆私人交易,只需要在發起交易時新增一個 privateFor 的標籤,加入節點物件,這筆交易便可以在私有狀態資料庫中點對點進行。
不過這也會帶來一些問題,
1. 一旦 privateFor 的節點列表確認傳送,就無法新增新的節點到列表中。換句話說,如果對方事先不處於這筆交易鏈條的一環,就無法獲取之前發生的交易詳情。設想,對於某些交易,如果央行或者監管者一開始不在這個網路中,後來決定加入,卻無法直接獲取之前的交易資訊。
2. 由於私有狀態資料庫是點對點進行,不同步全域性狀態,這就帶來雙花的風險。
此外,將資料放在鏈下的伺服器不可避免地帶來中心化和單點失敗的風險。
為了解決鏈下隱私方案的缺陷,Quorum 在 2017 年與 Zcash 團隊合作,提供了一種鏈上的隱私方案,連線私有合約以及主鏈 — 合約的商業邏輯在私有合約內部達成一致,然後在主鏈上進行清算,並以零知識證明的方式使用 z-token 作為保護隱私的橋樑 。
如何搭建隱私橋樑呢?z-contract 合約會生成與主鏈資產 1:1 的代幣資產 z-tokens。需要注意的是,z-contract 也在主鏈上執行,只是其資產是隱蔽資產 (Shielded Assets) 可以隱藏交易資訊(傳送方、接收方、資產數量等)。
對於一筆隱私交易,會按照以下步驟進行:
- 賣方建立私人合約,規定合約的細則:包括資產金額、買賣方等。
- 買方接受合約,此時雙方在私人合約層達成一致。
- 私人合約通知買方付款。
- 買方將一部分資產從公開主鏈轉移到 z-contract 層,通過 z-tokens 完成隱蔽支付。
- 買方通知私人合約支付已經完成。
- 私人合約驗證支付已經完成,通知賣方轉移資產。
- 賣方同樣通過 z-contract 層的 z-tokens 完成隱祕轉移。
- 賣方通知私人合約轉移已經完成。
- 私人合約驗證轉移已經完成,此時交易完成最終結算。
- 其他節點只能看見公開賬本上的餘額,監管者可以檢視 z-contract 層的 z-tokens 轉移。
靈活的共識機制 - 追求最終性 (Finality)
Quorum 可以支援三種共識機制,包括 PoA、RAFT 和 IBFT。
在介紹這幾種共識機制之前,我們發現 Quorum 並沒有支援最常見的 PoW (工作量證明) 或者 PoS (權益證明),為何呢?
PoW 和 PoS 都屬於 Nakamoto Consensus,任何人都可以隨時加入和退出節點,這種共識機制通過節點之間某種公平的“投票”選擇記賬人,由於節點沒有身份,可以自由地創造,相互不信任,因此投票資源必須是稀缺性的。在 PoW 機制下,稀缺資源是物理算力,而在 PoS 下,這種資源是經濟權益。無需准入帶來了去中心化的制衡,但節點之間的“競爭”記賬不可避免地犧牲了速度與效率。
對於私有鏈和聯盟鏈,Nakamoto Consensus 並不合適。出於安全和隱私的考慮,私有鏈和聯盟鏈的節點之間必須相互許可,才能加入網路。而相互許可的前提是每個節點都有固定的身份,這種身份讓節點之間成為信任或者部分信任節點 。基於部分信任或者完全信任節點,可以採用高效能的容錯分散式系統 Byzantine Fault Tolerant (BFT),如 PoA 和 IBFT;或者容故障分散式系統 Crash Fault Tolerant (CFT),如 RAFT。
PoA
PoA 的全稱是 Proof of Authority (權威證明)。PoA 基於一組有身份的節點,輪流進行記賬。換句話說,每個節點在用自己的身份和權威作為擔保。每個區塊只需要一個簽名確認,這大大提高了出塊速度和每秒能夠吞吐的交易。
雖然有中心化的風險,不過 PoA 的設計中為了限制單個節點的權力,每個節點的簽名間隔需要大於 N (總節點數)/2。
Quorum 在早期開發階段使用了 PoA 共識,但在正式進入生產階段卻剔除了 PoA,這又是出於什麼原因呢?
這就涉及到金融結算網路最看重的另一個特性 - 最終性 (Finality),也可以說,抗分叉 (Non-forkable)。
JPM coin 要求抗分叉的前提,排除了其使用包括 PoW、PoS 和 PoA 的可能。因為在這幾種共識機制下,雖然區塊鏈按一致的規則檢驗和收錄區塊,但也會出現同時有多個相同高度的正確區塊產生。一般而言,全網會迅速歸集到最長的同一鏈上。但當涉及規則改變時,即網路中存在遵守不同的規則的節點時,就會存在區塊鏈分叉且不能迅速回歸同一鏈的可能,也就是我們常說的“分叉”。
參考比特幣現金對比特幣分叉以及其自身的影響,你就可以理解作為每天處理 6 萬億美金的摩根大通銀行,一定不希望這些交易因為分叉而無效。
相對而言,Quorum 支援的另外兩種共識機制: RAFT 和 IBFT 都是抗分叉的。
RAFT
RAFT 其實是一種已經廣為使用的傳統分散式一致性協議,應用在包括 Kubernetes, Docker Swarm 等容器叢集管理系統。RAFT 對於容故障、可信節點,並且需要更快出塊時間和最終性的封閉聯盟非常有效。
與以太坊相比,RAFT 也有自己的節點。相對於以太坊任何節點都可以出塊,RAFT 的節點分為 Leader 、Follower 以及暫時的 Candidate。
Leader 是負責生產區塊的唯一節點,Follower 監聽 Leader 的“心跳”,並收取 Leader 傳遞過來的區塊。
如果 Follower 在其週期內沒有收到 Leader 發來的心跳,則會認為Leader 已經死了。此時,沒有收到 Leader心跳的 Follower 重新發起選舉,自己的身份從 Follower 改變為 Candidate。它會給自己投一票,然後傳送投票申請到其他 Follower,自己成為 Leader。
接受心跳的目的是為了抗系統故障,新的節點作為 Leader 繼續出塊。
值得注意的是,當新的交易產生後, Leader 並不會馬上記錄到鏈上,而是等收到所有 Follower 的確認回執後,記錄並廣播一個執行的訊息,之後所有收到執行訊息的 Follower 才會將區塊記錄在本地的鏈上。這樣就可以避免分叉,確保最終性。
RAFT 機制下的默認出塊時間間隔是 50 ms,而且只有在有交易發生時才會出塊,大大節省了儲存空間。
但 RAFT 機制也有不足之處,要使其得以運轉的前提是全部節點是誠實的,RAFT 雖然可以容單點故障,但是不具備容錯,無法防止節點作惡和篡改歷史資料。
IBFT
IBFT,全稱 Istanbul Byzantine Fault Tolerance (伊斯坦布林拜占庭容錯) 可以在抗分叉的基礎上,防止部分節點作惡。
拜占庭將軍問題是一個古老的關於容錯的一致性協議。想象拜占庭軍隊圍住一個敵方城市,拜占庭部隊分開駐紮在城外,每個部分僅由自己的將軍指揮。將軍們只能通過信使和其它將軍進行通訊。在觀察了敵情之後,他們必須制定一個一致行動的計劃。結果表明:只要超過2/3的將軍忠誠時即可達成一致。
IBFT 是一種實用拜占庭容錯演算法,與 RAFT 完全相信 Leader 不同,IBFT 的前提是包容 1/3 不誠實節點,通過驗證者多輪投票,達到彼此一致後出塊。
出塊主要需要三個階段:預準備 (pre-prepare) 、準備(prepare) 和確認 (commit)
首先,從全網節點輪流選舉出一個主節點(Leader)負責生成區塊,主節點在收到交易請求後生成新區塊。
預準備(Pre-prepare):主節點向所有備份節點發送預準備訊息,提議節點將從網路收集到需放在新區塊內的多個交易排序後存入列表。
準備(Prepare) :所有備份節點接收到交易列表後,根據排序模擬執行這些交易。所有交易執行完後,廣播基於交易結果計算新區塊的雜湊摘要。
確認(Commit):如果一個節點收到的 2/3 個其它節點發來的摘要都和自己相同,就向全網廣播一條 commit 訊息。
如果節點收到 2/3 條 commit 訊息,即可提交新區塊及其交易到本地的區塊鏈和狀態資料庫,隨機進入下一輪區塊高度。
可以看到,每個區塊經過三個階段的驗證,即使 1/3 的節點出現故障或者作惡,也可以正常新增。如果主節點作惡,備份節點之間可以相互檢查,在衝突時提交一次 Round Change,選取新的主節點。
由於在每個區塊高度只有一個節點負責出塊,不會有分叉的風險。而且賬本不可篡改,試圖修改歷史紀錄需要獲取所有備份節點和主節點的私鑰。與 PoW 相比,IBFT 沒有競爭機制,出塊速度更快。
不過,IBFT 的劣勢也很明顯,多個驗證階段的結構下讓訊息數量與節點數量成指數級增長,因此 IBFT 的節點數不能太多,通常用作企業級和政府的網路。
綜合來看,節點准入、注重隱私、交易最終性、支援靈活的共識機制滿足不同商業場景下的需求,並且監管友好是傳統金融巨頭髮行加密貨幣看重的特點和條件。
雖然摩根大通對 Quorum 區塊鏈的建設和資訊非常開放,但遺憾地是,官方並沒有公開 JPM coin 使用何種共識機制的資訊。推斷來看,JPM coin 會根據不同的應用場景在 RAFT 和 IBFT 中選擇。如果所有的節點都是摩根銀行信任的夥伴,那麼 RAFT 是不二的選擇;如果只部分信任成員銀行,IBFT 將是最為可行的方案。
這也意味著,至少在早期階段,JPM coin 的物件是相對封閉的聯盟。但摩根幣和一般使用者並不是沒有任何關係,摩根大通的清算網路可以大大增加銀行之間的網路效應,而且為跨境支付提供了更加安全的合規資訊交流協議。銀行本身效率的提升和成本的降低,對終端使用者來說無疑是一件好事。 更重要的是,摩根幣的推出是對以太坊 ,包括區塊鏈應用落地的一個巨大推動。從技術層面,相容以太坊合約的 Quorum 網路完全有可能在之後和已有的公共區塊鏈進行互通,在中心化與點對點的貨幣系統之間搭建橋樑。
在第三部分中,我會橫向比較各國大型銀行和央行發行和正在試驗的加密貨幣以及數字貨幣 ,以及對當地經濟甚至全球貨幣市場的重塑意義。
回看: 《JPM Coin 三部曲 (上) - 深入理解摩根幣的運作》
本文作者:潘超