王嘉平:突破區塊鏈不可能三角:非同步共識組 [Monoxide]
好吧,前幾個月吹的牛,今天來兌現一下。我們實現了"非同步共識組"模型,可以將一個現有的單鏈共識演算法,橫向擴充套件1000倍以上。這樣的擴充套件將使得吞吐量(TPS)提升1000倍以上,同時也將全網計算能力(CPU)提升2000倍以上,將狀態表達的記憶體空間(RAM)提升2000倍以上。
非同步共識組系統的效能提升,絲毫沒有犧牲去中心化特性,隨著全網的橫向擴充套件提升,每一個全節點的工作壓力(頻寬、計算、記憶體、磁碟IO)並沒有顯著的加大,始終保證一臺普通中檔價位的電腦可以輕鬆地作為網路的一個全節點,通過普通家用寬頻網路接入主網。 非同步共識組系統的效能提升,是在保證安全的基礎上的。雖然系統允許全網被劃分成上千個獨立非同步工作的共識組,但是我們的協議使得攻擊任何一個單獨分片的實際需要的物理算力,和攻擊整個網路的物理算力相當。這樣使得這個高度分片之後的非同步共識組系統具備和單鏈系統一樣的安全性。
非同步共識組系統的效能提升,對上層交易結構是中立的。這個技術不引入任何交易結構上的假設(例如假設少數人直接頻繁交易之類)。可以完美支援任意場景的大規模支付系統的需求。 這個工作,除了我和汪浩之外,還有張小兵(前pplive技術合夥人)一起參與研究和實現。借這個機會也感謝我們的導師沈向洋老師,還有Lidong Zhou老師的指導,以及bob, minghao,sophia,shumo,shuang等同學們的建議和挑戰。
NSDI 2019
11月30號那天週五晚上,汪浩突然打電話給我,說看郵件,論文中了。本來官方聲稱是3號週一才發錄用通知的。在論文委員會開會討論(table discussion)之前,提早發通知,通常是兩種情況,論文毫無爭議地被錄用,或者毫無爭議地被拒收。腦補一下,汪浩剛剛收到郵件還沒點開之前的心情。要知道之前無數專注公鏈效能的團隊,希望可以在NSDI,OSDI 或者 SOSP 這樣的系統領域國際頂會上通過嚴格的同行評語,發表自己的論文。但是極為不易,上一篇區塊鏈公鏈論文,是2017年的SOSP,就是著名的AlgoRand專案。
論文被接受的郵件通知,投稿時論文取了一個更為樸素的標題
我們的基礎實現和實驗驗證,在今年夏天的時候完成,9月份的時候投稿了NSDI 2019。12月初完成嚴格的同行評議,同另外49篇論文一起被該會議接收,將於2019年2月底在波士頓正式公開發表。我們之所以願意等待,是因為我們覺得考驗新技術必須來自於國際主流學術同行的認可,尤其是那些和我們在同一個研究方向上競爭的學者們。而不是自說自話地發個白皮書或者丟一個沒有評審過的arXiv的文章。通常技術白皮書是幫助使用者更好地理解一項已經產品化的成熟技術,而不是用來提出尚未驗證的新技術。論文需要非常清楚地定義問題,說明新設計的動機和取捨,探討新技術的邊界和侷限性,而不是像白皮書那樣僅僅說明這個新技術提供了什麼。在工科的論文中,推導過程比結論重要,思路比解法重要,失敗案例比成功案例重要,實驗的設計和規範比實驗結果重要,從而啟發後繼的研究工作,推進相關領域的發展。
之前區塊鏈相關工作很多發表在密碼學會議或者網路安全會議,我們為什麼投NSDI呢? 因為我們的工作核心突破在於大幅提升區塊鏈系統的伸縮性,而不是提出了另一個的共識演算法。NSDI全稱是Networked Systems Design and Implementation,是 USENIX (Advanced Computing Systems Association)旗下的旗艦會議之一,也是計算機網路系統領域久負盛名的頂級會議。NSDI 側重於網路系統的設計與實現,注重系統的效能和伸縮性。眾所周知的著名大資料系統 Spark 就發表在 2012 年的 NSDI 大會上。最懂網路系統伸縮性的學者,在這個領域。 在今年接受的49篇文章中,有超一半來自美國頂尖高校(MIT, UC Berkeley, Stanford, CMU, Princeton, Cornell, UW, Harvard, Yale等等等),另外近一半來自微軟,Google,Intel等美國知名雲端計算相關企業。其中國內高校僅有清華大學有3篇文章被錄用,分別是關於網路系統建模、超算系統監控以及RFID無線技術。另外值得一提的是,今日頭條(Bytedance)有5篇文章被接收,全部是和微軟合作發表。果然是不少人從微軟跳去了頭條 (微笑 。 在今年錄取的論文中, 僅有我們這一篇論文是和區塊鏈相關,很榮幸被安排在會議的第一天,分散式系統專場,進行演講,同一個場次的還有兩篇分別來自Stanford和MIT的論文。區塊鏈相關技術在整個學術界還是非常新興的研究課題,希望能有更多同學來這個領域。
非同步共識組 (Asynchronous Consensus Zones)
這篇文章的標題為: Monoxide: Scale Out Blockchain with Asynchronous Consensus Zones。其關鍵設計就是這個Asynchronous Consensus Zones,非同步共識組。這裡的核心是Consensus Zone,而不是Asynchronous 。非同步是一個重要的特性,但其核心是共識組這個模型。然後Monoxide是這個專案的code name。 我們回顧一下這個共識組的概念:共識組由多個同質的、功能上完全一致、地位上也完全平等,並邏輯上儘量隔離的獨立共識系統的例項所構成,他們並行工作,分攤全網的吞吐、計算、儲存的壓力,分攤全網狀態的維護工作。
0. 具備獨立的相對穩定的節點集合,邏輯上不要求一個節點參與到多個共識組 1. 具備獨立的賬簿,承載全網的一部分使用者(組內使用者)。各個共識組的組內使用者沒有交集 2. 具備獨立的Chain of Blocks,僅記錄已經確認的和組內使用者相關的交易 3. 具備獨立的非阻塞的出塊過程,各個組之間沒有任何同步的需要 (如需要互斥鎖定特定資源) 4. 具備獨立的未確認交易集合,僅有和組內使用者相關的未確認交易會被暫存 5. 具備獨立的出塊候選或競爭機制,礦工僅限於組內競爭,和其他組的礦工無直接競爭關係 6. 具備獨立的Gossip網路,完成區塊和未確認交易的廣播,不波及其他共識組的節點
我們就是設計了這樣的一個系統以及協議,保證其上的跨分片交易可以正確、高效地完成,保證攻擊單個共識組的代價同攻擊整個網路代價相當,保證單個執行中的全節點需要承擔的系統壓力不會隨著全網效能的提升而變大。具體在單個共識組內部採用的共識演算法,可以是PoW,也可以是類BFT或者VRF演算法。我們的基礎實現,基於最樸素的PoW演算法。
伸縮性
同通過新的共識演算法來實現效能提升的設計不同,對於非同步共識組這樣的分片系統來說,系統的效能不是一個定值,是一個和系統資源配置相關的,可以被調整的值。就好像一個多個穩定轉速的發動機,不同的油耗就有不同的推力。在非同步共識組中,這個油耗就是全網有多少全節點,有多少礦工節點。不過,相信大家總是希望看到一個數字,我這裡也得列一下。
這個是最高48000個節點的測試網路中的實測吞吐量,橫軸是這些節點被劃分成了多少個共識組,縱軸是平均每秒處理的交易量。在我們的測試中,最大的共識組數量為2048,此時吞吐量為11694 TPS。這個數字已經遠超現今所有公開發表的運行於網際網路上的公鏈專案,當然那些只在機房裡面跑,單節點採用怪獸般伺服器的專案除外。
但是我這裡想說的是,這個絕對數字不是重點。這個圖核心要展示的是這個方案的線性伸縮性,也就是隨著共識組數量的增加,全網的吞吐量將獲得線性地提升。同時,全網的的狀態記憶體空間、交易處理的計算力、歸檔交易的儲存空間也將同時得到線性的提升。這才是所謂的伸縮性。下面我進一步展開介紹這個實驗的細節。
1. 單節點壓力 這個實驗在1200臺主機(8核CPU,32G記憶體)上,最多運行了48000個全節點例項,每個節點限定最高頻寬30Mbps。從幾十個共識組,到幾千個共識組,單節點的壓力始終不大,可以輕鬆執行在這樣配置的主機上。最極端的情況,一個主機運行了40個例項。
2. 測試工作集 在這個實驗中,我們展現的是處理一對一支付交易的效能。每一個交易還有支付源和宿的地址,以及和源地址對應的簽名,還有支付金額,總共百來個位元組。為了使得測試更為真實,尤其是跨片的發生概率的真實情況,我們的測試工作集使用以太坊上所有ERC20代幣支付的歷史記錄(截止高度5867279),而不是自行隨機生成交易。其中包含1.6千萬個地址,和7.6千萬條交易記錄。我們將這個工作集在全網重放(忽略原始時間),以獲得測試結果。
3. 物理網路 我們將1200臺主機,平均分佈在全球15個不同國家的城市,從而使得測試網路接近真實的網際網路延遲。我們實測的平均延遲為102毫秒。
4. 共識演算法 我們在單個共識組中,採用了類GHOST的POW演算法,目標出塊間隔15秒,單個共識組的吞吐量為15.6 TPS。這是一個非常保守的設定,可以簡單地通過擴大塊尺寸獲得額外幾十倍的提升。當然,通過這種方式獲得的提升,並不能體現我們自身的技術價值。
5. 交易延遲 在非同步共識組中,非跨片交易交易確認時間和單鏈系統無異。跨片交易的確認時間將會最大延長到原來的2倍,平均1.5倍,即22.5秒左右。
6. 跨片開銷 處理跨片交易是會有額外的開銷的,但是好在我們的演算法使得這個開銷是個常數,和共識組的數量無關。細心的同學可能已經發現,15.6 TPS × 2048 = 31948.8 TPS 遠大於 我們實測的 11694.9 TPS。事實上,每一次共識組數量翻倍,其效能提升並不是2倍,而是一個稍低的數字。這個在圖中的第一段更為明顯,那一段是提升是1.6倍,第二段是1.8倍,之後逐漸收斂到1.9倍。這部分的額外開銷,同跨片交易比例增高有關,也和需要協同更多的共識組有關。 下圖展示了在基於以太坊歷史交易記錄的測試集中,跨共識組交易的比例。很顯然分片越多,使用者會被切得更細,就會有更大的概率使得交易雙方處於不同分片。圖中可以看到,在分片到128個共識組的時候,跨共識組交易的比例就幾乎已經是100%了。我們的演算法並不迴避這個狀況,而是給出了高效的跨片處理方案,從而使得全網的伸縮性繼續保持線性提升,而不受跨片交易的制約。
演算法和協議上的挑戰
為了讓這樣的一個系統設計可以正確,安全地工作。有一系列的技術挑戰。也是論文在學術層面所作出的貢獻。
1. 高效處理跨片交易我們在論文中採用了無須狀態鎖定的非同步執行方式,最終原子性(Eventual Atomicity),最大限度地保證了各個共識組可以高效吞吐,不會互相阻塞。而這裡的安全性是通過源共識組的共識證明來完成。這一點在思路上有些類似一些跨鏈的工作,但是有一個本質的不同。在共識組中,各個組是互相配合,互相信任的,他們互相承認對方的共識證明,所以我們可以找到不引入任何中心化節點的方式來保證安全。而通常的跨鏈演算法中,至少有一條鏈是不配合的,不承認甚至根本就讀不到對方鏈的狀態。
2. 跨分片交易邏輯如果只是支付,跨分片交易邏輯可以拆分成 "扣款" 和 "存款" 兩個交易步驟,然後分別在不同分片中完成。那麼為什麼這麼拆開了就可以順利地完成跨分片交易,更為複雜的交易邏輯該如何處理呢? 我們在論文中提出了Oxidation程式設計模型,用來定義分片系統中的智慧合約。程式設計模型不是說我們用Javascript、C++、PHP,還是用Web Assembly,亦或是Solidity。這裡的區別是類似面向物件程式設計和麵向過程程式設計的區別,具體語法,語義,格式等方面的差異並不重要。Oxidation程式設計模型其核心邏輯基於函式程式設計(Functional Programming),這麼做的原因是交易邏輯的程式碼能夠比較容易在編譯器層面被切分,繼而方便在各個共識組中接力執行。而上層開發者則比較容易用函式程式設計的方式來表達對分片系統比較友好的交易邏輯。至於其他計算表達,狀態定義,流程控制等程式設計特性分片系統不需要語言層面的特殊支援,與普通系統無異。
3. 保證單共識組的安全在單鏈系統中,系統的安全性依賴多數誠實礦工或驗證者來保障安全,例如PoW系統需要51%,類BFT系統通常需要2/3等。當全網被N個分片隔離,每個分片獨立出塊的時候,簡單的思路會導致單個分片內部最低只有1/N的誠實算力(或驗證墊資)來抵禦攻擊。在我們提出的非同步共識組中,我們拓展了PoW的挖礦機制,執行一個礦工同時參與多個共識組內部的挖礦競爭,可以收穫到多個共識組裡面的出塊獎勵。至關重要的是,對於一個參與K個共識組挖礦的礦工,其實際有效算力會被放大為其物理算力的K倍,並且其放大後的算力必須平均分配到這K個共識組。從而使得單個共識組的實際有效算力,將等同於全網的物理算力,那麼攻擊單個共識組將變得和攻擊全網一樣的難。我們將這個機制稱為連弩挖礦(Chu-ko-nu Mining),這個機制保證了將誠實礦工(平均貢獻算力到多個共識組)的有效算力放大了N倍,而對於攻擊者(針對特定共識組)來說,這裡的算力放大則無效。注意,這裡的誠實礦工的有效算力放大倍數,和全網的分片個數相同,從而保障了全網在高度分片之後仍舊具備同單鏈系統一樣的安全性。
侷限性
估計大家很少看到介紹自己工作的文章,會有這個章節。但其實我覺得應該有,讓大家知道特定的技術邊界,總好過事後牛皮吹破,系統實現不出來。首先這個技術算是突破了區塊鏈所謂的不可能三角嗎? 我認為是,雖然還不算徹底,但是可以說撕開了一個巨大的口子。這個工作並不能實現無限的伸縮性,基於當前網際網路頻寬,系統的伸縮性大致會止步於百萬TPS和幾十萬個共識組的規模。這是因為,為了使得跨片交易得以正確安全地完成,共識組之間需要傳遞成鏈的塊頭資訊,這部分資訊在共識組數量達到一定規模之後,會佔據相當的頻寬消耗。
具體來說,每個單節點的需要觀察所有共識組中的構造鏈的過程以及他們可能出現的分叉。這個代價是 每個共識組每塊大致256個位元組。那麼在我們現在的實驗中,達到11694.9 TPS的時候,這個部分的消耗是279.6kbps,與之相關的儲存和計算代價可以忽略不計。按照前面實驗中單節點頻寬限定,這個部分佔據了近1%。也就是說在30Mbps的單節點頻寬約束之下,共識組的數量的天花板在20萬左右,當然這時全網吞吐量將可以高達百萬TPS,全網狀態記憶體容量將超過1PB (1,000,000 GB)。 值得一提的是,這個代價是和出塊尺寸無關,需要傳播的僅為塊頭,和單位時間出塊個數有關。那麼,我們可以擴大出塊尺寸,同時等比提高出塊間隔,來降低這個部分的開銷,並且保持吞吐量不變,單節點壓力也不增加。只是這樣做會使得交易確認時間變長。
限制共識組數量的另一個因素是社群的規模,全網礦工節點和全節點的總和。對於單個共識組來說,參與其中的節點不能太少(至少要過百吧),否則會容易暴露出塊節點(礦工)的物理IP地址,也會增大全節點被隔離欺騙(與全節點連線的其他對等節點全部是惡意節點)的概率。雖然這兩點都不會直接導致共識演算法失效,但是有可能降低攻擊壁壘。在非同步共識組中,我們鼓勵一個全節點參與多個共識組,而礦工節點參與多個共識組更是有利可圖,這在一定程度上緩解了這個問題。 所以,對於分片系統來說,吞吐量和容量從來都不是一個單一的數字,而是一個根據具體應用場景,安全約束,延遲敏感程度,社群發展階段,交易活躍度等多方面考慮的權衡設計,是一個可以調整的東西。當然,無論具體應用場景是什麼,非同步共識組的1000倍提升這個底線總是可以輕鬆獲得的。
我們將在2月26日,NDSI 2019第一天的會議上,宣講論文的技術細節。歡迎大家來波士頓面基,探討合作。
我們這個工作重點在於有效地橫向擴容,在技術上和很多研究新型共識機制的工作是正交的,我們的實驗中共識組內部採用了最樸素的經典PoW演算法(15.6TPS),完全可以替換為其他更高效的新型單鏈共識系統。我們樂於和現有的或者未來的公鏈團隊合作,為現有的單鏈系統作橫向的擴容,在不增加單節點壓力的前提下,輕鬆獲得至少百倍吞吐量和效能的提升。