Conflux楊光:PoW和PoS的全面比較

關於共識機制的討論已經有許多,但這些分析大多不全。在碳鏈價值舉辦的「碳話」線下沙龍第一期活動中,Conflux研究總監楊光博士用一萬三千餘字,全面分析了POW與POS共識機制的原理、運行時遇到的問題,以及二者的優劣比較。本篇文章適合收藏並反覆觀看。


演講者:Conflux研究總監楊光 文字整理與校對:Cinderella、唐晗算法

很是高興有機會在這裏跟你們分享我在這個領域的一些研究和看法。安全

首先給你們簡單介紹一下咱們的 Conflux 團隊:咱們團隊的核心是姚班的幾個同窗以及師弟,而且有幸請到姚期智先生擔任咱們的首席科學家和顧問。咱們之因此投入到區塊鏈這個行業中來,是由於這個行業裏邊有不少很是重要也頗有意義的新問題——以我最熟悉的密碼學和博弈論爲例,區塊鏈面對的和要解決的不少問題已是學術界最前沿的研究方向了。這些問題不是單靠工程師就能夠解決的,而是須要更多學術界的力量參與進來,你們一塊兒合做才能推進整個區塊鏈行業往前發展得更好。網絡

01女巫攻擊與區塊鏈共識協議

今天我來說一下 PoW 和 PoS 的對比。咱們先來回顧一下最典型的區塊鏈共識協議:你們把交易打包成塊,經過哈希引用把塊鏈接成一條鏈,就獲得了一個共享的帳本。可是直接這樣用一個帳本確定是很不安全的,由於壞人也能夠造一個帳本,而後把兩個帳本同時擺在你面前,哪一個是真的哪一個是假的,咱們應該相信哪個,這就成了一個問題。框架

若是是中心化的,固然這個問題很是好解決——我用支付寶,支付寶說我帳戶有多少錢,那就是多少錢。若是和事實不一致的話,我有不一樣意見能夠去法院告他。但若是是去中心化的,這件事就很難說了。去中心化的時候,你們沒有一個這樣一槌定音的機構,須要經過其餘方式達成共識,纔能有一個公正的帳本。那麼在去中心化的環境下,應該怎樣作共識呢?一個很容易想到的辦法就是咱們投票,你們共同投票,投出來一個帳本,而後都相信這個就行。分佈式

可是,既然說到投票,那麼首先就有一個投票的公平性問題:投票權要怎麼分配?好比今天咱們你們一塊兒投票,而後我手裏有一百票,在坐的各位每人一票,咱們這個不叫投票,我有一百票,基本上我說什麼想投什麼,結果就是什麼樣的。若是咱們真的想達到一個共識,就不可能用這種特別不公平的方式去投票。因此投票權的分配是共識協議裏面最核心最重要的部分之一。在線下投票權分配的問題其實比較容易解決:咱們就簡單的一人一票便可。你們都有身份證,而後投票的時候登記一下就好了。可是線上的話,要想實現一人一票就很是困難。性能

首先,你在線上的環境中,特別是去中心化的環境中,如何定義「什麼叫作一我的」,這就是一個很大的問題。你是把一個帳戶當一我的仍是一個ip當一我的,仍是說你用別的什麼方法去肯定?在網上的話,你們都是以匿名的方式存在的,你在聊天的時候,你甚至都沒法判斷網絡另外一邊跟你聊天的究竟是一個摳腳大漢仍是一條狗。所以,咱們就須要一個抗女巫攻擊的機制。區塊鏈

咱們先簡單講一下什麼是女巫攻擊:它是說攻擊者能夠低成本地製造不少帳戶,而後控制這些帳戶一起去行動,讓別人看上去覺得人多勢衆的樣子。 好比說在論壇上你們會見到有水軍引導輿論,再好比電影評分的網站也會有人專門去組織去在上面刷評論刷分。若是說有不少這種水軍馬甲的帳號在攻擊的話,你最後投票獲得的結果就不是真實的。有可能某我的經過這種方式投出很是多的票,最後投票的結果就是徹底受這一我的控制的。在傳統的互聯網環境下,咱們有不少對抗女巫攻擊的方式,好比增長每一個帳戶的註冊成本。你們在網上要註冊一個帳號的時候,經常須要輸入一個驗證碼,這件事就是計算機實現起來比較麻煩,即便能寫程序作也比較困難,但人去作的話就很簡單;還有的網站註冊的時候要求綁定一個手機號,或者檢測ip地址,這都是比較常見的抗女巫攻擊的方式。可是在去中心化的環境下,以上那些方式就很差用了。由於去中心化的環境下,誰去發佈這個驗證碼,誰去判斷驗證碼填得對不對?而後誰去驗證手機號?即便用ip地址的話,其實也是一個很是不公平的方式。由於咱們知道並非每一個人都平等地享有一個靜態的ip地址的。優化

因此在區塊鏈中,咱們實際上用到的解決方案最多見的就是一個工做量證實(PoW),一個是權益證實(PoS),後者包括代理的權益證實(DPoS)。還有一些其餘的證實方式,好比說證實你擁有多少空間,或者證實你燃燒了多少貨幣,還有別的一些方法,可是目前最主要最多見的仍是 PoW 和 PoS 這兩種。這裏我還要稍微強調一下,不管 PoW 仍是 PoS 或者別的什麼 PoX,都是抗女巫攻擊的機制,是共識算法(協議)裏邊一個重要的組成部分,但它們自己不等價於共識算法。網站

02 工做量證實

接下來我先講一下你們都比較熟悉的工做量證實。設計

工做量證實的基本思想就是算力決定出塊權。若是你能解出一個 PoW 計算難題,你就能夠出塊。粗糙地歸納下,能夠理解爲一個CPU一票,或者一個GPU、一臺礦機一票,大概是這麼個意思。它的好處首先是這個系統是無許可的。參與者不須要任何人許可,只要有機器有算力就能夠參與——理論上甚至都不必定須要機器。若是說你能夠手動算出一個區塊的哈希,並及時把這個上傳上去,別人也會認可這是一個合法的區塊。還有一個是PoW投票行爲自己成本是比較高的,無論用CPU、GPU仍是用礦機,機器的成本和電力的成本,都是要實打實地花出去的。這就跟咱們以前說的驗證碼,其實形式上有一點像,對吧?有一些驗證碼,人看了之後仍是要花一點時間去識別裏邊的數字或者字母究竟是什麼,而後才能打上去經過驗證。工做量證實一個最大的優勢,我認爲就是所投的票和投票權是綁定的:一旦投票成功之後,即便是投票者本人也修改不了投票的內容。

按照工做量證實的通常邏輯,投票的時候須要先打包出一個塊,而後再對這個塊作工做量證實,若是作出來證實就至關於投出去一票,可是這個時候打包的塊已經沒有辦法修改了。例如個人礦機跑一天能夠投出不少票,可是若是我想把以前一天的算力集中到新的一個塊上,這是辦不到的;另外一方面,若是我想要回滾掉本身出的塊,我也必須付出和回滾別人的塊時候所需的同等的算力。這是PoW一個特別好的特色。

固然基於PoW機制去作共識算法也有一些缺點。首先這個缺點就是延遲比較高,由於咱們把交易打包到區塊之後,這個區塊不是立刻就成爲一個有效的候選區塊的,至少還要完成一個工做量證實這個區塊才能稱爲候選區塊。這裏工做量證實的時間不能設得特別短,等一下我會講爲何不能過短。因而,至少從打包好區塊到作完區塊的工做量證實這一段時間內,你這個交易是不可能被人確認的。因此說即使比特幣不是等六個塊確認,而是看到一個塊就確認,確認一筆交易平均也要等十分鐘時間。PoW機制另外一個被人詬病的點就是能耗特別高、不環保。對於這一點,工做量證實的能耗是否必要,我以爲是見仁見智的,能夠持保留意見。可是咱們既然是在談工做量證實,那麼這個工做量怎麼也是沒辦法省掉的,若是省掉的話它就叫別的名了。

咱們看一下如何解決基於PoW的共識的主要問題。

第一個是說確認速度慢。以比特幣爲例,出一個塊平均要十分鐘,確認的話還要再等六個塊,就平均要一個小時。第二個是吞吐量比較低,你們都很清楚,比特幣在這點上已經被人批評好幾年了。而後第三點就是能耗高不環保。可是第三點,既然咱們要用PoW,這點能耗是避免不了的,因此咱們也就不想着去解決這個問題了。

對前面兩個問題,確認速度慢和吞吐量低。其實這兩個問題看上去都有一個很簡單的解決方法——下降PoW問題的目標難度,提升出塊速度。實際上萊特幣就是這麼作的。它把目標難度從比特幣的10分鐘降到2.5分鐘,而後一會兒出塊速度就比特幣快四倍。還有一個提升吞吐量的方法就是增大塊容量,好比BCH就把每一個塊從1M先擴大到8M,而後又擴大到32M,甚至後來還有提議說要改到128M。很直觀地,一樣的出塊速度下,塊越大吞吐量也就越大。

是否是這麼簡單就能夠解決比特幣確認速度慢和存儲量低的問題呢?固然不會。要真這麼簡單的話,比特幣也不會如今是十分鐘1M的設定了。爲何剛纔說的方法不能解決問題呢?由於當咱們出塊速度快了之後,區塊鏈就會很頻繁地出現分叉,特別是當你出塊的速度超過廣播速度的時候,分叉的狀況就會特別嚴重。

若是咱們下降PoW問題的難度,提升出塊速度,而後增大區塊容量,實際上在網絡條件必定的狀況下,確定是會下降廣播速度的。由於區塊越大,廣播得就越慢。而後若是說你出塊速度快可是廣播速度慢,也就是說我在收到別人新出的一個塊以前,本身也能挖到一個塊,這樣的話就會出現分叉。而後若是說這個差距比較大的話,分叉就會特別多。

分叉多了之後有什麼很差?最大的很差就是會下降安全性。在比特幣裏邊咱們常說壞人攻擊須要51%的算力。 這個前提是說好人都集中在一條主鏈上。這樣的話,好人有49%集中在上面,壞人有51%才能攻擊。但若是真的出現這種頻繁分叉的狀況,好比說我在分叉A上有30%的算力,在分叉B上有40%的算力。這個時候壞人想把分叉B給回滾改到分叉A,它不須要不少,它只須要11%算力就能夠。只要比全世界的誠實的算力最多的兩個分叉之間的差稍微多一點,攻擊者就可讓最長鏈在這兩個上面分支上跳來跳去。因此若是真的簡單粗暴地去改比特幣的參數,最後安全性確定會下降。

可是我認爲這個安全性下降其實不能怪PoW。PoW在這裏邊只是一個抗女巫攻擊的機制,並且它的難度是能夠調的。這裏安全性下降的罪魁禍首這個鍋得讓「最長鏈」而不是PoW去背。爲何會分叉多安全性低?實際上是由於比特幣採用了最長鏈共識。在最長鏈機制下,若是出現分叉,誠實的算力極可能會跟着分叉,也就意味着誠實的人投票就會分叉,這樣的話壞人就更容易操縱最後的結果。

而後下一個問題:基於PoW的最長鏈共識爲何會分叉?是否是說若是你們都是好人,就不會分叉?

這個也不是的。咱們用圖裏邊每條線表示是一個節點,向右的這個箭頭表示的是時間。當這個節點產生一個區塊的時候,它須要把區塊廣播出去,可是廣播出去要消耗時間,因此會造成一個「事件光錐」。距離產生區塊的節點越遠,收到廣播過去的區塊所花的時間也越久,相應的要等到更晚的時間之後才能看到剛纔生成的新區塊。也就是說只有在這個黃色區域及之後其餘的節點才能看到你這邊產生的一個區塊。既然有光錐,相應的也就有光錐外的區域,也就是圖上綠色的部分。當一個節點處在這個光錐外區域的時候,他是不可能知道你這邊剛剛產生了一個區塊的,由於尚未廣播過來。也就是說,若是網絡裏產生的下一個區塊是在後邊黃色的這部分,那麼固然很安全,由於這個時候全部的節點都看到最新的區塊了,而後他們再生產區塊都會跟在後面就不會出現分叉——若是你們都是好人的話。

可是若是說出塊的速度比較快,我在綠色的光錐外區域就產生區塊,那就必然會出現分叉,而後最後會出現孤塊,對吧?由於這兩個區塊互相都是不可能引用的。因此簡單的來估計一下,孤塊率大體是等於光錐外這個區域的面積除以指望的出塊間隔的總面積。由於出塊的事件在指望的區塊間隔內是以相等的機率隨機出現的。另外一方面,綠色的光錐外區域面積所佔的比例越小,就表示出現孤塊的可能性就越低。

但實際中咱們確定不會只有四個節點,咱們節點會很是多,而節點多了之後,廣播的時間天然就會變長。廣播的時間變長,就意味着光錐外的區域面積會變大,咱們的出塊間隔也須要變長,這樣才能保證孤塊會被控制在一個比較小的範圍之內。由於其實孤塊自己也是對安全性有影響的,好比有20%的孤塊率的話,只須要41%而不是51%的算力就能夠完成攻擊了。所以,爲了提升安全性,爲了下降孤塊,咱們必須拉長出塊的間隔。好比比特幣就定在了十分鐘。這個十分鐘固然不是徹底不能改的,只是改過之後安全性確定會受到一點影響。

拉長出塊間隔之後,整個系統的效率都會下降,特別是對吞吐量形成的影響很大。咱們在這兒看一下整個系統的帶寬,其實能夠把它分紅三部分:一部分帶寬(藍色部分)是你們在傳輸最終會加到共識裏邊的交易;還有一部分帶寬(紅色部分)是你們在傳輸一些不加入共識的數據,包括整個協議的開銷,還有一些多是最終沒有被加入共識的做廢的塊和交易;最後一部分(白色),就是沒有被用到浪費掉的帶寬。若是說咱們用 PoW 作抗女巫攻擊機制,再用最長鏈的協議去計算最後的共識的話,咱們對帶寬的利用率實際上是很是低的。

以比特幣爲例,咱們600秒產生1MB有效的區塊,指望600秒纔有1MB有效的這一塊,就算我這一個區塊再擴大幾回,整個網絡裏面600秒的時間,我有效利用的存儲的信息量可能還不到20MB吧?但如今網絡的平均速度已是600秒傳幾個GB了。因此它對整個網絡帶寬的利用率也就在1%左右,浪費仍是很是嚴重的。若是說咱們用一些技術把廣播的速度變快,好比說用緻密區塊的技術,那麼綠色的光錐外的區域這段時間就會變短。這樣咱們也就能夠等比例地把出塊間隔也縮短,在保持和以前相同的安全性的同時把帶寬的利用提升一點。可是即便是這麼提升,只要咱們是用最長鏈而且要控制孤塊率,帶寬的利用率依然高不到哪兒去。通常來講,一個公鏈網絡可能會有幾千甚至上萬個節點,若是要廣播的話,平都可能要十次甚至更屢次轉發。以須要十次轉發爲例,從出塊的這個節點開始,發送給下一個節點,而後這個節點接受到區塊而且驗證過之後再發送給下一個節點,就這種過程要重複十次。在這十次轉發的全過程之內,若是我要下降孤塊率,就須要全網別的節點不要在這段時間內產生第二個區塊,或者說只有很低的機率產生第二個區塊。也就是說,這麼長的時間,你們其實只在廣播一個區塊。第一我的傳給第二我的之後,第二我的傳給第三我的的時候,第一我的就處於一個閒着的狀態了,對吧?因此最終的帶寬利用率天然不高。可能會比以前有一個常數倍的改進,但也是遠遠不可能把整個帶寬用滿的,能用到1/10就已經算很不錯了。

既然這樣的話,若是說咱們想避免分叉,不可避免的帶寬就用不滿,帶寬用不滿的話,TPS就不可能高到哪去。由於你一共同步的數據就那麼多,那它裏邊能放的交易就是有一個上限的——若是交易的尺寸不變的話(交易尺寸縮小也是能夠提升TPS的,可是其餘全部區塊鏈也能夠用一樣的技術,相對的劣勢依然不變)。

其實剛纔要解決的問題,就是說出現分叉之後誠實算力不集中,會下降安全性。但這個解決方案並非說只有下降分叉機率這一種方案去解決。好比咱們也能夠用基於 DAG 的有向無環圖去解決。

以太坊選擇分叉的時候用的不是最長鏈而是 GHOST 協議。其實以太坊用的是一個稍微修改過的版本,這個協議核心思想是遇到分叉時候選擇擁有最重子樹的分支而不是有最長子鏈的。這樣的話就無論你有沒有分叉,有多少分叉,安全性的問題都不大。由於即便是分叉的誠實的礦工,依然會對以前的選擇貢獻安全性。好比說礦工在靠後的一個區塊分叉,可是對於分叉以前的某個地方的分支應該如何選擇,礦工依然是貢獻安全性的。它會在應該選擇的分支的子樹上貢獻一個重量。

可是 GHOST 協議有一個缺點:雖說它能夠把帶寬用得比較充分,但同時浪費也很嚴重。 由於那些最終沒有被肯定在最重子樹那條鏈上的區塊,它們裏面的交易都是不算數的。你們挖到了一些區塊,可是最後都沒有加入共識,這些區塊的吞吐量就被浪費掉了。而咱們的Conflux 其實和 GHOST 用了比較類似的方式去肯定一條樞軸鏈,等肯定好之後,咱們再把全部的區塊排一個順序,這樣全部區塊裏邊的交易都會對整個系統的吞吐量做出貢獻。固然排過順序之後,還須要把裏邊有衝突的或者重複的交易去作一些處理,衝突的交易確定不能都執行。若是咱們從帶寬的角度去解釋的話, GHOST 這個協議能夠把帶寬利用得很是好,但它整個系統的開銷比較大,由於傳輸過不少沒有被加入共識的區塊,會浪費掉一些帶寬。

Conflux 雖說也會有一些重複的交易,可是由於它對整個帶寬的利用比較充分,並且在這個前提下,有效的帶寬利用率也遠比 GHOST 更高,因此就能夠把整個系統的吞吐量提升。若是作對比的話,因爲比特幣的總帶寬利用率特別低(~1%),因此即便它再怎麼下降協議開銷,吞吐量上跟 Conflux 的差距依然很是明顯。

這些是關於PoW的一些簡單的介紹,下面咱們再看一下權益證實。

03 權益證實(PoS)

權益證實基本的思想是:當你持有幣(有時人們也管這個叫 stake),你就有記帳權,而後有投票權。你的投票權和你持幣的數量是成正比的,這就是一個幣一票。簡單來講,就是錢越多,投票的權力就越大。

PoS 協議的基本框架是按全部的參與者的持幣量,去分配打包權和投票權。在PoS的系統裏邊打包和投票兩件事是分開的,它也能夠分開——PoW 系統裏這兩個實際上是一回事兒。分配完打包權之後,拿到打包權的人就有資格出一個候選區塊。這個區塊裏面包含要處理的交易,而且有他本身的簽名。候選區塊並不意味着就會被加入共識,在廣播候選區塊之後還須要由那些有投票權的人去投票。

投票的形式能夠就是在被投票的區塊上作個簽名。在投票後獲得比較多票支持,候選區塊纔會最終被加入共識,變成一個有效的區塊。固然投票的過程咱們能夠用不少方式執行,比較常見的就是能夠用一個少數服從多數的共識算法去作。由於如今咱們知道一共有多少人有資格投票、一共有多少票,因此用這個共識算法咱們很容易算出來多數,好比超過1/2或者2/3。這一點跟 PoW 很是不同,由於在 PoW 系統裏你根本不知道全網的算力有多少,只能靠估計,並且通常還估計不許。因此 PoW 系統裏不可能說用一個肯定的閾值去判斷什麼是多數。

在去中心化機制中,咱們須要選舉誰負責打包,誰負責投票。有時候爲了效率,你們會先選舉一個比較小的委員會,而後由他們負責投票。若是不是用代理權益證實的 DPoS 機制的話,這樣的委員會一般是隨機選取的,並且爲了公平性還要常常輪換。

在 PoS 系統中,若是檢測到有的參與者違反了 PoS 共識的協議,就能夠對他們作出一些懲罰。好比有的人把本身的一票投給不少個塊,或者說他有票,可是就是不投,這些會對系統的安全性形成影響的行爲均可以懲罰。

咱們再來看一下權益證實的優勢是什麼。

第一個優勢:礦工和持幣者的動機是一致的。PoS 的礦工都必須持幣,在整個的生態環境裏減小了一個不持幣但靠機器來挖礦的角色。在 PoW 的社區中,常常會出現有錢人、開發者、以及礦工三方的利益不是徹底一致的狀況,而後就會吵,以致於最後不少事很難辦成。到了PoS 中,如今至少礦工和資本家的利益會更爲一致,必定程度上減小了衝突和分歧。

第二個優勢:PoS 的延遲能夠作得很是低,確承認以很是快。在 PoS 系統裏,拿到一個交易就能夠立刻打包,打包之後就能夠廣播,這個時間是不須要等待的,不像 PoW,必須等至少作一個 PoW 問題的時間。實際上,PoS 共識的延遲主要是受限於網絡和參與投票的人數。由於你投票的人越多,確定要等的時間也就越久。 第三個優勢:PoS 比較環保,由於它不須要作工做量證實。投票實際上就是作個簽名,最多再作一些簡單的運算,比求解 PoW 難題容易多了。

但它的缺點也是跟上面相對的,PoW 系統的一些優勢它失去了。

第一,與無許可的 PoW 系統相比,PoS 的系統在匿名性和許可性上稍微差一些。由於我做爲一我的,我要加入一個 PoS 的系統,想進去投票,我首先要持有幣。這個幣我是不可能經過其餘方式獲得的,我必須跟已經有幣的那些人去作交易,他們把幣給我之後我纔有權利。這就不像 PoW,只要拿一臺機器接入系統,就能夠直接挖到幣。

第二,投票行爲自己成本很是低,只須要作個簽名就能夠生成一個有效的投票。這樣的話在安全性上會有一些問題。好比 PoS 系統常見的無利害攻擊問題。

另外,投票權能夠複用,能夠轉讓,這也是很差的。若是我把本身的私鑰賣給別人,那麼我之前投出的那些票,在歷史上每一個分支作出的選擇,這時候拿到我私鑰的人,他均可以再去投一遍。能夠重複使用之前的投票權會在安全性上帶來一些問題。等一下子咱們講到長程攻擊的時候再詳細討論。

還有就是投票機制帶來的一些問題。剛剛咱們說了 PoS 共識的優點是確認快,能夠作到不分叉,但這個不分叉的前提是須要假設大多數節點是誠實的。這裏說的有2/3以上的節點誠實,實際上嚴格來講是要求2/3以上的幣和投票權都在誠實的人手裏,壞人只有不到1/3的投票權。——這樣對於一個獲得2/3以上投票的塊來講,就算是有一些壞人能夠給不一樣的塊投票,他們聯合上剩下還沒簽名的好人,全加在一塊也不會超過2/3。這樣的話只要有足夠多的節點簽名,且整個系統裏大部分節點都誠實的話,這個系統就徹底不會分叉,又能夠作得很是快,你們確認得也會很快。例如 EOS 如今就實現了出塊很快,確認很快。

可是 PoS 共識的話也有一些新的問題。

第一個就是通信複雜度跟投票的人數相關,並且一般是平方的關係。參與投票的人數越多,通信越複雜,而後你們要等的就越久。就像是若是說咱們要一人一票選一下美國總統,整個投票的過程就很是複雜很是慢;而政治局裏邊投票決定一件事就快得多,由於他們人少。

還有一個PoS的共識的比較本質的問題,就是投票權的決定時間是早於生成候選區塊的。在有這個區塊之前,我就知道誰有投票權、誰沒有投票權了。由於投票權的決定方式,因此實際上決定投票權和行使這個權利的動做是分離的,沒有綁定在一塊兒的。我拿到投票權的時候,別人誰也沒有辦法說,就規定我這個票必須投給誰。因此拿到投票權之後,我能夠隨便地去投,而不會由於我投票的行爲決定我有沒有投票權。但這樣的話投票權使用是更靈活了,也意味着我能夠選擇的策略空間更大,整個博弈會變得更復雜。一般來講,策略空間大對於安全性是很差的,由於給攻擊者留出了更大的操做空間。一個誠實的人一般只會按照規則去,他每一次就肯定了作一個動做,可是攻擊者若是操做空間大,能幹的事兒就不少了,想保證安全性也會變得更難。結果就是在 PoS 系統裏面會有更多的攻擊方式,好比無利害攻擊、長程攻擊等。

那麼爲何在 PoS 系統裏,咱們不能像在 PoW 系統裏那樣,先生成區塊,而後再決定投票權呢?由於咱們須要確保對投票權你們是有共識的。無論投票者把票投給哪一個候選區塊,對於誰有權投票,是必須確保全部人都知道的。否則的話就會有可能退化成相似於 PoW 的狀況——這個在 PoS 系統裏邊叫 stake grinding,就是說每次嘗試產生不少新的區塊,而後從這些區塊裏挑選對本身最有利的一個廣播出去,而後由這個區塊去決定後邊的投票權。若是真的先出區塊,後決定投票權,咱們就可能會看到一個分叉分出去若干個分支,而後每個分支的區塊後邊都跟着一個親友團同樣的委員會,親友團裏邊多數人都說這個區塊是對的。可是由於每一個區塊後邊跟着親友團都不同,他們再怎麼投票也仍是達不到整個系統的共識。

還有一個 PoS 共識的問題,就是須要假設大部分節點是誠實的。「誠實」這件事兒通常是在密碼學裏邊提得多一些。可是在博弈論和經濟學裏面,不多會說一我的是誠實的,更可能是說一我的是理性的——若是說謊能夠多賺錢,不少人會選擇說謊。因此說,若是假設這些節點都是誠實的,其實是一個很是強的假設。意味着他們即便可以經過說謊、經過作惡多賺錢,也依然會選擇遵照協議。這點還須要看具體協議,對誠實要求到什麼程度,才能知道它是否是一個合理的假設。

下面我來說講如何解決 PoS 共識帶來的這些新的問題。

第一個是說通信複雜度很高的問題,這個實際上是最容易解決的。你們能夠隨機選取出一個比較小的委員會,由這些人做爲表明負責投票,或者也能夠用代理投票,就是我把個人票先投票去選一個表明,例如 EOS 裏邊的超級節點,而後這些選上的表明再代替我去投票。這樣的好處就是實際參與出塊共識投票的人數比較少,能夠下降投票的複雜度。現實中的人民表明大會、國外的議會或者陪審團,都是用到了相似的邏輯。

而後如何對抗攻擊呢?一個方式是咱們假設大多數人都是誠實的,再假設網絡有很是好的同步性——即廣播出去一個區塊之後,在一段肯定的時間內,好比說一分鐘或者30秒內,整個網絡絕大部分節點均可以收到。在這個前提下就很是容易作到共識。可是這樣的假設其實是很是強的,現實中並不容易保證。若是說咱們要解決某一個攻擊的問題的時候,直接假設這個攻擊不存在,而後問題解決了,這確定不是一個讓人信服的方法。

咱們再來討論一下幾種比較常見的針對 PoS 系統的攻擊方式。

第一個是無利害攻擊,其實也就是一票多投。若是說在一個 PoW 的系統裏邊,礦工看到有兩個區塊這樣的分叉,他的算力只能跟在一個後面去挖,不可能同時在兩個後面。固然真要同時挖兩個塊的話也不是不行,只是那樣就意味着分配到每一個塊上的算力確定是要減小的,兩邊挖礦的算力加在一塊兒是一個定值,因此通常不會有人這麼幹。在PoS的系統裏邊就不同了:我看見左邊有一個分叉,好,我給他投一票;看見右邊有一個分叉,我又投一票。這樣無論哪一個分叉稱爲共識,我均可以分到投票的獎勵。這樣的話壞人就很開心。壞人說反正我作一個分叉,大家這些理性的礦工也都會給我投票,那麼我只要比剩下那些「不那麼理性的好人」掌握的投票權多一點就能夠把以前的主鏈給回滾掉。這樣的話就很不安全。

對於無利害攻擊,常見的對抗方式是說一旦檢測到這種一票多投的行爲,就對這種人作出一個懲罰。你若是真的一票多投,別人能夠拿到你投票的信息,而後提交到鏈上,說「這我的一票多投了,扣他錢」。可是這種方法實際上也可能會遇到一些問題,就是有可能會出現我在兩邊一票多投了,可是最後只在一邊會被扣錢,但在另外一邊有可能會獲得更大的收益。

還有一個是賄賂攻擊。投票的時候,大部分參與者實際上都更接近理性人。好比說你持有一百塊錢,每次投票的收益是一塊錢,而後我跟你說只要你把票投給個人這個區塊,我就給你兩塊錢。可能不少人都會接受個人提議。這樣的話,壞人能夠用很是低的成本,去買到更多的票支持本身的分支,好比說用兩塊錢買到至關於一百塊錢資產的投票權。這確定會對安全性形成影響。如今對賄賂的問題已經有一些解決方案了,雖然還不是特別完美,可是已經比較讓人信服了。好比像 Algorand 提出解決的方案,就是投票權的分配是經過私有的隨機數去算的。在投票者把這個投票權的證實公開出來之前,你們都不知道到底哪些人有投票權。這樣的話,至少在投票以前不會有人知道我有投票權,他們也沒辦法來賄賂我。公開投票之後,由於 Algorand 的方式是每完成一輪投票就把委員會全部的人全都換一遍,而後從新選一批人去投票,因此在別人知道我有投票權的時候個人票已經投出去了,沒辦法再去賄賂去修改了。這裏對共識參與者的誠實性有一個比較高的假設:不能說我有投票權之後就跑到網上處處問,我有哪些輪次的投票權,有沒有人要出錢買。現實中若是真的有人大規模的去問這件事,其實很容易被社區發現,你們就會知道有人在作這種攻擊了,也就比較容易作出應對。因此這至少是一個下降被攻擊風險的方法。

還有一個是關於長程攻擊的安全性。這個說的是什麼呢?就是說A在創世區塊有20%的幣或者20%的股權,他就能夠在正常的區塊上出塊去投票。然而,A能夠在某個時間把他在鏈上的幣全都賣掉,也就是套現跑路。如今他在鏈上沒有任何錢,之後別人不可能在鏈上懲罰他。這時候他把本身的私鑰賣給攻擊者。攻擊者能夠去收購A的,B的、C的、不少人的不少私鑰。收購到那些私鑰之後,這些私鑰在創世塊裏面控制的權利多是超過50%的,甚至超過80%都有可能。而後攻擊者拿到這些私鑰之後再作出一個惡意區塊,代替A,B,C 他們各投一票支持惡意區塊。

在第三方看來,這個區塊和真正的主鏈區塊看上去都是一樣合法的,由於都有不少人去投票。若是壞人的這條鏈足夠長,之後新加入的人會發現如今有兩條鏈,每一條都是有不少人投票投出來的,我該信哪個?這時候共識已經出現問題了。因此怎麼應對這種攻擊呢?一種方法是說要保證一個弱活躍性,即要求每個誠實的礦工至少隔一段時間就上去看看,同步一下最新的狀態。若是有人告訴你說你那個狀態不對,應該從一年前的某一個狀態分叉過來,一般來講你不該該接受這樣的一個建議,由於回滾的時間過久了。

還有一個方式就是鎖定押金,而後再加上回滾的長度限制。以太坊的 Casper PoS 協議裏邊就是這麼設置的。若是你非要把用於投票的錢賣掉,能夠,但你必需要等一段時間。這個時間足夠久,久到等其餘的人再看到你用以前的投票權去投票的時候已經不會認可了。由於別的人已經跟着合法的鏈日後走很遠了。這個是以太坊的解決方案。

Algorand 在這一點上解決的方案是,既然大家是誠實的,做爲一個誠實的人,你每一輪投票之後,你應該把當輪投票用的私鑰刪掉,在你刪掉了之後,就不會有人再拿這個私鑰去幹壞事。這個解決方案說得沒錯,可是它對參與者的道德水平提出了比較高的要求。

基於 PoS 的共識系統還有一些其餘問題。一般咱們若是選擇一個小的委員會,若是不用 DPoS 的話,在 PoS 系統裏咱們須要隨機地去選。PoW 投票裏的隨機性主要是由你們分佈式並行挖礦時候的運氣帶來的,由於求解 PoW 問題自己有內在的隨機性。但若是說咱們要用隨機性去選擇一個投票委員會的話,就又要解決一個新的問題:怎麼樣去產生一個公平的隨機數?

如何產生公平的隨機數在密碼學上也是一個討論了不少年的問題,目前也有相對比較好的方案去解決。這個方案雖然說不能產生絕對均勻的完美的隨機數,但誤差能夠控制到一個範圍之內。另外一方面,產生徹底均勻的完美的隨機數是很難辦到的。由於咱們知道,若是有 2/3 以上的幣攻擊者就能夠徹底控制整條鏈,產生的隨機數也能夠隨便挑。因此你若是有 67% 的幣就能夠控制百分之百的隨機數,那麼有10%的幣能控制個 11% 的隨機數聽起來也不是特別不可接受。其實基於 PoW 的比特幣也有相似的性質:好比說有 51% 的算力就能夠控制鏈上百分之百的收益;少一些的話,實際上有百分之二十幾算力就能夠經過自私挖礦,得到比實際算力所佔的百分比高一點的收益。這是一個非線性的關係,可是隻要它不是偏離得太多,你們通常仍是勉強能夠接受。

PoS 共識的安全性假設是比 PoW 要強的。PoW 咱們要求是要有51%以上的誠實算力,PoS的 Algorand 他們對 Staker 的要求是 80% 以上的錢控制在誠實的人手裏,並且這些人須要很是誠實:他們不會提早告訴別人本身有投票權;投票之後要把當輪的私鑰刪掉,不能賣給別人;並且他們還必須按期上線去同步一下狀態,算一下接下來的一段時間內本身是否是有投票權,若是有的話還要按時上線投票。若是像咱們如今不少人那樣,錢存在銀行後就無論了,不到花錢的時候就不會去登陸系統,那麼壞人只要在最後實際投票的活躍的人裏邊超過必定的比例就能夠了。不活躍不投票的人實際上不對安全性產生任何貢獻。固然即便通常的 PoS 至少也會要求 2/3 以上的多數錢是掌握在的誠實的人手裏,並且還要有必定的對於活躍性的假設或者說要求。至少誠實的人要常常上線去看一下,去投個票什麼的。

另外,基於 PoS 共識的系統在啓動的時候會有一些問題。由於一個項目每每剛開始啓動的時候,是它的資產分佈的最不去中心化的時候。就像比特幣剛開始的時候,中本聰會有不少的幣。若是是 PoS 的系統,他一我的就能夠徹底控制整個系統。其餘項目的開發團隊以及早期的幾個大的投資機構,可能就已經拿到大部分的幣了,他們對 PoS 的話語權會變得很是很是大。因此如何啓動一個 PoS 的公鏈也是一個比較大的問題。EOS 啓動前也是花了好久時間才作得比較好的。因此對於這一點,咱們團隊認爲至少在項目啓動的時候,用 PoW 是比 PoS 要方便不少的。PoW 方式才能作到無許可,而後一開始的幣在發行的時候也會比較公平。

最後,雖然 PoS 能夠檢查一些違規行爲,而後在鏈上對這些人作懲罰,可是有可能攻擊者的利益並不全在鏈上,他在鏈下還有其餘的收益。好比說我在以太坊上發起攻擊,在上面被懲罰損失不少以太幣;可是同時幣價也極可能會下降,若是我在另外的市場作空以太幣,就能夠經過作空獲得更高的收益。這樣的話,鏈外的動機會致使一些在鏈上有不少錢的人依然有動力去攻擊這條鏈。這也是 PoS 比較難解決的一個問題。

04 PoW VS PoS

咱們最後簡單看一下基於 PoW 和 PoS 機制的共識的比較。

一個是准入機制。即它究竟是不是有許可的?投票是否是匿名的?參與的人數有沒有限制?投票的形式是並行仍是要經過廣播的方式?還有一個投票結果確認的方式?投票的邊際成本?

一個是安全性。我以爲最大的兩個區別就是先有投票權,仍是先有候選區塊?投票行爲和投票權利是否是綁定的?從這些角度上看,PoW 在安全性方面作得比較好。

可是,PoW 的投票結果須要等一個分支上累積的優點足夠大才能確認,因此其實不是等一個塊,他還要再等誠實的算力集中在這一塊後面工做一段時間之後才能確認。所以 PoW 系統只能說經過一些優化把確認速度儘量加快,可是很難作到像有的 PoS 那樣秒級確認。

說到投票的邊際成本,由於要有機器和電費,PoW 是沒辦法避免的。但其餘的方面作得都比較好。相對的,PoS 在性能方面作得比較好,主要差在安全性上。就是由於它先決定了投票權,因此你們拿着這個投票權能夠隨便投。並且你投過一次票之後還能夠拿着這個權利再投。至於 PoS 其餘的一些問題,實際上咱們用委員會或者用代理的權益證實均可以把那些問題減輕或者解決掉,只有投票權的問題很難解決。投票權和投票行爲不綁定的問題是 PoS 的一個本質難題。

PoW 的缺點是確認慢,吞吐量通常會相對比較低一點。PoS 主要缺點是要考慮如何應對賄賂攻擊、長程攻擊、無利害攻擊等各類攻擊手段。爲了應對這些攻擊,PoS 的協議就要處理不少狀況,因而就會變得比較複雜。衆所周知,越複雜的系統的安全性也越難保證,一方面是分析證實起來會更困難,另外一方面是攻擊者也更容易在複雜的系統找到漏洞。

還有一種如今可能用的還不是不少的方式是 PoW 和 PoS 混合在一塊兒作共識。由於 PoW 的優勢主要就是安全可靠,而 PoS 的優勢是效率高,特別是確認快,並且能耗比較低。若是能把這兩個的優勢結合在一塊兒,就有可能設計出一個更理想的共識協議。同時你們還能夠考慮用 DAG 的方式而不是鏈的方式組織區塊。由於 DAG 的方式不怕分叉,不須要過度限制出塊速度,因此你們能夠出塊出得比較快,只要帶寬能同步就能夠。

當吞吐量作到帶寬和網絡容量的上限之後,若是要進一步的擴容,就須要從其餘方面動腦筋了。一個比較簡單的思路是採用第二層的擴容方案:每筆交易不要傳到全網去驗證,好比像sharding,一個交易只在 shard 內部局部地驗證,這樣的話就能夠節省全網的帶寬,提升整個系統吞吐量。閃電網絡也用到了相似的邏輯。另一種比較難的方式要用到一些「黑科技」,好比可驗證計算、簡短的零知識證實、機率可驗證證實等等,這裏不展開講了。

但設計 PoW 和 PoS 混合的系統最難的一點是怎麼樣把二者的優點結合在一塊兒,而不是把它們的劣勢結合在一塊兒。我據說過有一些設計是先用 PoW 的方式挖到一個票,而後用這個票去對候選區塊進行投票。在我看來這種方式就不是很好,由於它放棄了 PoW 投票和投票權綁定的優點,安全性更接近於 PoS 系統。

若是能把 PoW 和 PoS 的優點結合起來,就有可能作到一個安全性又高,確認又快,吞吐量大,並且能耗還比較合理的系統。目前爲止我尚未看到特別好的解決方案,期待之後能出現這樣一個完美的解決方案。

相關文章
相關標籤/搜索