前言
大家可能會驚訝的發現,目前大部分的公鏈項目,不約而同的走向統一方向:
“PoS提速并解決計算冗余、隨機數信標保證去中心化、staking保證安全性、周期性最終確認保證輕量”。
包括剛公布的ETH2.0、algo以及不少新公鏈,VRF/VDF慢慢仿佛要成為下一個保證去中心化的標準,PoW的原始支持者也逐漸認識到了切換PoS后帶來性能飛越,甚至荒廢了三四年的“世界超級計算機”的概念,也被越來越多的項目方提起了。
DFINITY算是最早堅持以上標準的項目,從2017年起就沒有轉變過PoS+隨機數+WASM虛擬機的技術方向(以太坊2.0表示 “ 真香!”)。共識方面的設計可以說是它最大的技術亮點,技術白皮書以分層的結構介紹了一致性共識的達成,文中將按步驟分解,簡單幫助大家講解共識。并簡述技術特點,與其他項目做比較,揭示這樣優缺點帶來的影響。
共識過程
DFINITY的共識是按照輪為單位進行的,每一輪產出本輪的一個區塊,一輪的時間為區塊時間,輪次等于區塊高度。
1. 開始前的節點準備(按順序)
· 節點創建私鑰公鑰,建立匿名的永久身份。
· 節點加入網絡需要抵押固定的token作為staking。
· 節點隨機的與其他節點組成閥值組(完全隨機,一個節點可存在于多個閥值組)
· 閥值組中,運行分布式密鑰協議(DKG),每個節點獲取該組的“驗證簽名”密鑰(不同于個人密鑰,有一組的私鑰數學拆分而來)。
· 系統還是根據DKG產生閥值組的共同公鑰,并對閥值組進行注冊。
· 準備就緒,開始等待參與共識。
2. 第R輪共識
step1 選擇本輪委員會組
· 系統根據R-1輪次生成的隨機數ξR,在已有的閥值組中隨機的選擇R輪的委員會。
step2 提案委員會打包出塊
· 選出的委員會分成兩部分,提案組與驗證組,提案組先收集用戶發送的交易,檢驗合法后進行打包,出塊與常見區塊鏈項目一致。
step3 公證委員會持續接收并驗證區塊
· 接受區塊:持續的接受提案組產出的區塊,直到觀測到下一個隨機數ξR+1的產生。
· 檢驗合法:接受區塊后首先檢驗是由合法有效(有無引用R-1區塊的公證),不合法就丟棄。
· 計算優先級:運行“概率插槽協議”,計算連續兩個區塊的權重,這是根據由隨機數得出的區塊權重得出的。
· 簽名并廣播:如果上一步中區塊權重高于上一個接收到的,簽名并廣播;否則就丟棄區塊。
step4 隨機數信標收集簽名
· 隨機數信標持續的收集公證者廣播的簽名部分,并記錄數目。
等待閥值,產出公證與隨機數
· 一但對單個區塊,接受了超過50%公證者的簽名,馬上聚合簽名,產出公證Zr(本質是時間戳)并寫入區塊廣播。
· 同時產生根據這些簽名產生隨機數ξR+1,廣播。
R+1 step0 同步正確區塊,R+1輪開始,回到strp1
· 此時廣播傳播全網,R輪委員會全部停止工作,節點開始同步被公證的區塊。
· 根據隨機數ξR+1選擇R+1輪的委員會組。
共識特點
DFINITY是一個試圖“擴展當前互聯網”的區塊鏈項目,是由所有參與網絡的P2P客戶端(DFINITY中稱節點node為客戶端client)共同維護并提供資源的“世界超級計算機“,這臺計算機上“安裝”的如軟件具備了區塊鏈上智能合約的不可篡改與可信的屬性,但同時必須能夠承載大規模服務,并能夠完全托管軟件。
不同于以太坊的DApp只是適時調用合約,DFINITY設想的軟件是完全依靠智能合約來驅動服務的。綜上來講,DFINITY需要非常高的計算性能、減少計算冗余,因此DFINITY但同時還得在保證去中心化的情況下 做到足夠安全,因此這對它的共識算法提出了苛刻的要求。
1. 從“完美的隨機數”出發
DFINIFTY共識最重要的組成部分即為隨機數信標部分,需要做的事情有:
· 選擇共識參與組:在DFINIFTY這個無準入(不需要申請即可加入,反例是EOS)的網絡中,參與網絡的節點數以萬計,且分布在世界各地,因此所有節點共同達成一致性的效率就非常之低,系統得選擇一小部分成員來參加共識來保證速度。但是為了保證去中心化,成員必須隨機選擇。去中心化與性能的基礎基于隨機數。
· 決定區塊的權重:用于判斷最終確定鏈,快速的獲得最終確認時間,剪除分叉。
· 給鏈上應用提供隨機源:智能合約上很多DApp都是自己寫的隨機數方案,非常不成熟,經常會有應用因為不安全的隨機數而被黑客攻擊的新聞出現,這里直接從底層提供了穩定隨機數。
VRF涉及很多數學演算,我們可以將其視為一個黑箱子,一段是輸入,一段是輸出。輸入是一組客戶端的簽名,輸出是一個準確的隨機數。只有在獲取了足夠多的客戶端簽名,黑箱子才能輸出隨機數,再此之前,沒有任何一個客戶端能知道或預測它的輸出。“足夠多”簽名的閥值為50%,因此這個VRF的過程也叫做“閥值簽名”。
這個VRF很特殊,因為它具備三個特點:
· 可驗證:一但輸出了隨機數,大家都可以拿著客戶端的簽名對其進行驗證。VRF的”V”就體現在這里。
· 唯一確定性:一但有超過50%的客戶端發送了簽名,黑箱子接受到后會獲得唯一的一個確定的隨機數。這里是因為使用的私鑰簽名算法具有唯一性,也就是統一密鑰對統一數據的多次簽名的結果都不相同,只有一個可以合法的驗證。
· 非交互:在產生隨機數的過程中,雖然黑箱子需要收集大家的簽名,但是客戶端之間不需要進行交流,更沒法干擾到隨機數的從產生。
在已知的密碼學算法里,只有BLS算法能做到以上三點,而BLS算法的提出者之一“L” Lynn正是DFINITY的高級工程師。其他的隨機數方案,要么驗證起來難度極高(連續哈希),要么無法保證唯一性,要么就是沒有閥值的設計,必須進行交互,存在“最后一個參與者”就能間接影響隨機數偏差的情況(以太坊的RANDAO與VDF)。
當然這個VRF還是一點問題,選取的一組共識者中如果有超過50%被攻擊者掌握,那么他可以間接的干擾到隨機數的生成,當然來預測隨機數還是基本不可能的,沒法直接控制。攻擊者還可以不發送簽名,讓隨機數生成過程停止,從而讓整個系統宕機。當然這都是攻擊者掌握了超過50%節點的情況下,這在staking里難度很大的,真做到了也沒有那個共識算法頂得住。
2. 非交互式
使用隨機數在全網中篩選節點組成共識組,來參與共識的項目不少,包括固定選擇的DPOS、DBFT(NEO的共識),以及分輪次隨機選取的,比如Algorand、Cardano,包括DFINITY,在選出了共識組后,組內成員都會出塊,這時存在多個區塊,需要獲得唯一的共識。
因此其他的項目比如NEO、Algorand、Cardano都是運行完整的拜占庭容錯協議,在組中達成一致的協議,對區塊進行確認。但是這個只要運行拜占庭協議,就意味著你的共識組不能過大,最大只能100個節點左右,再多就會存在性能與帶寬爆炸的問題。所以就會有21個組輪流出塊的設計,這大大拉低了項目的去中心化程度。
但如果你把組做的很大,像algo那種2000多人的大組,這個共識組在運行拜占庭容錯協議時,就需要經歷數十次的數據交互,同時傳送一個非常龐大的簽名數據,這樣對整個網絡的帶寬要求就非常之高,普通人很難參與進來。
說回DFINITY,首先由隨機數公開的選出了400個客戶端一組的出塊組,來打包交易并出塊。每一個客戶端都會出塊,還有一組同時隨機數選出的驗證者,他們會接受區塊,同時運行一個根據隨機數判斷區塊權重的協議,驗證者只簽名權重最高的節點,期間大家不會交互,不會進行拜占庭共識互相發送簽名數據,主要是固定區塊時間里不斷尋找權重最高的區塊即可。在一個區塊接受到了超過50%個驗證者的簽名后(是單獨簽名的,不是一起聯合簽名的),系統會自動聚合區塊上的簽名,并確認區塊為唯一,一但客戶端觀察到聚合的簽名,就會進入下一輪共識。
可以看到,整個過程都沒有進行拜占庭協議,只是遵序三個原則:
· 客戶端遵序最高權限的原則對區塊簽名,權重越高的鏈越會被確認
· 系統遵循50%以上簽名產出隨機數信標的原則
· 大家遵序一看到新的隨機數信標馬上進入下一輪共識的原則
三個原則就像三把鋒利的奧卡姆剃刀,剔除了多余的無效區塊,獲得了唯一的區塊,從而近似的達成了一致性共識(說近似是因為可能有同時存在兩個被公證區塊)。整個通訊過程幾乎為零,在廣播gossip協議的網絡中,一個有400個節點的組網,只需轉發大約20KB的通信數據,即可產生閾值簽名。而一個小組的分布式簽名密鑰的生成,是在小組創建時就分配好的,不需要在共識階段產生,一次生成多次使用。
我們可以來類比一下非常相似但由兩輪拜占庭共識交互的Algorand。Algo的隨機數抽簽過程是隱秘式的,也就是說節點只知道自己被選擇與否,它卻不知道全網中有多少節點被選中。因此Alogo共識前必須遍歷一編全部網絡,進行一次拜占庭才能知道全部的被選取的驗證組,因此這里的延遲時間與帶寬使用就很高了。再加上前面講的超大驗證組(2000人到4000人)的拜占庭通訊輪次與簽名數據的問題,Algo共識下帶寬使用非常爆炸,這種人是沒這個能力參與的。
3. 超快的最終確認
脫離最終確認時間談TPS的都是耍流氓,有個笑話,拿卡車運裝滿數據的硬盤,你算算這個TPS也非常大了,可是沒有最終確認與相應,顯然是不能用的。不說比特幣與以太坊,我們可以看到大量的新公鏈,特別是做多鏈分片的項目,就存在最終確認的嚴重滯后問題。
PoW與傳統PoS,只能近似的獲得一個最終確定性,也就是回滾概率趨近于0的時候,這就導致大額交易需要等待多個區塊確認。并且因為沒一個準信,每一個節點都得存儲全部的副本,防止分叉的回滾。這就導致整個賬本體積大的嚇人,普通人基本告別全節點,隨著區塊的增長,以太坊的全節點數量就下降的非常快,如此下去,系統又得回到中心化脆弱的狀態下了。
可以從上面了解到,DFINITY的共識是按輪次進行的,每一輪共識的開始與結束的標志,都是觀察到隨機數信標產生新的隨機數,而這個隨機數是系統聚合簽名產生公證的同時更新的。因此這DFINITY的區塊高度必須與輪次一致,每一輪中生產的區塊,必須是引用了上一輪的公證簽名,不然視為非法。同時公正組只會簽名本輪產生的區塊,不會對之前輪次的區塊簽名。
總結為兩個強制:
· 只有本輪發布的區塊才能被公證;
· 只有引用上一輪被公證的本輪區塊才是合法的;
這保證了出塊與公證兩個過程,都沒法被惡意扣留,因此攻擊者沒辦法偷偷來準備一條比主鏈更長的影子鏈,來做雙花攻擊,因為從影子鏈的第一個區塊起就不合法了。
因為存在上述“驗證者組單獨簽名,系統聚合簽名產生公證”的公證過程,因此每一輪后基本可以做出唯一性的確認。但也有會出現兩個或以上區塊同時通過公證的情況,因此一輪結束后還不能做到最終確認,這時就需要在下一輪中繼續判斷。此時等待出塊過程完成,因為出塊者可能選擇在上一輪同時被公證的區塊后面繼續生產,所以同時存在幾條分叉。
還記得上面講的“概率插槽協議”(PSP)階段嗎?驗證者會計算權重來判斷唯一區塊,沒錯,這里驗證者還是會對著區塊計算這條鏈上的總權重,這是權重高的一條鏈就作為唯一確認鏈,然后驗證者才會對他進行簽名。因此當本輪出現了新隨機數時,也就意味著分叉已經被剪除,而上一輪的區塊,包括其中的交易,都獲得了最終的確認。
最終確認時間=兩個出塊間隔+網絡遍歷傳輸延遲
因此一個交易可以在幾秒鐘里完成最終確認,再也沒法對其進行回滾。可以對比一下以太坊2.0,它用的是每隔100個區塊創建一個檢查點來做最終確認的方案,最終確認時長大約為10分鐘左右。
快速確認不僅提高了性能,剪除了分叉,降低了系統的冗余度,并且可以讓客戶端不用存儲全部要歷史區塊數據,任何一個新加入的區塊,只要從最近的確認區塊開始即可。
4. 幾乎無限的彈性擴展性能
這同樣是優秀的隨機數給DFINITY帶來的好處。DFINITY的網絡可以近乎無限的擴展,因為整個隨機數的產出,包括出塊與公證,都是由固定數目的委員會組來執行的,客戶端新節點的加入不會影響到運行的速度。而每一個客戶端,都需要一定性能的計算與存儲性能,這位整個“世界計算機”提供了近乎無限的資源。
單鏈的性能已經足夠強大,而DFINITY又天然適合分片。
上面講到,DFINITY隨機產生多個閥值組的,因此多組間并行運行,從而實現分片,是相當輕松的。以太坊2.0的分片方式也非常近似。
但這部分官方披露的并不多,還需要一個片間協作的機制。同時涉及到智能合約運行,也存在以太坊2.0分片上類似的問題,也就是合約具體該運行在哪一個分片上?
特別是DFINITY這種存儲軟件全部結果狀態的,因為雖然分片能對計算性能進行擴展,但我們得同時考慮存儲與網絡的擴展性,如果運行軟件的組根據隨機數不斷變動,那么存儲的分布如果是全節點一起同步,這樣存儲冗余度上來了,也就稱不上擴展了;如果隨出塊運算同步的分散存儲,那么存儲的數據分布可能是不均的,而軟件運行需要的數據從一個節點傳到另一個節點是需要耗費時間的,這樣帶寬可能就撐不住了。
希望DFINITY能在分片層上也作出優秀的設計,學習以太坊2.0的合約固定運行在單獨分片上,或片間快照轉移也是沒問題的。
評論
查看更多