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