關(guān)于共識(shí)機(jī)制的討論已經(jīng)有許多,但這些分析大多不全。在碳鏈價(jià)值舉辦的「碳話」線下沙龍第一期活動(dòng)中,Conflux研究總監(jiān)楊光博士用一萬(wàn)三千余字,全面分析了POW與POS共識(shí)機(jī)制的原理、運(yùn)行時(shí)遇到的問(wèn)題,以及兩者的優(yōu)劣比較。
首先給大家簡(jiǎn)單介紹一下我們的 Conflux 團(tuán)隊(duì):我們團(tuán)隊(duì)的核心是姚班的幾個(gè)同學(xué)以及師弟,并且有幸請(qǐng)到姚期智先生擔(dān)任我們的首席科學(xué)家和顧問(wèn)。我們之所以投入到區(qū)塊鏈這個(gè)行業(yè)中來(lái),是因?yàn)檫@個(gè)行業(yè)里邊有很多非常重要也很有意義的新問(wèn)題——以我最熟悉的密碼學(xué)和博弈論為例,區(qū)塊鏈面對(duì)的和要解決的很多問(wèn)題已經(jīng)是學(xué)術(shù)界最前沿的研究方向了。這些問(wèn)題不是單靠工程師就可以解決的,而是需要更多學(xué)術(shù)界的力量參與進(jìn)來(lái),大家一起合作才能推動(dòng)整個(gè)區(qū)塊鏈行業(yè)往前發(fā)展得更好。
1. 女巫攻擊與區(qū)塊鏈共識(shí)協(xié)議
今天我來(lái)講一下 PoW 和 PoS 的對(duì)比。我們先來(lái)回顧一下最典型的區(qū)塊鏈共識(shí)協(xié)議:大家把交易打包成塊,通過(guò)哈希引用把塊連接成一條鏈,就得到了一個(gè)共享的賬本。但是直接這樣用一個(gè)賬本肯定是很不安全的,因?yàn)閴娜艘部梢栽煲粋€(gè)賬本,然后把兩個(gè)賬本同時(shí)擺在你面前,哪個(gè)是真的哪個(gè)是假的,我們應(yīng)該相信哪一個(gè),這就成了一個(gè)問(wèn)題。
如果是中心化的,當(dāng)然這個(gè)問(wèn)題非常好解決——我用支付寶,支付寶說(shuō)我賬戶有多少錢(qián),那就是多少錢(qián)。如果和事實(shí)不一致的話,我有不同意見(jiàn)可以去法院告他。但如果是去中心化的,這件事就很難說(shuō)了。去中心化的時(shí)候,大家沒(méi)有一個(gè)這樣一錘定音的機(jī)構(gòu),需要通過(guò)其他方式達(dá)成共識(shí),才能有一個(gè)公正的賬本。那么在去中心化的環(huán)境下,應(yīng)該怎樣做共識(shí)呢?一個(gè)很容易想到的辦法就是我們投票,大家共同投票,投出來(lái)一個(gè)賬本,然后都相信這個(gè)就行。
但是,既然說(shuō)到投票,那么首先就有一個(gè)投票的公平性問(wèn)題:投票權(quán)要怎么分配?比如今天我們大家一起投票,然后我手里有一百票,在坐的各位每人一票,我們這個(gè)不叫投票,我有一百票,基本上我說(shuō)什么想投什么,結(jié)果就是什么樣的。如果我們真的想達(dá)到一個(gè)共識(shí),就不可能用這種特別不公平的方式去投票。所以投票權(quán)的分配是共識(shí)協(xié)議里面最核心最重要的部分之一。在線下投票權(quán)分配的問(wèn)題其實(shí)比較容易解決:我們就簡(jiǎn)單的一人一票即可。大家都有身份證,然后投票的時(shí)候登記一下就行了。但是線上的話,要想實(shí)現(xiàn)一人一票就非常困難。
首先,你在線上的環(huán)境中,特別是去中心化的環(huán)境中,如何定義「什么叫做一個(gè)人」,這就是一個(gè)很大的問(wèn)題。你是把一個(gè)賬戶當(dāng)一個(gè)人還是一個(gè)ip當(dāng)一個(gè)人,還是說(shuō)你用別的什么方法去確定?在網(wǎng)上的話,大家都是以匿名的方式存在的,你在聊天的時(shí)候,你甚至都無(wú)法判斷網(wǎng)絡(luò)另一邊跟你聊天的到底是一個(gè)摳腳大漢還是一條狗。因此,我們就需要一個(gè)抗女巫攻擊的機(jī)制。
我們先簡(jiǎn)單講一下什么是女巫攻擊:它是說(shuō)攻擊者可以低成本地制造很多賬戶,然后控制這些賬戶一塊兒去行動(dòng),讓別人看上去以為人多勢(shì)眾的樣子。 比如說(shuō)在論壇上大家會(huì)見(jiàn)到有水軍引導(dǎo)輿論,再比如電影評(píng)分的網(wǎng)站也會(huì)有人專門(mén)去組織去在上面刷評(píng)論刷分。如果說(shuō)有很多這種水軍馬甲的賬號(hào)在攻擊的話,你最后投票得到的結(jié)果就不是真實(shí)的。有可能某個(gè)人通過(guò)這種方式投出非常多的票,最后投票的結(jié)果就是完全受這一個(gè)人控制的。在傳統(tǒng)的互聯(lián)網(wǎng)環(huán)境下,我們有很多對(duì)抗女巫攻擊的方式,比如增加每個(gè)賬戶的注冊(cè)成本。大家在網(wǎng)上要注冊(cè)一個(gè)賬號(hào)的時(shí)候,常常需要輸入一個(gè)驗(yàn)證碼,這件事就是計(jì)算機(jī)實(shí)現(xiàn)起來(lái)比較麻煩,即使能寫(xiě)程序做也比較困難,但人去做的話就很簡(jiǎn)單;還有的網(wǎng)站注冊(cè)的時(shí)候要求綁定一個(gè)手機(jī)號(hào),或者檢測(cè)ip地址,這都是比較常見(jiàn)的抗女巫攻擊的方式。但是在去中心化的環(huán)境下,以上那些方式就不好用了。因?yàn)槿ブ行幕沫h(huán)境下,誰(shuí)去發(fā)布這個(gè)驗(yàn)證碼,誰(shuí)去判斷驗(yàn)證碼填得對(duì)不對(duì)?然后誰(shuí)去驗(yàn)證手機(jī)號(hào)?即使用ip地址的話,其實(shí)也是一個(gè)非常不公平的方式。因?yàn)槲覀冎啦⒉皇敲總€(gè)人都平等地享有一個(gè)靜態(tài)的ip地址的。
所以在區(qū)塊鏈中,我們實(shí)際上用到的解決方案最常見(jiàn)的就是一個(gè)工作量證明(PoW),一個(gè)是權(quán)益證明(PoS),后者包括代理的權(quán)益證明(DPoS)。還有一些其他的證明方式,比如說(shuō)證明你擁有多少空間,或者證明你燃燒了多少貨幣,還有別的一些方法,但是目前最主要最常見(jiàn)的還是 PoW 和 PoS 這兩種。這里我還要稍微強(qiáng)調(diào)一下,無(wú)論 PoW 還是 PoS 或者別的什么 PoX,都是抗女巫攻擊的機(jī)制,是共識(shí)算法(協(xié)議)里邊一個(gè)重要的組成部分,但它們本身不等價(jià)于共識(shí)算法。
2. 工作量證明
接下來(lái)我先講一下大家都比較熟悉的工作量證明。
工作量證明的基本思想就是算力決定出塊權(quán)。如果你能解出一個(gè) PoW 計(jì)算難題,你就可以出塊。粗糙地概括下,可以理解為一個(gè)CPU一票,或者一個(gè)GPU、一臺(tái)礦機(jī)一票,大概是這么個(gè)意思。它的好處首先是這個(gè)系統(tǒng)是無(wú)許可的。參與者不需要任何人許可,只要有機(jī)器有算力就可以參與——理論上甚至都不一定需要機(jī)器。如果說(shuō)你可以手動(dòng)算出一個(gè)區(qū)塊的哈希,并及時(shí)把這個(gè)上傳上去,別人也會(huì)承認(rèn)這是一個(gè)合法的區(qū)塊。還有一個(gè)是PoW投票行為本身成本是比較高的,不管用CPU、GPU還是用礦機(jī),機(jī)器的成本和電力的成本,都是要實(shí)打?qū)嵉鼗ǔ鋈サ?。這就跟我們之前說(shuō)的驗(yàn)證碼,其實(shí)形式上有一點(diǎn)像,對(duì)吧?有一些驗(yàn)證碼,人看了以后還是要花一點(diǎn)時(shí)間去識(shí)別里邊的數(shù)字或者字母到底是什么,然后才能打上去通過(guò)驗(yàn)證。工作量證明一個(gè)最大的優(yōu)點(diǎn),我認(rèn)為就是所投的票和投票權(quán)是綁定的:一旦投票成功以后,即使是投票者本人也修改不了投票的內(nèi)容。
按照工作量證明的一般邏輯,投票的時(shí)候需要先打包出一個(gè)塊,然后再對(duì)這個(gè)塊做工作量證明,如果做出來(lái)證明就相當(dāng)于投出去一票,但是這個(gè)時(shí)候打包的塊已經(jīng)沒(méi)有辦法修改了。例如我的礦機(jī)跑一天可以投出很多票,但是如果我想把之前一天的算力集中到新的一個(gè)塊上,這是辦不到的;另一方面,如果我想要回滾掉自己出的塊,我也必須付出和回滾別人的塊時(shí)候所需的同等的算力。這是PoW一個(gè)特別好的特點(diǎn)。
當(dāng)然基于PoW機(jī)制去做共識(shí)算法也有一些缺點(diǎn)。首先這個(gè)缺點(diǎn)就是延遲比較高,因?yàn)槲覀儼呀灰状虬絽^(qū)塊以后,這個(gè)區(qū)塊不是馬上就成為一個(gè)有效的候選區(qū)塊的,至少還要完成一個(gè)工作量證明這個(gè)區(qū)塊才能稱為候選區(qū)塊。這里工作量證明的時(shí)間不能設(shè)得特別短,等一下我會(huì)講為什么不能太短。于是,至少?gòu)拇虬脜^(qū)塊到做完區(qū)塊的工作量證明這一段時(shí)間內(nèi),你這個(gè)交易是不可能被人確認(rèn)的。所以說(shuō)即便比特幣不是等六個(gè)塊確認(rèn),而是看到一個(gè)塊就確認(rèn),確認(rèn)一筆交易平均也要等十分鐘時(shí)間。PoW機(jī)制另一個(gè)被人詬病的點(diǎn)就是能耗特別高、不環(huán)保。對(duì)于這一點(diǎn),工作量證明的能耗是否必要,我覺(jué)得是見(jiàn)仁見(jiàn)智的,可以持保留意見(jiàn)。但是我們既然是在談工作量證明,那么這個(gè)工作量怎么也是沒(méi)辦法省掉的,如果省掉的話它就叫別的名了。
我們看一下如何解決基于PoW的共識(shí)的主要問(wèn)題。
第一個(gè)是說(shuō)確認(rèn)速度慢。以比特幣為例,出一個(gè)塊平均要十分鐘,確認(rèn)的話還要再等六個(gè)塊,就平均要一個(gè)小時(shí)。第二個(gè)是吞吐量比較低,大家都很清楚,比特幣在這點(diǎn)上已經(jīng)被人批評(píng)好幾年了。然后第三點(diǎn)就是能耗高不環(huán)保。但是第三點(diǎn),既然我們要用PoW,這點(diǎn)能耗是避免不了的,所以我們也就不想著去解決這個(gè)問(wèn)題了。
對(duì)前面兩個(gè)問(wèn)題,確認(rèn)速度慢和吞吐量低。其實(shí)這兩個(gè)問(wèn)題看上去都有一個(gè)很簡(jiǎn)單的解決方法——降低PoW問(wèn)題的目標(biāo)難度,提高出塊速度。實(shí)際上萊特幣就是這么做的。它把目標(biāo)難度從比特幣的10分鐘降到2.5分鐘,然后一下子出塊速度就比特幣快四倍。還有一個(gè)提高吞吐量的方法就是增大塊容量,比如BCH就把每個(gè)塊從1M先擴(kuò)大到8M,然后又?jǐn)U大到32M,甚至后來(lái)還有提議說(shuō)要改到128M。很直觀地,同樣的出塊速度下,塊越大吞吐量也就越大。
是不是這么簡(jiǎn)單就可以解決比特幣確認(rèn)速度慢和存儲(chǔ)量低的問(wèn)題呢?當(dāng)然不會(huì)。要真這么簡(jiǎn)單的話,比特幣也不會(huì)現(xiàn)在是十分鐘1M的設(shè)定了。為什么剛才說(shuō)的方法不能解決問(wèn)題呢?因?yàn)楫?dāng)我們出塊速度快了以后,區(qū)塊鏈就會(huì)很頻繁地出現(xiàn)分叉,特別是當(dāng)你出塊的速度超過(guò)廣播速度的時(shí)候,分叉的情況就會(huì)特別嚴(yán)重。
如果我們降低PoW問(wèn)題的難度,提高出塊速度,然后增大區(qū)塊容量,實(shí)際上在網(wǎng)絡(luò)條件一定的情況下,肯定是會(huì)降低廣播速度的。因?yàn)閰^(qū)塊越大,廣播得就越慢。然后如果說(shuō)你出塊速度快但是廣播速度慢,也就是說(shuō)我在收到別人新出的一個(gè)塊之前,自己也能挖到一個(gè)塊,這樣的話就會(huì)出現(xiàn)分叉。然后如果說(shuō)這個(gè)差距比較大的話,分叉就會(huì)特別多。
分叉多了以后有什么不好?最大的不好就是會(huì)降低安全性。在比特幣里邊我們常說(shuō)壞人攻擊需要51%的算力。 這個(gè)前提是說(shuō)好人都集中在一條主鏈上。這樣的話,好人有49%集中在上面,壞人有51%才能攻擊。但如果真的出現(xiàn)這種頻繁分叉的情況,比如說(shuō)我在分叉A上有30%的算力,在分叉B上有40%的算力。這個(gè)時(shí)候壞人想把分叉B給回滾改到分叉A,它不需要很多,它只需要11%算力就可以。只要比全世界的誠(chéng)實(shí)的算力最多的兩個(gè)分叉之間的差稍微多一點(diǎn),攻擊者就可以讓最長(zhǎng)鏈在這兩個(gè)上面分支上跳來(lái)跳去。所以如果真的簡(jiǎn)單粗暴地去改比特幣的參數(shù),最后安全性肯定會(huì)降低。
但是我認(rèn)為這個(gè)安全性降低其實(shí)不能怪PoW。PoW在這里邊只是一個(gè)抗女巫攻擊的機(jī)制,而且它的難度是可以調(diào)的。這里安全性降低的罪魁禍?zhǔn)走@個(gè)鍋得讓“最長(zhǎng)鏈”而不是PoW去背。為什么會(huì)分叉多安全性低?其實(shí)是因?yàn)楸忍貛挪捎昧俗铋L(zhǎng)鏈共識(shí)。在最長(zhǎng)鏈機(jī)制下,如果出現(xiàn)分叉,誠(chéng)實(shí)的算力很可能會(huì)跟著分叉,也就意味著誠(chéng)實(shí)的人投票就會(huì)分叉,這樣的話壞人就更容易操縱最后的結(jié)果。
然后下一個(gè)問(wèn)題:基于PoW的最長(zhǎng)鏈共識(shí)為什么會(huì)分叉?是不是說(shuō)如果大家都是好人,就不會(huì)分叉?
這個(gè)也不是的。我們用圖里邊每條線表示是一個(gè)節(jié)點(diǎn),向右的這個(gè)箭頭表示的是時(shí)間。當(dāng)這個(gè)節(jié)點(diǎn)產(chǎn)生一個(gè)區(qū)塊的時(shí)候,它需要把區(qū)塊廣播出去,但是廣播出去要消耗時(shí)間,所以會(huì)形成一個(gè)“事件光錐”。距離產(chǎn)生區(qū)塊的節(jié)點(diǎn)越遠(yuǎn),收到廣播過(guò)去的區(qū)塊所花的時(shí)間也越久,相應(yīng)的要等到更晚的時(shí)間以后才能看到剛才生成的新區(qū)塊。也就是說(shuō)只有在這個(gè)黃色區(qū)域及以后其他的節(jié)點(diǎn)才能看到你這邊產(chǎn)生的一個(gè)區(qū)塊。既然有光錐,相應(yīng)的也就有光錐外的區(qū)域,也就是圖上綠色的部分。當(dāng)一個(gè)節(jié)點(diǎn)處在這個(gè)光錐外區(qū)域的時(shí)候,他是不可能知道你這邊剛剛產(chǎn)生了一個(gè)區(qū)塊的,因?yàn)檫€沒(méi)有廣播過(guò)來(lái)。也就是說(shuō),如果網(wǎng)絡(luò)里產(chǎn)生的下一個(gè)區(qū)塊是在后邊黃色的這部分,那么當(dāng)然很安全,因?yàn)檫@個(gè)時(shí)候所有的節(jié)點(diǎn)都看到最新的區(qū)塊了,然后他們?cè)偕a(chǎn)區(qū)塊都會(huì)跟在后面就不會(huì)出現(xiàn)分叉——如果大家都是好人的話。
但是如果說(shuō)出塊的速度比較快,我在綠色的光錐外區(qū)域就產(chǎn)生區(qū)塊,那就必然會(huì)出現(xiàn)分叉,然后最后會(huì)出現(xiàn)孤塊,對(duì)吧?因?yàn)檫@兩個(gè)區(qū)塊互相都是不可能引用的。所以簡(jiǎn)單的來(lái)估計(jì)一下,孤塊率大致是等于光錐外這個(gè)區(qū)域的面積除以期望的出塊間隔的總面積。因?yàn)槌鰤K的事件在期望的區(qū)塊間隔內(nèi)是以相等的概率隨機(jī)出現(xiàn)的。另一方面,綠色的光錐外區(qū)域面積所占的比例越小,就表示出現(xiàn)孤塊的可能性就越低。
但實(shí)際中我們肯定不會(huì)只有四個(gè)節(jié)點(diǎn),我們節(jié)點(diǎn)會(huì)非常多,而節(jié)點(diǎn)多了以后,廣播的時(shí)間自然就會(huì)變長(zhǎng)。廣播的時(shí)間變長(zhǎng),就意味著光錐外的區(qū)域面積會(huì)變大,我們的出塊間隔也需要變長(zhǎng),這樣才能保證孤塊會(huì)被控制在一個(gè)比較小的范圍以內(nèi)。因?yàn)槠鋵?shí)孤塊本身也是對(duì)安全性有影響的,比如有20%的孤塊率的話,只需要41%而不是51%的算力就可以完成攻擊了。因此,為了提高安全性,為了降低孤塊,我們必須拉長(zhǎng)出塊的間隔。比如比特幣就定在了十分鐘。這個(gè)十分鐘當(dāng)然不是完全不能改的,只是改過(guò)以后安全性肯定會(huì)受到一點(diǎn)影響。
拉長(zhǎng)出塊間隔以后,整個(gè)系統(tǒng)的效率都會(huì)降低,特別是對(duì)吞吐量造成的影響很大。我們?cè)谶@兒看一下整個(gè)系統(tǒng)的帶寬,其實(shí)可以把它分成三部分:一部分帶寬(藍(lán)色部分)是大家在傳輸最終會(huì)加到共識(shí)里邊的交易;還有一部分帶寬(紅色部分)是大家在傳輸一些不加入共識(shí)的數(shù)據(jù),包括整個(gè)協(xié)議的開(kāi)銷(xiāo),還有一些可能是最終沒(méi)有被加入共識(shí)的作廢的塊和交易;最后一部分(白色),就是沒(méi)有被用到浪費(fèi)掉的帶寬。如果說(shuō)我們用 PoW 做抗女巫攻擊機(jī)制,再用最長(zhǎng)鏈的協(xié)議去計(jì)算最后的共識(shí)的話,我們對(duì)帶寬的利用率其實(shí)是非常低的。
以比特幣為例,我們600秒產(chǎn)生1MB有效的區(qū)塊,期望600秒才有1MB有效的這一塊,就算我這一個(gè)區(qū)塊再擴(kuò)大幾次,整個(gè)網(wǎng)絡(luò)里面600秒的時(shí)間,我有效利用的存儲(chǔ)的信息量可能還不到20MB吧?但現(xiàn)在網(wǎng)絡(luò)的平均速度已經(jīng)是600秒傳幾個(gè)GB了。所以它對(duì)整個(gè)網(wǎng)絡(luò)帶寬的利用率也就在1%左右,浪費(fèi)還是非常嚴(yán)重的。如果說(shuō)我們用一些技術(shù)把廣播的速度變快,比如說(shuō)用致密區(qū)塊的技術(shù),那么綠色的光錐外的區(qū)域這段時(shí)間就會(huì)變短。這樣我們也就可以等比例地把出塊間隔也縮短,在保持和之前相同的安全性的同時(shí)把帶寬的利用提高一點(diǎn)。但是即使是這么提高,只要我們是用最長(zhǎng)鏈并且要控制孤塊率,帶寬的利用率依然高不到哪兒去。一般來(lái)說(shuō),一個(gè)公鏈網(wǎng)絡(luò)可能會(huì)有幾千甚至上萬(wàn)個(gè)節(jié)點(diǎn),如果要廣播的話,平均可能要十次甚至更多次轉(zhuǎn)發(fā)。以需要十次轉(zhuǎn)發(fā)為例,從出塊的這個(gè)節(jié)點(diǎn)開(kāi)始,發(fā)送給下一個(gè)節(jié)點(diǎn),然后這個(gè)節(jié)點(diǎn)接受到區(qū)塊并且驗(yàn)證過(guò)以后再發(fā)送給下一個(gè)節(jié)點(diǎn),就這種過(guò)程要重復(fù)十次。在這十次轉(zhuǎn)發(fā)的全過(guò)程以內(nèi),如果我要降低孤塊率,就需要全網(wǎng)別的節(jié)點(diǎn)不要在這段時(shí)間內(nèi)產(chǎn)生第二個(gè)區(qū)塊,或者說(shuō)只有很低的概率產(chǎn)生第二個(gè)區(qū)塊。也就是說(shuō),這么長(zhǎng)的時(shí)間,大家其實(shí)只在廣播一個(gè)區(qū)塊。第一個(gè)人傳給第二個(gè)人以后,第二個(gè)人傳給第三個(gè)人的時(shí)候,第一個(gè)人就處于一個(gè)閑著的狀態(tài)了,對(duì)吧?所以最終的帶寬利用率自然不高??赡軙?huì)比之前有一個(gè)常數(shù)倍的改進(jìn),但也是遠(yuǎn)遠(yuǎn)不可能把整個(gè)帶寬用滿的,能用到1/10就已經(jīng)算很不錯(cuò)了。
既然這樣的話,如果說(shuō)我們想避免分叉,不可避免的帶寬就用不滿,帶寬用不滿的話,TPS就不可能高到哪去。因?yàn)槟阋还餐降臄?shù)據(jù)就那么多,那它里邊能放的交易就是有一個(gè)上限的——如果交易的尺寸不變的話(交易尺寸縮小也是可以提高TPS的,但是其他所有區(qū)塊鏈也可以用同樣的技術(shù),相對(duì)的劣勢(shì)依然不變)。
其實(shí)剛才要解決的問(wèn)題,就是說(shuō)出現(xiàn)分叉以后誠(chéng)實(shí)算力不集中,會(huì)降低安全性。但這個(gè)解決方案并不是說(shuō)只有降低分叉概率這一種方案去解決。比如我們也可以用基于 DAG 的有向無(wú)環(huán)圖去解決。
以太坊選擇分叉的時(shí)候用的不是最長(zhǎng)鏈而是 GHOST 協(xié)議。其實(shí)以太坊用的是一個(gè)稍微修改過(guò)的版本,這個(gè)協(xié)議核心思想是遇到分叉時(shí)候選擇擁有最重子樹(shù)的分支而不是有最長(zhǎng)子鏈的。這樣的話就不管你有沒(méi)有分叉,有多少分叉,安全性的問(wèn)題都不大。因?yàn)榧词故欠植娴恼\(chéng)實(shí)的礦工,依然會(huì)對(duì)之前的選擇貢獻(xiàn)安全性。比如說(shuō)礦工在靠后的一個(gè)區(qū)塊分叉,但是對(duì)于分叉之前的某個(gè)地方的分支應(yīng)該如何選擇,礦工依然是貢獻(xiàn)安全性的。它會(huì)在應(yīng)該選擇的分支的子樹(shù)上貢獻(xiàn)一個(gè)重量。
但是 GHOST 協(xié)議有一個(gè)缺點(diǎn):雖然說(shuō)它可以把帶寬用得比較充分,但同時(shí)浪費(fèi)也很?chē)?yán)重。 因?yàn)槟切┳罱K沒(méi)有被確定在最重子樹(shù)那條鏈上的區(qū)塊,它們里面的交易都是不算數(shù)的。大家挖到了一些區(qū)塊,但是最后都沒(méi)有加入共識(shí),這些區(qū)塊的吞吐量就被浪費(fèi)掉了。而我們的Conflux 其實(shí)和 GHOST 用了比較相似的方式去確定一條樞軸鏈,等確定好以后,我們?cè)侔阉械膮^(qū)塊排一個(gè)順序,這樣所有區(qū)塊里邊的交易都會(huì)對(duì)整個(gè)系統(tǒng)的吞吐量作出貢獻(xiàn)。當(dāng)然排過(guò)順序以后,還需要把里邊有沖突的或者重復(fù)的交易去做一些處理,沖突的交易肯定不能都執(zhí)行。如果我們從帶寬的角度去解釋的話, GHOST 這個(gè)協(xié)議可以把帶寬利用得非常好,但它整個(gè)系統(tǒng)的開(kāi)銷(xiāo)比較大,因?yàn)閭鬏斶^(guò)很多沒(méi)有被加入共識(shí)的區(qū)塊,會(huì)浪費(fèi)掉一些帶寬。
Conflux 雖然說(shuō)也會(huì)有一些重復(fù)的交易,但是因?yàn)樗鼘?duì)整個(gè)帶寬的利用比較充分,而且在這個(gè)前提下,有效的帶寬利用率也遠(yuǎn)比 GHOST 更高,所以就可以把整個(gè)系統(tǒng)的吞吐量提高。如果做對(duì)比的話,由于比特幣的總帶寬利用率特別低(~1%),所以即使它再怎么降低協(xié)議開(kāi)銷(xiāo),吞吐量上跟 Conflux 的差距依然非常明顯。
這些是關(guān)于PoW的一些簡(jiǎn)單的介紹,下面我們?cè)倏匆幌聶?quán)益證明。
3. 權(quán)益證明(PoS)
權(quán)益證明基本的思想是:當(dāng)你持有幣(有時(shí)人們也管這個(gè)叫 stake),你就有記賬權(quán),然后有投票權(quán)。你的投票權(quán)和你持幣的數(shù)量是成正比的,這就是一個(gè)幣一票。簡(jiǎn)單來(lái)說(shuō),就是錢(qián)越多,投票的權(quán)力就越大。
PoS 協(xié)議的基本框架是按所有的參與者的持幣量,去分配打包權(quán)和投票權(quán)。在PoS的系統(tǒng)里邊打包和投票兩件事是分開(kāi)的,它也可以分開(kāi)——PoW 系統(tǒng)里這兩個(gè)其實(shí)是一回事兒。分配完打包權(quán)以后,拿到打包權(quán)的人就有資格出一個(gè)候選區(qū)塊。這個(gè)區(qū)塊里面包含要處理的交易,并且有他自己的簽名。候選區(qū)塊并不意味著就會(huì)被加入共識(shí),在廣播候選區(qū)塊以后還需要由那些有投票權(quán)的人去投票。
投票的形式可以就是在被投票的區(qū)塊上做個(gè)簽名。在投票后得到比較多票支持,候選區(qū)塊才會(huì)最終被加入共識(shí),變成一個(gè)有效的區(qū)塊。當(dāng)然投票的過(guò)程我們可以用很多方式執(zhí)行,比較常見(jiàn)的就是可以用一個(gè)少數(shù)服從多數(shù)的共識(shí)算法去做。因?yàn)楝F(xiàn)在我們知道一共有多少人有資格投票、一共有多少票,所以用這個(gè)共識(shí)算法我們很容易算出來(lái)多數(shù),比如超過(guò)1/2或者2/3。這一點(diǎn)跟 PoW 非常不一樣,因?yàn)樵?PoW 系統(tǒng)里你根本不知道全網(wǎng)的算力有多少,只能靠估計(jì),而且一般還估計(jì)不準(zhǔn)。所以 PoW 系統(tǒng)里不可能說(shuō)用一個(gè)確定的閾值去判斷什么是多數(shù)。
在去中心化機(jī)制中,我們需要選舉誰(shuí)負(fù)責(zé)打包,誰(shuí)負(fù)責(zé)投票。有時(shí)候?yàn)榱诵?,大家?huì)先選舉一個(gè)比較小的委員會(huì),然后由他們負(fù)責(zé)投票。如果不是用代理權(quán)益證明的 DPoS 機(jī)制的話,這樣的委員會(huì)通常是隨機(jī)選取的,而且為了公平性還要經(jīng)常輪換。
在 PoS 系統(tǒng)中,如果檢測(cè)到有的參與者違反了 PoS 共識(shí)的協(xié)議,就可以對(duì)他們做出一些懲罰。比如有的人把自己的一票投給很多個(gè)塊,或者說(shuō)他有票,但是就是不投,這些會(huì)對(duì)系統(tǒng)的安全性造成影響的行為都可以懲罰。
我們?cè)賮?lái)看一下權(quán)益證明的優(yōu)點(diǎn)是什么。
第一個(gè)優(yōu)點(diǎn):礦工和持幣者的動(dòng)機(jī)是一致的。PoS 的礦工都必須持幣,在整個(gè)的生態(tài)環(huán)境里減少了一個(gè)不持幣但靠機(jī)器來(lái)挖礦的角色。在 PoW 的社區(qū)中,經(jīng)常會(huì)出現(xiàn)有錢(qián)人、開(kāi)發(fā)者、以及礦工三方的利益不是完全一致的情況,然后就會(huì)吵,以至于最后很多事很難辦成。到了PoS 中,現(xiàn)在至少礦工和資本家的利益會(huì)更為一致,一定程度上減少了沖突和分歧。
第二個(gè)優(yōu)點(diǎn):PoS 的延遲可以做得非常低,確認(rèn)可以非常快。在 PoS 系統(tǒng)里,拿到一個(gè)交易就可以馬上打包,打包以后就可以廣播,這個(gè)時(shí)間是不需要等待的,不像 PoW,必須等至少做一個(gè) PoW 問(wèn)題的時(shí)間。實(shí)際上,PoS 共識(shí)的延遲主要是受限于網(wǎng)絡(luò)和參與投票的人數(shù)。因?yàn)槟阃镀钡娜嗽蕉啵隙ㄒ鹊臅r(shí)間也就越久。
第三個(gè)優(yōu)點(diǎn):PoS 比較環(huán)保,因?yàn)樗恍枰龉ぷ髁孔C明。投票實(shí)際上就是做個(gè)簽名,最多再做一些簡(jiǎn)單的運(yùn)算,比求解 PoW 難題容易多了。
但它的缺點(diǎn)也是跟上面相對(duì)的,PoW 系統(tǒng)的一些優(yōu)點(diǎn)它失去了。
第一,與無(wú)許可的 PoW 系統(tǒng)相比,PoS 的系統(tǒng)在匿名性和許可性上稍微差一些。因?yàn)槲易鳛橐粋€(gè)人,我要加入一個(gè) PoS 的系統(tǒng),想進(jìn)去投票,我首先要持有幣。這個(gè)幣我是不可能通過(guò)其他方式得到的,我必須跟已經(jīng)有幣的那些人去做交易,他們把幣給我以后我才有權(quán)利。這就不像 PoW,只要拿一臺(tái)機(jī)器接入系統(tǒng),就可以直接挖到幣。
第二,投票行為本身成本非常低,只需要做個(gè)簽名就可以生成一個(gè)有效的投票。這樣的話在安全性上會(huì)有一些問(wèn)題。比如 PoS 系統(tǒng)常見(jiàn)的無(wú)利害攻擊問(wèn)題。
另外,投票權(quán)可以復(fù)用,可以轉(zhuǎn)讓,這也是不好的。如果我把自己的私鑰賣(mài)給別人,那么我以前投出的那些票,在歷史上每個(gè)分支做出的選擇,這時(shí)候拿到我私鑰的人,他都可以再去投一遍。可以重復(fù)使用以前的投票權(quán)會(huì)在安全性上帶來(lái)一些問(wèn)題。等一會(huì)兒我們講到長(zhǎng)程攻擊的時(shí)候再詳細(xì)討論。
還有就是投票機(jī)制帶來(lái)的一些問(wèn)題。剛剛我們說(shuō)了 PoS 共識(shí)的優(yōu)勢(shì)是確認(rèn)快,可以做到不分叉,但這個(gè)不分叉的前提是需要假設(shè)大多數(shù)節(jié)點(diǎn)是誠(chéng)實(shí)的。這里說(shuō)的有2/3以上的節(jié)點(diǎn)誠(chéng)實(shí),實(shí)際上嚴(yán)格來(lái)說(shuō)是要求2/3以上的幣和投票權(quán)都在誠(chéng)實(shí)的人手里,壞人只有不到1/3的投票權(quán)。——這樣對(duì)于一個(gè)得到2/3以上投票的塊來(lái)說(shuō),就算是有一些壞人可以給不同的塊投票,他們聯(lián)合上剩下還沒(méi)簽名的好人,全加在一塊也不會(huì)超過(guò)2/3。這樣的話只要有足夠多的節(jié)點(diǎn)簽名,且整個(gè)系統(tǒng)里大部分節(jié)點(diǎn)都誠(chéng)實(shí)的話,這個(gè)系統(tǒng)就完全不會(huì)分叉,又可以做得非常快,大家確認(rèn)得也會(huì)很快。例如 EOS 現(xiàn)在就實(shí)現(xiàn)了出塊很快,確認(rèn)很快。
但是 PoS 共識(shí)的話也有一些新的問(wèn)題。
第一個(gè)就是通訊復(fù)雜度跟投票的人數(shù)相關(guān),而且通常是平方的關(guān)系。參與投票的人數(shù)越多,通訊越復(fù)雜,然后大家要等的就越久。就像是如果說(shuō)我們要一人一票選一下美國(guó)總統(tǒng),整個(gè)投票的過(guò)程就非常復(fù)雜非常慢;而政治局里邊投票決定一件事就快得多,因?yàn)樗麄內(nèi)松佟?/p>
還有一個(gè)PoS的共識(shí)的比較本質(zhì)的問(wèn)題,就是投票權(quán)的決定時(shí)間是早于生成候選區(qū)塊的。在有這個(gè)區(qū)塊以前,我就知道誰(shuí)有投票權(quán)、誰(shuí)沒(méi)有投票權(quán)了。因?yàn)橥镀睓?quán)的決定方式,所以實(shí)際上決定投票權(quán)和行使這個(gè)權(quán)利的動(dòng)作是分離的,沒(méi)有綁定在一起的。我拿到投票權(quán)的時(shí)候,別人誰(shuí)也沒(méi)有辦法說(shuō),就規(guī)定我這個(gè)票必須投給誰(shuí)。所以拿到投票權(quán)以后,我可以隨便地去投,而不會(huì)因?yàn)槲彝镀钡男袨闆Q定我有沒(méi)有投票權(quán)。但這樣的話投票權(quán)使用是更靈活了,也意味著我可以選擇的策略空間更大,整個(gè)博弈會(huì)變得更復(fù)雜。通常來(lái)說(shuō),策略空間大對(duì)于安全性是不好的,因?yàn)榻o攻擊者留出了更大的操作空間。一個(gè)誠(chéng)實(shí)的人通常只會(huì)按照規(guī)則去,他每一次就確定了做一個(gè)動(dòng)作,但是攻擊者如果操作空間大,能干的事兒就很多了,想保證安全性也會(huì)變得更難。結(jié)果就是在 PoS 系統(tǒng)里面會(huì)有更多的攻擊方式,比如無(wú)利害攻擊、長(zhǎng)程攻擊等。
那么為什么在 PoS 系統(tǒng)里,我們不能像在 PoW 系統(tǒng)里那樣,先生成區(qū)塊,然后再?zèng)Q定投票權(quán)呢?因?yàn)槲覀冃枰_保對(duì)投票權(quán)大家是有共識(shí)的。不管投票者把票投給哪個(gè)候選區(qū)塊,對(duì)于誰(shuí)有權(quán)投票,是必須確保所有人都知道的。不然的話就會(huì)有可能退化成類似于 PoW 的情況——這個(gè)在 PoS 系統(tǒng)里邊叫 stake grinding,就是說(shuō)每次嘗試產(chǎn)生很多新的區(qū)塊,然后從這些區(qū)塊里挑選對(duì)自己最有利的一個(gè)廣播出去,然后由這個(gè)區(qū)塊去決定后邊的投票權(quán)。如果真的先出區(qū)塊,后決定投票權(quán),我們就可能會(huì)看到一個(gè)分叉分出去若干個(gè)分支,然后每一個(gè)分支的區(qū)塊后邊都跟著一個(gè)親友團(tuán)一樣的委員會(huì),親友團(tuán)里邊多數(shù)人都說(shuō)這個(gè)區(qū)塊是對(duì)的。但是因?yàn)槊總€(gè)區(qū)塊后邊跟著親友團(tuán)都不一樣,他們?cè)僭趺赐镀币策€是達(dá)不到整個(gè)系統(tǒng)的共識(shí)。
還有一個(gè) PoS 共識(shí)的問(wèn)題,就是需要假設(shè)大部分節(jié)點(diǎn)是誠(chéng)實(shí)的。“誠(chéng)實(shí)”這件事兒一般是在密碼學(xué)里邊提得多一些。但是在博弈論和經(jīng)濟(jì)學(xué)里面,很少會(huì)說(shuō)一個(gè)人是誠(chéng)實(shí)的,更多是說(shuō)一個(gè)人是理性的——如果說(shuō)謊可以多賺錢(qián),很多人會(huì)選擇說(shuō)謊。所以說(shuō),如果假設(shè)這些節(jié)點(diǎn)都是誠(chéng)實(shí)的,實(shí)際上是一個(gè)非常強(qiáng)的假設(shè)。意味著他們即使能夠通過(guò)說(shuō)謊、通過(guò)做惡多賺錢(qián),也依然會(huì)選擇遵守協(xié)議。這點(diǎn)還需要看具體協(xié)議,對(duì)誠(chéng)實(shí)要求到什么程度,才能知道它是不是一個(gè)合理的假設(shè)。
下面我來(lái)講講如何解決 PoS 共識(shí)帶來(lái)的這些新的問(wèn)題。
第一個(gè)是說(shuō)通訊復(fù)雜度很高的問(wèn)題,這個(gè)其實(shí)是最容易解決的。大家可以隨機(jī)選取出一個(gè)比較小的委員會(huì),由這些人作為代表負(fù)責(zé)投票,或者也可以用代理投票,就是我把我的票先投票去選一個(gè)代表,例如 EOS 里邊的超級(jí)節(jié)點(diǎn),然后這些選上的代表再代替我去投票。這樣的好處就是實(shí)際參與出塊共識(shí)投票的人數(shù)比較少,可以降低投票的復(fù)雜度?,F(xiàn)實(shí)中的人民代表大會(huì)、國(guó)外的議會(huì)或者陪審團(tuán),都是用到了類似的邏輯。
然后如何對(duì)抗攻擊呢?一個(gè)方式是我們假設(shè)大多數(shù)人都是誠(chéng)實(shí)的,再假設(shè)網(wǎng)絡(luò)有非常好的同步性——即廣播出去一個(gè)區(qū)塊以后,在一段確定的時(shí)間內(nèi),比如說(shuō)一分鐘或者30秒內(nèi),整個(gè)網(wǎng)絡(luò)絕大部分節(jié)點(diǎn)都可以收到。在這個(gè)前提下就非常容易做到共識(shí)。但是這樣的假設(shè)實(shí)際上是非常強(qiáng)的,現(xiàn)實(shí)中并不容易保證。如果說(shuō)我們要解決某一個(gè)攻擊的問(wèn)題的時(shí)候,直接假設(shè)這個(gè)攻擊不存在,然后問(wèn)題解決了,這肯定不是一個(gè)讓人信服的方法。
我們?cè)賮?lái)討論一下幾種比較常見(jiàn)的針對(duì) PoS 系統(tǒng)的攻擊方式。
第一個(gè)是無(wú)利害攻擊,其實(shí)也就是一票多投。如果說(shuō)在一個(gè) PoW 的系統(tǒng)里邊,礦工看到有兩個(gè)區(qū)塊這樣的分叉,他的算力只能跟在一個(gè)后面去挖,不可能同時(shí)在兩個(gè)后面。當(dāng)然真要同時(shí)挖兩個(gè)塊的話也不是不行,只是那樣就意味著分配到每個(gè)塊上的算力肯定是要減少的,兩邊挖礦的算力加在一起是一個(gè)定值,所以一般不會(huì)有人這么干。在PoS的系統(tǒng)里邊就不一樣了:我看見(jiàn)左邊有一個(gè)分叉,好,我給他投一票;看見(jiàn)右邊有一個(gè)分叉,我又投一票。這樣不管哪個(gè)分叉稱為共識(shí),我都可以分到投票的獎(jiǎng)勵(lì)。這樣的話壞人就很開(kāi)心。壞人說(shuō)反正我做一個(gè)分叉,你們這些理性的礦工也都會(huì)給我投票,那么我只要比剩下那些“不那么理性的好人”掌握的投票權(quán)多一點(diǎn)就可以把之前的主鏈給回滾掉。這樣的話就很不安全。
對(duì)于無(wú)利害攻擊,常見(jiàn)的對(duì)抗方式是說(shuō)一旦檢測(cè)到這種一票多投的行為,就對(duì)這種人做出一個(gè)懲罰。你如果真的一票多投,別人可以拿到你投票的信息,然后提交到鏈上,說(shuō)“這個(gè)人一票多投了,扣他錢(qián)”。但是這種方法實(shí)際上也可能會(huì)遇到一些問(wèn)題,就是有可能會(huì)出現(xiàn)我在兩邊一票多投了,但是最后只在一邊會(huì)被扣錢(qián),但在另一邊有可能會(huì)得到更大的收益。
還有一個(gè)是賄賂攻擊。投票的時(shí)候,大部分參與者實(shí)際上都更接近理性人。比如說(shuō)你持有一百塊錢(qián),每次投票的收益是一塊錢(qián),然后我跟你說(shuō)只要你把票投給我的這個(gè)區(qū)塊,我就給你兩塊錢(qián)。可能很多人都會(huì)接受我的提議。這樣的話,壞人可以用非常低的成本,去買(mǎi)到更多的票支持自己的分支,比如說(shuō)用兩塊錢(qián)買(mǎi)到相當(dāng)于一百塊錢(qián)資產(chǎn)的投票權(quán)。這肯定會(huì)對(duì)安全性造成影響。現(xiàn)在對(duì)賄賂的問(wèn)題已經(jīng)有一些解決方案了,雖然還不是特別完美,但是已經(jīng)比較讓人信服了。比如像 Algorand 提出解決的方案,就是投票權(quán)的分配是通過(guò)私有的隨機(jī)數(shù)去算的。在投票者把這個(gè)投票權(quán)的證明公開(kāi)出來(lái)以前,大家都不知道到底哪些人有投票權(quán)。這樣的話,至少在投票之前不會(huì)有人知道我有投票權(quán),他們也沒(méi)辦法來(lái)賄賂我。公開(kāi)投票以后,因?yàn)?Algorand 的方式是每完成一輪投票就把委員會(huì)所有的人全都換一遍,然后重新選一批人去投票,所以在別人知道我有投票權(quán)的時(shí)候我的票已經(jīng)投出去了,沒(méi)辦法再去賄賂去修改了。這里對(duì)共識(shí)參與者的誠(chéng)實(shí)性有一個(gè)比較高的假設(shè):不能說(shuō)我有投票權(quán)以后就跑到網(wǎng)上到處問(wèn),我有哪些輪次的投票權(quán),有沒(méi)有人要出錢(qián)買(mǎi)?,F(xiàn)實(shí)中如果真的有人大規(guī)模的去問(wèn)這件事,其實(shí)很容易被社區(qū)發(fā)現(xiàn),大家就會(huì)知道有人在做這種攻擊了,也就比較容易做出應(yīng)對(duì)。所以這至少是一個(gè)降低被攻擊風(fēng)險(xiǎn)的方法。
還有一個(gè)是關(guān)于長(zhǎng)程攻擊的安全性。這個(gè)說(shuō)的是什么呢?就是說(shuō)A在創(chuàng)世區(qū)塊有20%的幣或者20%的股權(quán),他就可以在正常的區(qū)塊上出塊去投票。然而,A可以在某個(gè)時(shí)間把他在鏈上的幣全都賣(mài)掉,也就是套現(xiàn)跑路?,F(xiàn)在他在鏈上沒(méi)有任何錢(qián),以后別人不可能在鏈上懲罰他。這時(shí)候他把自己的私鑰賣(mài)給攻擊者。攻擊者可以去收購(gòu)A的,B的、C的、很多人的很多私鑰。收購(gòu)到那些私鑰以后,這些私鑰在創(chuàng)世塊里面控制的權(quán)利可能是超過(guò)50%的,甚至超過(guò)80%都有可能。然后攻擊者拿到這些私鑰以后再做出一個(gè)惡意區(qū)塊,代替A,B,C 他們各投一票支持惡意區(qū)塊。
在第三方看來(lái),這個(gè)區(qū)塊和真正的主鏈區(qū)塊看上去都是同樣合法的,因?yàn)槎加泻芏嗳巳ネ镀薄H绻麎娜说倪@條鏈足夠長(zhǎng),以后新加入的人會(huì)發(fā)現(xiàn)現(xiàn)在有兩條鏈,每一條都是有很多人投票投出來(lái)的,我該信哪一個(gè)?這時(shí)候共識(shí)已經(jīng)出現(xiàn)問(wèn)題了。所以怎么應(yīng)對(duì)這種攻擊呢?一種方法是說(shuō)要保證一個(gè)弱活躍性,即要求每一個(gè)誠(chéng)實(shí)的礦工至少隔一段時(shí)間就上去看看,同步一下最新的狀態(tài)。如果有人告訴你說(shuō)你那個(gè)狀態(tài)不對(duì),應(yīng)該從一年前的某一個(gè)狀態(tài)分叉過(guò)來(lái),通常來(lái)說(shuō)你不應(yīng)該接受這樣的一個(gè)建議,因?yàn)榛貪L的時(shí)間太久了。
還有一個(gè)方式就是鎖定押金,然后再加上回滾的長(zhǎng)度限制。以太坊的 Casper PoS 協(xié)議里邊就是這么設(shè)置的。如果你非要把用于投票的錢(qián)賣(mài)掉,可以,但你必須要等一段時(shí)間。這個(gè)時(shí)間足夠久,久到等其他的人再看到你用之前的投票權(quán)去投票的時(shí)候已經(jīng)不會(huì)承認(rèn)了。因?yàn)閯e的人已經(jīng)跟著合法的鏈往后走很遠(yuǎn)了。這個(gè)是以太坊的解決方案。
Algorand 在這一點(diǎn)上解決的方案是,既然你們是誠(chéng)實(shí)的,作為一個(gè)誠(chéng)實(shí)的人,你每一輪投票以后,你應(yīng)該把當(dāng)輪投票用的私鑰刪掉,在你刪掉了以后,就不會(huì)有人再拿這個(gè)私鑰去干壞事。這個(gè)解決方案說(shuō)得沒(méi)錯(cuò),但是它對(duì)參與者的道德水平提出了比較高的要求。
基于 PoS 的共識(shí)系統(tǒng)還有一些其他問(wèn)題。通常我們?nèi)绻x擇一個(gè)小的委員會(huì),如果不用 DPoS 的話,在 PoS 系統(tǒng)里我們需要隨機(jī)地去選。PoW 投票里的隨機(jī)性主要是由大家分布式并行挖礦時(shí)候的運(yùn)氣帶來(lái)的,因?yàn)榍蠼?PoW 問(wèn)題本身有內(nèi)在的隨機(jī)性。但如果說(shuō)我們要用隨機(jī)性去選擇一個(gè)投票委員會(huì)的話,就又要解決一個(gè)新的問(wèn)題:怎么樣去產(chǎn)生一個(gè)公平的隨機(jī)數(shù)?
如何產(chǎn)生公平的隨機(jī)數(shù)在密碼學(xué)上也是一個(gè)討論了很多年的問(wèn)題,目前也有相對(duì)比較好的方案去解決。這個(gè)方案雖說(shuō)不能產(chǎn)生絕對(duì)均勻的完美的隨機(jī)數(shù),但偏差可以控制到一個(gè)范圍以內(nèi)。另一方面,產(chǎn)生完全均勻的完美的隨機(jī)數(shù)是很難辦到的。因?yàn)槲覀冎溃绻?2/3 以上的幣攻擊者就可以完全控制整條鏈,產(chǎn)生的隨機(jī)數(shù)也可以隨便挑。所以你如果有 67% 的幣就可以控制百分之百的隨機(jī)數(shù),那么有10%的幣能控制個(gè) 11% 的隨機(jī)數(shù)聽(tīng)起來(lái)也不是特別不可接受。其實(shí)基于 PoW 的比特幣也有類似的性質(zhì):比如說(shuō)有 51% 的算力就可以控制鏈上百分之百的收益;少一些的話,實(shí)際上有百分之二十幾算力就可以通過(guò)自私挖礦,獲得比實(shí)際算力所占的百分比高一點(diǎn)的收益。這是一個(gè)非線性的關(guān)系,但是只要它不是偏離得太多,大家一般還是勉強(qiáng)可以接受。
PoS 共識(shí)的安全性假設(shè)是比 PoW 要強(qiáng)的。PoW 我們要求是要有51%以上的誠(chéng)實(shí)算力,PoS的 Algorand 他們對(duì) Staker 的要求是 80% 以上的錢(qián)控制在誠(chéng)實(shí)的人手里,而且這些人需要非常誠(chéng)實(shí):他們不會(huì)提前告訴別人自己有投票權(quán);投票以后要把當(dāng)輪的私鑰刪掉,不能賣(mài)給別人;而且他們還必須定期上線去同步一下?tīng)顟B(tài),算一下接下來(lái)的一段時(shí)間內(nèi)自己是不是有投票權(quán),如果有的話還要按時(shí)上線投票。如果像我們現(xiàn)在很多人那樣,錢(qián)存在銀行后就不管了,不到花錢(qián)的時(shí)候就不會(huì)去登錄系統(tǒng),那么壞人只要在最后實(shí)際投票的活躍的人里邊超過(guò)一定的比例就可以了。不活躍不投票的人實(shí)際上不對(duì)安全性產(chǎn)生任何貢獻(xiàn)。當(dāng)然即使一般的 PoS 至少也會(huì)要求 2/3 以上的多數(shù)錢(qián)是掌握在的誠(chéng)實(shí)的人手里,而且還要有一定的對(duì)于活躍性的假設(shè)或者說(shuō)要求。至少誠(chéng)實(shí)的人要經(jīng)常上線去看一下,去投個(gè)票什么的。
另外,基于 PoS 共識(shí)的系統(tǒng)在啟動(dòng)的時(shí)候會(huì)有一些問(wèn)題。因?yàn)橐粋€(gè)項(xiàng)目往往剛開(kāi)始啟動(dòng)的時(shí)候,是它的資產(chǎn)分布的最不去中心化的時(shí)候。就像比特幣剛開(kāi)始的時(shí)候,中本聰會(huì)有很多的幣。如果是 PoS 的系統(tǒng),他一個(gè)人就可以完全控制整個(gè)系統(tǒng)。其他項(xiàng)目的開(kāi)發(fā)團(tuán)隊(duì)以及早期的幾個(gè)大的投資機(jī)構(gòu),可能就已經(jīng)拿到大部分的幣了,他們對(duì) PoS 的話語(yǔ)權(quán)會(huì)變得非常非常大。所以如何啟動(dòng)一個(gè) PoS 的公鏈也是一個(gè)比較大的問(wèn)題。EOS 啟動(dòng)前也是花了很久時(shí)間才做得比較好的。所以對(duì)于這一點(diǎn),我們團(tuán)隊(duì)認(rèn)為至少在項(xiàng)目啟動(dòng)的時(shí)候,用 PoW 是比 PoS 要方便很多的。PoW 方式才能做到無(wú)許可,然后一開(kāi)始的幣在發(fā)行的時(shí)候也會(huì)比較公平。
最后,雖然 PoS 可以檢查一些違規(guī)行為,然后在鏈上對(duì)這些人做懲罰,但是有可能攻擊者的利益并不全在鏈上,他在鏈下還有其他的收益。比如說(shuō)我在以太坊上發(fā)起攻擊,在上面被懲罰損失很多以太幣;但是同時(shí)幣價(jià)也很可能會(huì)降低,如果我在另外的市場(chǎng)做空以太幣,就可以通過(guò)做空得到更高的收益。這樣的話,鏈外的動(dòng)機(jī)會(huì)導(dǎo)致一些在鏈上有很多錢(qián)的人依然有動(dòng)力去攻擊這條鏈。這也是 PoS 比較難解決的一個(gè)問(wèn)題。
4. PoW VS. PoS
我們最后簡(jiǎn)單看一下基于 PoW 和 PoS 機(jī)制的共識(shí)的比較。
一個(gè)是準(zhǔn)入機(jī)制。即它到底是不是有許可的?投票是不是匿名的?參與的人數(shù)有沒(méi)有限制?投票的形式是并行還是要通過(guò)廣播的方式?還有一個(gè)投票結(jié)果確認(rèn)的方式?投票的邊際成本?
一個(gè)是安全性。我覺(jué)得最大的兩個(gè)區(qū)別就是先有投票權(quán),還是先有候選區(qū)塊?投票行為和投票權(quán)利是不是綁定的?從這些角度上看,PoW 在安全性方面做得比較好。
但是,PoW 的投票結(jié)果需要等一個(gè)分支上累積的優(yōu)勢(shì)足夠大才能確認(rèn),所以其實(shí)不是等一個(gè)塊,他還要再等誠(chéng)實(shí)的算力集中在這一塊后面工作一段時(shí)間以后才能確認(rèn)。因此 PoW 系統(tǒng)只能說(shuō)通過(guò)一些優(yōu)化把確認(rèn)速度盡可能加快,但是很難做到像有的 PoS 那樣秒級(jí)確認(rèn)。
說(shuō)到投票的邊際成本,因?yàn)橐袡C(jī)器和電費(fèi),PoW 是沒(méi)辦法避免的。但其他的方面做得都比較好。相對(duì)的,PoS 在性能方面做得比較好,主要差在安全性上。就是因?yàn)樗葲Q定了投票權(quán),所以大家拿著這個(gè)投票權(quán)可以隨便投。而且你投過(guò)一次票以后還可以拿著這個(gè)權(quán)利再投。至于 PoS 其他的一些問(wèn)題,實(shí)際上我們用委員會(huì)或者用代理的權(quán)益證明都可以把那些問(wèn)題減輕或者解決掉,只有投票權(quán)的問(wèn)題很難解決。投票權(quán)和投票行為不綁定的問(wèn)題是 PoS 的一個(gè)本質(zhì)難題。
PoW 的缺點(diǎn)是確認(rèn)慢,吞吐量一般會(huì)相對(duì)比較低一點(diǎn)。PoS 主要缺點(diǎn)是要考慮如何應(yīng)對(duì)賄賂攻擊、長(zhǎng)程攻擊、無(wú)利害攻擊等各種攻擊手段。為了應(yīng)對(duì)這些攻擊,PoS 的協(xié)議就要處理很多情況,于是就會(huì)變得比較復(fù)雜。眾所周知,越復(fù)雜的系統(tǒng)的安全性也越難保證,一方面是分析證明起來(lái)會(huì)更困難,另一方面是攻擊者也更容易在復(fù)雜的系統(tǒng)找到漏洞。
還有一種現(xiàn)在可能用的還不是很多的方式是 PoW 和 PoS 混合在一起做共識(shí)。因?yàn)?PoW 的優(yōu)點(diǎn)主要就是安全可靠,而 PoS 的優(yōu)點(diǎn)是效率高,特別是確認(rèn)快,而且能耗比較低。如果能把這兩個(gè)的優(yōu)點(diǎn)結(jié)合在一起,就有可能設(shè)計(jì)出一個(gè)更理想的共識(shí)協(xié)議。同時(shí)大家還可以考慮用 DAG 的方式而不是鏈的方式組織區(qū)塊。因?yàn)?DAG 的方式不怕分叉,不需要過(guò)分限制出塊速度,所以大家可以出塊出得比較快,只要帶寬能同步就可以。
當(dāng)吞吐量做到帶寬和網(wǎng)絡(luò)容量的上限以后,如果要進(jìn)一步的擴(kuò)容,就需要從其他方面動(dòng)腦筋了。一個(gè)比較簡(jiǎn)單的思路是采用第二層的擴(kuò)容方案:每筆交易不要傳到全網(wǎng)去驗(yàn)證,比如像sharding,一個(gè)交易只在 shard 內(nèi)部局部地驗(yàn)證,這樣的話就可以節(jié)省全網(wǎng)的帶寬,提高整個(gè)系統(tǒng)吞吐量。閃電網(wǎng)絡(luò)也用到了類似的邏輯。另外一種比較難的方式要用到一些“黑科技”,比如可驗(yàn)證計(jì)算、簡(jiǎn)短的零知識(shí)證明、概率可驗(yàn)證證明等等,這里不展開(kāi)講了。
但設(shè)計(jì) PoW 和 PoS 混合的系統(tǒng)最難的一點(diǎn)是怎么樣把兩者的優(yōu)勢(shì)結(jié)合在一起,而不是把它們的劣勢(shì)結(jié)合在一起。我聽(tīng)說(shuō)過(guò)有一些設(shè)計(jì)是先用 PoW 的方式挖到一個(gè)票,然后用這個(gè)票去對(duì)候選區(qū)塊進(jìn)行投票。在我看來(lái)這種方式就不是很好,因?yàn)樗艞壛?PoW 投票和投票權(quán)綁定的優(yōu)勢(shì),安全性更接近于 PoS 系統(tǒng)。
如果能把 PoW 和 PoS 的優(yōu)勢(shì)結(jié)合起來(lái),就有可能做到一個(gè)安全性又高,確認(rèn)又快,吞吐量大,而且能耗還比較合理的系統(tǒng)。目前為止我還沒(méi)有看到特別好的解決方案,期待以后能出現(xiàn)這樣一個(gè)完美的解決方案。