12月16日,「鏈客Talk」邀請YOUChain公鏈研發負責人 Darlzan Liang來到鏈客直播間,給大家分享了「探討PoS公鏈的無準入以及廣泛參與」這一話題。
以下是此次活動的內容整理:
1.關於去中心化的理解
去中心化是公鏈項目核心的主題以及永恆的追求。區塊鏈的鼻祖中本聰基於「一算力一票」(One-CPU-One-Vote)的理念,採用PoW共識算法創建了第一條去中心化的公鏈,在運行了近十年之後引起了全世界廣泛的關注並吸引了無數人才、資本、學術力量參與相關技術及應用的研究與探索。
縱觀這些年整個行業的發展,可以看到在公鏈領域,基於PoW的鏈無疑是最能體現去中心化思想的,但是人們也早就意識到這類型的公鏈也存在著巨大的不足,包括資源消耗巨大、業務吞吐量較低、無可避免地陷入寡頭控制(少數礦池掌握絕大部分算力)的局面等等問題。
針對PoW類公鏈的這些問題,業內一個很常見的探索方向,是採用股份證明(PoS)類型的共識算法,以期實現低資源消耗、高TPS、快速確認等等目標。這一類共識算法,細節上多種多樣,但總體上都有幾個共同特點,包括:一般包含區塊提議方案和區塊驗證投票方案兩部分,基於拜佔庭容錯(BFT)的投票設計實現一致性;一般不分叉(不允許分叉)。這一類的公鏈,業內普遍認為相對PoW的公鏈而言沒有那麼去中心化,主要包括有準入、參與共識的節點數量較少等問題。即使對於業內的明星項目如以太坊2.0,Algorand等,也存在這方面的問題,目前並沒有有效解決。
總體而言,我們認為,如果一條公鏈存在有準入,或者參與門檻特別高,或者有效參與公鏈治理的節點數量很少等這一類問題,那它就不能說是去中心化的,或者說去中心化的程度很有限。
我們基於一段時間以來的深入研究,針對PoS類型公鏈在實現無準入、用戶可廣泛參與這一目標過程中所面臨的問題進行了梳理,積極探索並在YOUChain這一公鏈中進行實踐驗證。今天借鏈客talk所提供的這次機會跟大家進行探討交流,希望能拋磚引玉,給行業的發展提供一點思路。
2. PoS類型公鏈實現無準入需要解決的關鍵問題——活性保障
區塊鏈(共識算法)需要保障兩個重要的特性,即安全性和活性。安全性是指只要協議的惡意參與者不超過某個閾值,那麼就沒有任何參與者能夠說服其他參與者接受不正確或無效的消息。包括人們所熟知的雙花問題、偽造區塊問題等都屬於安全性的範疇。而活性是指只要協議的惡意參與者不超過某個閾值,其他參與者就不能無限延期地接受正確的消息。通俗來說,活性就是指能持續的打包新區塊並對新區塊完成共識。
對於PoW類型的公鏈來說,活性是極易保障的並且是沒有任何參與者能破壞掉的,相應地其重心是要考慮區塊鏈的安全性問題。
對於PoS類型的公鏈來說,保障安全性的手段比較有限,基本上都得基於PBFT算法實現「多數共識」;因此,在滿足安全性的前提下,其活性就受到了限制。
展開來說,要實現PBFT共識投票,前提就是要有一個確定的參與者集合,這個參與者集合的信息,是在歷史區塊中已經確定並固化了的,從而網絡中相互獨立運行的節點,可以基於共同的已知信息,依據一定的算法規則完成區塊提議、區塊驗證(投票),並保證輸出一致性結果。在這個確定的參與者集合中,如果有超過1/3的參與者(這個比例,按實現細節不同而不同,可能是股份比例,或是節點數比例等等)作惡或者因各種原因主動或被動怠工,那麼就會導致新的區塊無法完成共識,從而區塊鏈喪失活性。這時,也沒有任何新的參與者可以加入共識,從而區塊鏈的活性無法在一個去中心化的環境下恢復。這種情況,對於一個有準入的PoS類型區塊鏈來說,由於參與者在現實世界中互相都可聯繫上,因此一旦發生此類停塊事件,參與者之間可以通過現實世界中的溝通及施加壓力,迫使作惡者停止作惡,或者迫使怠工者恢復工作,從而可以在不修改任何規則的情況下就恢復活性。而如果要實現無準入,那麼就無法要求參與者不匿名,因此也就會失去「現實世界中的溝通協調」這一保障機制。所以,對於PoS類型的公鏈而言,要實現無準入,就必須對活性保障問題做更多的權衡及考量。
PoS類型公鏈要實現無準入,並保障安全性和活性,在設計整個共識算法(含鏈上治理方案)時,免不了要考慮幾個相互關聯相互制約的問題,接下來分別加以討論。
3.實現活性保障時需考慮的若干問題之一:要同時保證網絡不分叉
PoW類型公鏈主要是在高活性的基礎上考慮高安全性的問題,其中一個主要原因就是它可以是完全無準入的,任何新的參與者都可能使區塊鏈往後增長,也就是它可以隨意分叉(這裡主要指軟分叉,即在共識規則之內就可以產生不同的鏈分支)。從而,該類型公鏈需要著重考慮安全性問題,即通過分叉選擇規則(主要是最長鏈規則)、區塊確定性規則等結合起來實現安全性要求。同時,該類型公鏈的安全性,主要是概率性的,而不是確定性的,比如說對於比特幣一般要求一筆交易經過6個區塊的確認,才認為其是安全可接受的。
而PoS類型的公鏈,在安全性方面,可以做到完全不會分叉,而主要要考慮活性問題。實際上,嚴格來說是在於PoS類型的公鏈,一旦允許分叉的產生,則設計一個滿足安全性要求的分叉選擇方案將成為難以解決的難題。
為什麼呢?我們考慮以下幾種情況:
(1)如果當前區塊的參與者集合是在歷史區塊上固化下來的,那麼採用PBFT類算法實現多數表決,那本身就不可能分叉;這時就只需要考慮活性問題。
(2)如果想要保障很高的活性而考慮一些「可變參與者集合」的方案,比如在一些節點怠工而導致停止出塊的情況下,按照某些策略,從初識參與者集合中,衍生出來一個子集合,然後用該子集合完成對新區塊的共識,那這種情況,就會導致分叉的產生。比如在網絡發生短時間的分區、惡意節點故意造成網絡分區等等情況下,參與者將被分隔在不同的分裂網絡內,這時就會觸發前述的「參與者集合變更策略」,也就可能在各自的網絡內生產分叉。因此,這種情況就要考慮分叉選擇方案,即一旦出現多個分叉,那麼將如何從中選擇一條分支作為權威的分支?目前來看,對於這個問題還沒有可行的方案。我們無法像PoW類型的公鏈一樣,使用最長鏈或類似規則,因為一旦考慮這樣的規則,就又要面臨一個問題,能定下來一個「區塊確認數」嗎?答案是不能!
原因在於:
PoS類型的公鏈,其鏈增長速度不是與物理算力關聯的,不同分叉鏈的增長速度,完全沒有統一的約束,完全不可比較。例如,假設有一條PoS類型的公鏈,允許產生分叉,然後一部分節點當前認可的是一條有10萬個區塊的鏈,平均5秒增長一個區塊;那麼那些能夠維護一條分叉鏈的惡意節點,假設它們在10萬高度上製造了一個分叉,然後它們完全可以通過一些手段(比如運行在一個區域網內、提供更高的算力、調整一些參數如產塊間隔等),讓它們的分叉以1秒或更短的速度產塊;然後等待原來被大家認可的分叉的長度超過10萬+「區塊確認數」的時候,向全網廣播出去一條更長的鏈。這也就說明了,這種情況下,要確定一個「區塊確認數」是不可能的!
根據上面的分析可以看到,對於PoS類型的公鏈,在滿足安全性的前提下,網絡是不允許分叉的。而這,也成為高活性的一個障礙。
4.實現活性保障時需考慮的若干問題之二:經濟模型的支持
對於一個無準入公鏈,需要有核心參與者承擔起鏈的正常運轉以及歷史數據的存儲等等職責。而他們承擔這些職責的動力,肯定在於利益驅動。利益可分兩部分,一部分是現有股份的價值及其保值增值;另一部分就是參與共識及區塊鏈治理所能獲得的獎勵。單純依靠前者來驅動一條無準入公鏈的運轉,是不大現實的,因為鏈及其代幣的價值,對於鏈的所有用戶而言是公共的,而對於公共利益的維護,不足以調動具體參與者的積極性,這其實是一個「公地悲劇」問題。從而另一部分利益也是及其重要的(實際上對於比特幣而言,挖礦獎勵是最主要的驅動力),而這就是一條公鏈的經濟模型設計問題。
對於PoS類型的公鏈而言,每一個區塊的參與者,除了區塊提議者之外,還有很多驗證者(投票者)。如果這些參與者不積極參與,而是疏於維護節點狀態、隨意怠工,那麼將對網絡的活性產生嚴重負面影響。而要激勵他們積極參與,就需要好好設計區塊鏈的經濟模型。
一個好的經濟模型,應該符合一些基本原則,如多勞多得、不勞不得,甚至怠工需要受到懲罰等。這其中,怠工問題需要著重解決,包括怠工的識別,證據及懲罰措施的一致性等問題。
關於這個問題,如果設計階段就加以考慮,這應該不是難題。但是實際上並不是每個項目都能考慮到,其中一個相當有名的項目「Algorand」,該項目由MIT教授、圖靈獎得主SilvioMicali主導,開創性地提出了基於VRF密碼學自抽籤技術的「PoS+BFT」共識算法的一個變形,具有極大的創新性。其宣稱共識上是完全去中心化的,同時區塊獎勵是在所有的持幣帳戶中按持幣比例平均分配的。實際上,其宣傳與實際情況的符合性存疑。首先,該項目上線的時候,是有準入的,當前雖然文檔上宣稱是無準入,但是通過分析其區塊提議者可以知道,絕大部分區塊提議者持幣數量都在總持幣量排行榜Top100中;另外,相關的抽籤概率是跟帳號持幣量有關的,在共識參與者持幣高度集中的情況下,因為核心的少數參與者已經完全能控制鏈的運行,那對其他「散戶」而言,是可以放開準入,而無需擔心怠工等問題。作為上述論述的佐證,可以抽樣考察Algorand的實際情況,通過分析10640498~10640997這連續500個區塊的提議者,可以發現這裡面提議者地址總共只有56個,其中47個的持幣量在Top100之內,這47個區塊提議者的持幣量佔全網在線代幣總量的96%以上。
Algorand通過持幣集中化、並依靠用戶誠實並及時正確地維護帳戶狀態等方式,實現共識(不包含其他的鏈上治理功能)的無準入,其效果有待觀察。
5.如何支持廣泛參與
在一個分布式的P2P網絡中,消息的延遲和消息的冗餘量跟節點規模息息相關。隨著節點規模的擴大,消息的冗餘將呈指數級增長,因此,基於PBFT類算法實現共識的公鏈,其在同一輪共識周期中,其真正應該參與共識的節點規模是嚴重受限的。當節點數達到一定規模後,網絡中的共識消息將爆炸性增長,從而對網絡帶寬、節點的計算資源等都帶來嚴重影響,一般都難以承受。雖然沒有明確的理論證明,但是行業內也基本有個共識,就是採用了PBFT類算法進行投票的鏈,其同時應該參與投票的節點數難以超過100個。
因此,我們應該意識到,無準入不等於無限制。PoS類型的公鏈,在實現無準入、自由參與的過程中,還需要考慮通過共識機制、參與門檻等等方面的設計,來保證同時可參與投票的節點數量限制在一個合理範圍之內。
那麼PoS類型的公鏈是如何支持廣泛參與的呢?大部分都採用了委託的形式,即大部分想參與的持幣者,都將自己的代幣委託(或投票)給少數幾個頭部參與者,由那些頭部參與者代表自己參與共識。這種方式不失為一種支持廣泛參與的可行方案,但這種方案卻不見得是一種理想方案。主要原因在於,這些委託者除了可以獲得一定的獎勵之外,實際上對於防止網絡趨向中心化起不到任何作用,更不用說參與網絡治理等活動。
當然,Algorand項目有點不同。Algorand宣稱是不設門檻的,所有有意願的帳戶都可以運行自己的節點並參與共識(不包含鏈上治理)。但實際上,基於前述的持幣集中化措施,Algorand才能維持正常運轉。一旦代幣比較分散,即有成千上萬的參與者持幣量相差不顯著,那麼在Algorand現有抽籤機制下,每一輪共識(準確地說是共識的每一個步驟中)可參與的節點數量將有成百上千個,這種狀態下,網絡通信量將是不可承受的。
6. YOUChain的探索與實踐
YOUChain致力於打造一個人人可參與的高性能可擴展公鏈。項目啟動以來就一直圍繞此目標積極探索,並取得大量進展,主網已於今年6月份成功上線。本著負責和謹慎的態度,主網運行的早期階段,我們保留了準入措施。
經過對主網運行狀態的持續觀察,並隨著研究探索的深入進行,我們對實現無準入及廣泛參與這一目標所要考慮並解決的各類問題有了更深入的理解,主要包括但並不局限於前面已討論的幾個問題。基於目前的研究,我們已經設計了優化改進方案,並已開始逐步實施。
首先,無準入及廣泛參與這樣的目標需要整體考慮。我們主要通過節點分類的機制來達到廣泛參與的目標。具體而言,參與共識的節點分成了參議和眾議兩大類,其中參議節點是共識的核心參與者,同時還將承擔起歷史數據存儲、P2P網絡樞紐節點等職責;這類節點,需要較多的代幣抵押,並且也要求較高的硬體資源,當然相應地其獲得的區塊獎勵也相對更多。而眾議節點主要用於支持用戶廣泛參與,以較低的抵押要求以及硬體資源要求,起到對參議節點的監督作用。通過眾議節點的監督,可以使得普通用戶就能參與到共識和網絡治理活動中,「以群眾的力量」,監督參議節點是否誠實工作、相關提議是否符合既定規則、變更規則(即協議版本升級)時新的規則是否可接受。從而真正避免區塊鏈趨向中心化,真正實現去中心化的目標。
其次,對於區塊獎勵的分配,我們將調整為完全的「按勞分配」,同時,獎勵的分配機制也能支持節點怠工情況的發現及懲罰。
具體而言就是,對於參議節點,只有區塊提議者才能獲得該區塊的獎勵。參議節點成為區塊提議者的概率,跟其抵押額正相關。因此,從較長的時間跨度來看,獎勵由區塊提議者獲得,是公平合理的。另外,只有積極誠實參與,才有可能成功提議區塊,從這個角度來說,獎勵由區塊提議者獲得,能更合理地體現激勵的本質。同時,基於統計概率方面的計算,我們可以認定,在一定的區塊範圍之內,誠實的參與者肯定有機會成為某個區塊的提議者,從而我們可以根據參議節點獲得獎勵的情況,如果發現一個標識為在線的參議節點長時間未獲得任何區塊獎勵,則就可認定其存在怠工行為,從而對其執行怠工懲罰。
而對於眾議節點,要實現「按勞分配」,就需要使得其投票信息在全網中可以固化並保持一致,這存在較大的困難。但通過對很多細節加以研究之後,我們提出了以下改進方案,將能較好地滿足我們的目標要求:
(1)眾議節點的投票權,不再基於高成本的VRF密碼學自抽籤方案,改為更適合眾議節點參與的「一節點一票」的投票權設計;
(2)每輪投票,將從眾議節點總集合中,按一定規則選出一個小集合,由這個小集合進行投票;
(3)由於眾議節點主要起監督作用,其本身不會導致區塊鏈分叉,因此不用考慮拜佔庭將軍問題,從而其投票通過閾值設置為超過當前選出的小集合的50%即可;
(4)不需要完整的兩階段投票,而只需在參議節點的第一階段投票完成後,直接進行投票(即參議節點還是原來的兩階段投票,眾議節點只做一階段投票);
(5)為了實現獎勵分配的按勞分配,進而有效解決怠工問題,考慮採用如下獨特設計,即眾議投票信息延後固化及驗證:由於需要將眾議節點的投票信息固化,從而為獎勵分配提供一致性依據。同時考慮降低對產塊間隔(共識周期)的影響,以及避免數據重複存儲,特設計了該延後機制。具體為:
共識過程:進入區塊r的共識周期時,區塊提議者收集眾議節點對r-1區塊的投票(票數需滿足最低閾值要求),固化到區塊r的區塊頭中;
任何一個節點,收到提議區塊r時,先判斷其記錄的眾議節點對r-1區塊的投票是否滿足要求,滿足則接受,不滿足則不接受;
各節點分別對某個符合要求的提議區塊r進行投票;
最後只驗證參議節點對區塊r的投票達成共識,即可完成r的確定;
而這時眾議節點對r的投票,將會在r+1的周期中進行驗證。
(6)在基於上述投票設計的基礎上,眾議節點獎勵分配規則為:在一個分配周期(128個區塊)內,所有有投票記錄的眾議節點,平均分配本周期的區塊獎勵。
(7)基於上述設計,一個誠實且硬體條件跟得上的眾議節點,在該投票的時候都將自己的投票廣播到了網絡中,則其在每個周期內都會有非常大的概率獲得獎勵(未獲得獎勵的概率將是10^(-6)級別),則連續兩次未獲得獎勵的概率,將是10^(-12)級別,可以認為不會發生。因此,我們設置怠工懲罰規則如下:若一個「在線」狀態的眾議節點,連續兩個分配周期未獲得獎勵,則認為該節點怠工(實際上,怠工有很多種情況導致,除了主動怠工,還可能有被動怠工,如網絡不好跟不上實時進度、硬體資源跟不上等等)。怠工的節點,將被處以一定罰金(如節點抵押額的5%,待定)並且被處罰下線。
結合新的獎勵分配及怠工懲罰方案,網絡將可以有效激勵節點保持誠實行為(誠實標識自己是否在線,以及在線節點積極參與實際工作),同時能自動避免節點的有意或無意的怠工行為對網絡活性造成重大影響。