steemit上原文鏈接:https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper
關(guān)于BitShares的DPoS共識的概述請參考:股份授權(quán)證明(DPOS)概述
關(guān)于BitShares的DPoS共識的詳細(xì)介紹請參考:BitShares的DPoS共識
關(guān)于BitShares的DPoS共識的競爭鏈共識補(bǔ)充說明請參考:DPOS共識算法 - 缺失的白皮書
關(guān)于BitShares的DPoS共識之代碼實(shí)現(xiàn)概述請參考:BTS的DPoS共識之代碼實(shí)現(xiàn)概述
這是缺少的白皮書和關(guān)于股份授權(quán)證明(DPOS: delegated proof of stake)的分析。 本白皮書的目標(biāo)是分析DPOS為什么起作用以及其為何如此健壯。 有關(guān)DPOS的早期描述可以在bitshares.org上找到。 不過,那個(gè)描述還包括許多與實(shí)際共識過程不符的部分。
所有區(qū)塊鏈本質(zhì)上都是一個(gè)由交易驅(qū)動的確定性狀態(tài)機(jī)。共識是商定確定性交易順序和過濾無效交易的過程。有許多不同的共識算法都可以產(chǎn)生等效的交易排序,但DPOS已經(jīng)通過在多個(gè)區(qū)塊鏈上經(jīng)年累月的可靠運(yùn)行證明自身是健壯、安全和有效的。
和所有共識算法一樣,區(qū)塊生產(chǎn)者可能導(dǎo)致的最大損害是審查。根據(jù)確定性開源狀態(tài)機(jī)原理,所有區(qū)塊必須有效。
1. DPoS共識算法概要
DPOS算法分為兩部分:選擇一組區(qū)塊生產(chǎn)者和調(diào)度生產(chǎn)區(qū)塊。要確保選舉過程由股東最終控制,因?yàn)楫?dāng)網(wǎng)絡(luò)連接不暢通時(shí),股東的損失最大。選舉方法對實(shí)際運(yùn)行中如何達(dá)成共識幾乎沒有影響,因此,本文將重點(diǎn)介紹如何在區(qū)塊生產(chǎn)者被選擇之后達(dá)成共識。
為了幫助解釋這個(gè)算法,我只假設(shè)3個(gè)區(qū)塊生產(chǎn)者A,B和C。因?yàn)楣沧R(的達(dá)成)需要2?3+1(個(gè)節(jié)點(diǎn))來解決所有情況,這個(gè)簡化的模型將假設(shè)生產(chǎn)者C是打破僵局的那個(gè)節(jié)點(diǎn)。在現(xiàn)實(shí)世界中,將有21個(gè)或更多的區(qū)塊生產(chǎn)者。像工作量證明(PoW)一樣,一般規(guī)則是最長鏈勝出。任何時(shí)候當(dāng)一個(gè)誠實(shí)的對等節(jié)點(diǎn)看到一個(gè)有效的更長鏈,它都會從當(dāng)前分叉切換到更長的這條鏈。
我將通過示例展示,在幾乎所有可能想得到的網(wǎng)絡(luò)條件下,DPOS是如何運(yùn)行。這些例子應(yīng)該可以幫助你理解為什么DPOS穩(wěn)健且難以破壞。
2. 正常生產(chǎn)流程
在正常操作模式下,區(qū)塊生產(chǎn)者們每3秒鐘輪流生成一個(gè)塊。假設(shè)沒有節(jié)點(diǎn)錯過自己的輪次,那么這將產(chǎn)生最長鏈。區(qū)塊生產(chǎn)者在被調(diào)度輪次之外的任何時(shí)間段出塊都是無效的。
3. 少數(shù)節(jié)點(diǎn)分叉
不超過節(jié)點(diǎn)總數(shù)1?3的惡意或故障節(jié)點(diǎn)可能創(chuàng)建少數(shù)分叉。在這種情況下,少數(shù)分叉每9秒只能產(chǎn)生1個(gè)塊,而多數(shù)分叉每9秒可以產(chǎn)生2個(gè)塊。這樣,誠實(shí)的 2?3多數(shù)將永遠(yuǎn)比少數(shù)(的鏈)更長。
4. 離線少數(shù)節(jié)點(diǎn)的雙重生產(chǎn)
(離線的)少數(shù)節(jié)點(diǎn)可以試圖產(chǎn)生無限數(shù)量的分叉,但是他們的所有分叉都將比多數(shù)節(jié)點(diǎn)的那條鏈短,因?yàn)樯贁?shù)節(jié)點(diǎn)在出塊速度上注定比多數(shù)節(jié)點(diǎn)來的更慢。
5. 網(wǎng)絡(luò)分片化(Fragmentation)
網(wǎng)絡(luò)完全有可能分片,從而導(dǎo)致多個(gè)分叉,且所有分叉都不擁有多數(shù)區(qū)塊生成者。在這種情況下,最長的鏈將倒向最大的那個(gè)少數(shù)群體。當(dāng)網(wǎng)絡(luò)連通性恢復(fù)時(shí),較小的少數(shù)群體會自然切換到最長的那條鏈,明確的共識將恢復(fù)。
有可能存在這樣三個(gè)分叉,其中兩個(gè)最長的分叉長度相同。在這種情況下,第3個(gè)(較小)分叉的區(qū)塊生產(chǎn)者重新加入網(wǎng)絡(luò)時(shí)會打破平局。區(qū)塊生產(chǎn)者總數(shù)為奇數(shù),因此不可能長時(shí)間保持平局。稍后我們還會講到“洗牌”生產(chǎn)者,它使得出塊順序隨機(jī)化,從而確保即使是生產(chǎn)者數(shù)目相同的兩個(gè)分叉也會以不同的步長增長,最終導(dǎo)致一個(gè)分叉超過另一個(gè)。
6. 在線少數(shù)節(jié)點(diǎn)的雙重生產(chǎn)
在這種場景下,少數(shù)節(jié)點(diǎn)B在其時(shí)間段內(nèi)產(chǎn)生了兩個(gè)或更多可供選擇的塊。下一個(gè)計(jì)劃生產(chǎn)者(C)可以選擇基于B產(chǎn)生的任何一種方案繼續(xù)構(gòu)建鏈條。一旦如此,這個(gè)選擇就成為最長的鏈,而所有選擇B1的節(jié)點(diǎn)都將切換分叉。少數(shù)不良生產(chǎn)者企圖廣播再多的替代塊也無關(guān)緊要,它們作為最長鏈的一部分永遠(yuǎn)不會超過一輪。
7. 最后不可逆區(qū)塊(Last Irreversible Block)
在網(wǎng)絡(luò)分片化的情況下,多個(gè)分叉都有可能持續(xù)不斷增長相當(dāng)長的時(shí)間。長遠(yuǎn)來看最長的鏈終將獲勝,但觀察者需要一種確切的手段來判定一個(gè)塊是否絕對處于增長最快的那條鏈。這可以通過觀察來自2/3+1多數(shù)區(qū)塊生產(chǎn)者的確認(rèn)來決定。
在下圖中,塊B已被C和A所確認(rèn),這代表已經(jīng)被2?3+1的多數(shù)節(jié)點(diǎn)確認(rèn)了,由此我們可以推斷沒有其它鏈會比這個(gè)更長 – 如果這2?3的生產(chǎn)者是誠實(shí)的。
請注意,這個(gè)“規(guī)則”類似于比特幣的6塊確認(rèn)“規(guī)則”。一些聰明節(jié)點(diǎn)也許可以謀劃一系列事件使得兩個(gè)節(jié)點(diǎn)(“交易”?)出現(xiàn)在不同的最后不可逆區(qū)塊上。這種極端例子要求攻擊者能完全控制通信延遲,并且在幾分鐘內(nèi)兩次--而不是一次--使用該控制。即便這真的發(fā)生了,那么最長鏈(勝出)的長期規(guī)則仍然適用。我們估計(jì)這種攻擊的可能性接近0,且經(jīng)濟(jì)損失微不足道,因此不足為慮。
8. 法定(Quorum)生產(chǎn)者節(jié)點(diǎn)數(shù)不足
在缺乏明晰的生產(chǎn)者法定節(jié)點(diǎn)數(shù)這種不太可能的情況下,少數(shù)節(jié)點(diǎn)還是可以繼續(xù)出塊。股東可以在這些塊里包括更改其投票的交易。這些投票可以選出一組新的生產(chǎn)者,并將出塊參與率恢復(fù)到100%。一旦如此,少數(shù)鏈將最終超過所有其他以低于100%參與率運(yùn)行的鏈。
在此過程中,所有觀察者都會知道,在一條參與率超過67%的鏈形成之前,網(wǎng)絡(luò)狀態(tài)一直處于變化之中。那些選擇在此條件下進(jìn)行交易的節(jié)點(diǎn)所冒的風(fēng)險(xiǎn)與選擇接受少于6次確認(rèn)的節(jié)點(diǎn)相似。他們這樣做是因?yàn)橹拦沧R最終落在另一個(gè)分支上的可能性很小。在實(shí)踐中,這種情況比接受少于3個(gè)比特幣交易確認(rèn)區(qū)塊要安全多了。
9. 多數(shù)生產(chǎn)者舞弊(Corruption)
如果多數(shù)生產(chǎn)者變得腐敗,那么他們可以產(chǎn)生無限數(shù)量的分叉,每個(gè)分叉都看起來以2/3多數(shù)確認(rèn)向前推進(jìn)。這種情況下,最后不可逆塊算法蛻回為最長鏈算法。最長鏈就是為最大多數(shù)所認(rèn)可的那條鏈,而這將由少數(shù)剩下的誠實(shí)節(jié)點(diǎn)決定。這種行為不會持續(xù)很長時(shí)間,因?yàn)樽罱K股東會投票替換掉這些生產(chǎn)者。
10. 交易作為權(quán)益證明(TaPoS: Transactions as Proof of Stake)
當(dāng)用戶為一個(gè)交易簽名時(shí),他們這樣做是假設(shè)當(dāng)前區(qū)塊鏈的狀態(tài)已經(jīng)確定了。這個(gè)假設(shè)是基于他們對最近幾個(gè)區(qū)塊的認(rèn)可。如果最后共識的最長鏈發(fā)生改變,那么它可能會使簽署者同意交易時(shí)的假設(shè)無效。
就TaPoS而言,所有交易都包含最近一個(gè)區(qū)塊的哈希值,如果該區(qū)塊最終在鏈歷史中不存在,那么這些交易被認(rèn)為是無效的。任何在孤立分叉上給交易簽名的節(jié)點(diǎn),都會發(fā)現(xiàn)該交易無效且無法遷移到主分叉。
該過程的另一個(gè)作用就是,可以抵御試圖產(chǎn)生替代鏈的長期攻擊。每個(gè)股東在每次交易時(shí)都直接對區(qū)塊鏈做出確認(rèn)。隨著時(shí)間推移,所有的塊都是由所有股東確認(rèn)過的,而這是無法在偽造鏈中復(fù)制的。
11. 確定性生產(chǎn)者洗牌(Shuffling)
在上面所有例子中,我們展示的都是區(qū)塊生產(chǎn)者按調(diào)度循環(huán)出塊。實(shí)際上,每生產(chǎn)N個(gè)區(qū)塊(N是生產(chǎn)者數(shù)量),區(qū)塊生產(chǎn)者集合都會洗牌一次。這種隨機(jī)性確保塊生成者B不會總是忽略塊生成者A,每當(dāng)形成多個(gè)擁有相同數(shù)量生產(chǎn)者的分叉時(shí),均勢最終都會被打破。
12. 結(jié)論
在每一種我們能想到的網(wǎng)絡(luò)自然分片的情況下,股份授權(quán)證明(DPoS)都是健壯的,甚至在面對大多數(shù)生產(chǎn)者舞弊的情形時(shí)也是安全的。不像其它共識算法,當(dāng)大多數(shù)生產(chǎn)者失效時(shí),DPOS還是可以繼續(xù)工作。在此過程中,社區(qū)可以投票替換掉不合格的生產(chǎn)者,直到恢復(fù)100%參與率。我還不知道有任何其它算法可以在如此高強(qiáng)度和多變的故障條件下依然保持健壯。
說到底,DPOS獲得顯著的安全性是由于選擇了這樣的算法:挑選區(qū)塊生產(chǎn)者、驗(yàn)證節(jié)點(diǎn)是否高質(zhì)量和是否獨(dú)立的個(gè)體。運(yùn)用贊成投票的過程可以確保一個(gè)節(jié)點(diǎn)即使擁有50%的有效投票權(quán)也不能獨(dú)自挑選哪怕一個(gè)生產(chǎn)者。DPOS旨在優(yōu)化具有健壯網(wǎng)絡(luò)連接和誠實(shí)節(jié)點(diǎn)100%參與綠的名義條件的性能。這使得DPOS有能力在平均只有1.5秒的時(shí)間內(nèi)以99.9%的確定性來確認(rèn)交易,同時(shí)變差也是以優(yōu)雅和可檢測的方式 ,而且從較差狀態(tài)中恢復(fù)到正常也不過是小事一樁。
其它共識算法以網(wǎng)絡(luò)狀態(tài)差和不誠實(shí)節(jié)點(diǎn)為名義條件進(jìn)行設(shè)計(jì),這樣設(shè)計(jì)的最終結(jié)果就是性能更差、延遲更高、通信開銷高的網(wǎng)絡(luò),而且這種網(wǎng)絡(luò)在33%節(jié)點(diǎn)失效的情況下就會完全停擺。
DPoS在BitShares成功運(yùn)行了3年并在Steem運(yùn)行一年期間,我們經(jīng)歷了各種各樣的網(wǎng)絡(luò)條件和軟件錯誤。DPOS已經(jīng)成功地駕馭了這種環(huán)境,并展示了它能夠在處理比其他任何區(qū)塊鏈更多的交易的同時(shí)保持共識的能力。