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