DPOS 共識演算法 - 缺失的白皮書
原文:
網路上已經有了好幾個版本的譯文,可能是原文寫的沒那麼“平易近人”,這些譯文我都看得不太懂 :)
這篇“缺失的白皮書”是對委託權益證明(Delegated Proof of Stake, DPOS)的分析,旨在分析 DPOS 的工作原理及其魯棒性(robust)的根源。;不過,那個描述裡包含了很多與實際共識不大相關的內容。
本質上,所有區塊鏈都是一種由交易驅動的確定性狀態機。而共識,是就確定性交易順序達成一致並過濾無效交易的過程。有各種不同的共識演算法都可以產生等效的交易排序,但透過在多個區塊鏈上長年累月的可靠執行,DPOS 已經證明其具備健壯性、安全性和有效性。
像所有共識演算法一樣,塊生產者(俗話就是出塊人)可能導致的最大損害是審查(censorship)。所有塊的有效性必須基於確定性的開源狀態機邏輯。
DPOS 演算法概要
DPOS 演算法分為兩部分:
選擇一組塊生產者
排程生產
選擇出塊人的過程,確保了利益相關方(stakeholder,通俗點也可以說是持幣人)最終能有控制權,因為當網路不能順利執行時,利益相關方的損失最大。就實際執行中如何達成共識而言,如何選擇出塊人其實幾乎沒有多大影響,因此,本文將重點介紹在選好出塊人之後,如何達成共識。
為了幫助解釋這個演算法,我將假設 3 個塊生產者 A,B 和 C。因為需要達成 2/3+1 的多數共識來解決所有情況,這個簡化的模型將假設生產者 C 是打破僵局的那個人(也就是 2/3+1 裡面的 1,勝負手)。在現實世界中,將有 21 個或更多的出塊人。像工作量證明一樣,一般規則是最長鏈勝出。任何時候,當一個誠實的節點看到一個有效的更長鏈,它都會從當前鏈切換到更長的這條鏈。
我將舉例說明在大多數能夠想到的網路條件下,DPOS 是如何執行的。這些例子應該可以幫助您理解為什麼 DPOS 穩健且難以破壞。
正常操作(Normal Operation)
在正常操作下,出塊人輪流每 3 秒鐘出一個塊。假設沒有人錯過自己的輪次,那麼將會產生最長鏈。出塊人在被排程輪次之外的任何時間段出塊都是無效的。也就是說,如果沒有輪到自己出塊,出的任何塊都是無效的。
normal operation
少數分叉(Minority Fork)
如果出現不超過節點總數三分之一的惡意或故障節點,那麼可能會產生少數分叉(minority fork, 或者可以說是小群體分叉)。在這種情況下,少數分叉每 9 秒只能產生一個塊,而多數分叉每 9 秒可以產生兩個塊。這樣,誠實的 2/3 多數將永遠比少數(的鏈)更長。
minority fork
離散少數的雙重生產(Double Production by Disconnected Minority)
如果有很多“各自為政”的小群體,那麼他們可以試圖產生無數的分叉,但是因為少數人在出塊速度上註定比多數人更慢,所以所有小群體的分叉都會比多數人的那條鏈短。
double production by disconnected minority
網路碎片化(Network Fragmentation)
網路完全有可能碎片化,從而導致沒有任何分叉擁有數量上佔多數的出塊人。在這種情況下,最長鏈將倒向最大的那個小群體(“矮子裡面挑高個”)。當網路連通性恢復時,其他較小的小群體會自然切換到最長的那條鏈(也就是最大的小群體那條鏈),繼而恢復明確的共識。
network Fragmentation
有可能存在這樣三個分叉,其中兩個較長的分叉長度相同。在這種情況下,當第 3 個(較小)分叉的出塊人重新加入網路時,就會打破平局。出塊人總數為奇數,因此不可能長時間保持平局。稍後我們還會談到出塊人“混洗(shuffle)”,它使得出塊順序隨機化,從而確保即使是出塊人數目相同的兩個分叉,也會以不同的速度增長,最終導致一個分叉勝出。
線上少數的雙重生產(Double Production by Connected Minority)
在這種場景下,少數節點 B 在其時間段內產生了兩個或更多的競爭塊(alternative block)。下一個出塊人(C)可以選擇基於 B 產生的任意一個塊繼續往前走。如此一來,C 的這條鏈就成為最長鏈,而所有選擇 B1 的節點都將切換到最長鏈。即使少數不良出塊人試圖廣播再多的競爭塊也無關緊要,因為它們作為最長鏈的一部分永遠不會超過一輪(round,所有出塊人挨個出塊,轉完一圈就是一輪)。
double production by connected minority
最後不可逆塊(Last Irreversible Block)
在網路碎片化的情況下,在相當長的一段時間內,很有可能有多個分叉都持續不斷地增長。長遠來看,最長的鏈終將獲勝,但觀察者(observer)需要一種確切的手段,以此來確定一個塊是否在增長最快的鏈上。這可以透過看是否有 2/3+1 多數出塊人的確認來確定。
在下圖中,塊 B 已被 C 和 A 所確認,即表示有 2/3+1 多數確認,由此我們可以推斷沒有其它鏈會比這條鏈更長 – 如果 2/3 的出塊人是誠實的。
last inreversible block
請注意,這個“規則”類似於比特幣的 6 個塊確認。一些“聰明”人也許可以謀劃一系列事件,使得兩個節點的最後不可逆塊不同。這種極端的例子要求攻擊者能完全控制通訊延遲,並且在幾分鐘內控制兩次--而不僅僅是一次。即便這真的發生了,最長鏈勝出的長期規則仍然適用。我們認為這種攻擊的可能性足夠接近 0,且經濟後果無關緊要,因此不足為慮。
出塊人不足(Lack of Quorum of Producers)
有一種不太可能會出現的情況,即沒有明確到底有多少個出塊人,在這種情況下,少數人還是可以繼續出塊。在這些塊裡,利益相關方可以包含更改投票的交易。這些投票可以選出一組新的出塊人,並將出塊參與率恢復到 100%。一旦如此,這條小群體的鏈最終將超過所有其他出塊參與率低於 100% 的鏈。
在此過程中,所有觀察者都會知道,在出現一條參與率超過 67% 的鏈之前,網路都處於不穩定的狀態。如果有人選擇在此條件下進行交易,那麼他將承受與接受不到 6 個確認類似的風險。他們也知道存在這樣的小機率事件,即最終的共識(或者說最長鏈)出現在另一個不同的分叉上。在實際操作中,這種情況仍然要比接受少於 3 個比特幣確認要安全的多。
多數出塊人出現問題(Corruption of Majority of Producers)
如果多數出塊人出現問題,那麼他們可能產生無限的分叉,每個分叉都看起來以 2/3 多數確認向前推進。這種情況下,最後不可逆塊演算法蛻變為最長鏈演算法。最長鏈就是為最多人認同的鏈,而這條鏈實際將由少數剩下的誠實節點決定。這種行為不會持續很長時間,因為利益相關方最終會投票替換掉這些出塊人。
corruption of majority of producers
交易權益證明(Transactions as Proof of Stake, TaPoS)
使用者為一個交易簽名,是基於對區塊鏈狀態的一個假設,而這個假設又基於他們對最近幾個塊的“認識”(perception)。如果最長鏈的共識發生改變,則很可能會使簽名者之前簽名時所依據的假設失效。
就 TaPoS 而言,所有交易都包含最近一個塊的雜湊,如果該塊在區塊鏈中不存在,那麼認為這些交易是無效的。任何在孤兒分叉(orphaned fork)上給交易簽名的人,最終都會發現該交易無效,且無法遷移到主分叉。
這個過程有個附帶的好處,它可以抵禦試圖產生替代鏈的長程攻擊(long-range attack)。每次交易時,利益相關方都直接對區塊鏈做出確認。隨著時間的推移,所有的塊都是由所有利益相關方確認過的,這在一條偽造的鏈(forged chain)所做不到的。
確定性出塊人混洗(Deterministic Producer Shuffling)
在上面我們所展示的所有案例中,出塊人按迴圈排程出塊。實際上,每出 N 個塊(N 是出塊人數量),出塊人集合都會進行一次混洗。這種隨機性確保了出塊人 B 不會總是忽略出塊人 A,並且當出現多個數量出塊人相同的分叉時,最終會有一個分叉勝出。
結論
在每一個想得到的自然網路破壞下,DPOS 都是健壯的,甚至在面對大部分出塊人作弊時,也是安全的。不像其它共識演算法,當大多數出塊人出現問題時,DPOS 仍然可以繼續工作。在此過程中,社群可以投票替換掉不合格的出塊人,直到恢復 100% 參與率。在如此高強度和變化多端的故障條件下,我還不知道有任何其它演算法也可以依然保持如此健壯。
DPOS 之所以能有這麼高的安全性,歸根結底來自於其選擇出塊人和驗證節點質量的演算法。透過贊成投票制(approval voting),可以確保即使一個人擁有 50% 的有效投票權,也不能獨自選擇一個出塊人。DPOS 的設計初衷是在良好的網路連線,誠實節點 100% 參與共識的情況下最佳化效能,這使得 DPOS 有能力在平均只有 1.5 秒的時間內以 99.9% 的確定性確認交易,同時能夠以一種優雅和可檢測的方式降級 – 降級也不是什麼大事。
其他共識演算法的設計初衷是,節點不誠實且網路條件惡劣。這種設計的最終結果就是,網路的效能更差,延遲更高,更新開銷大,並且在 33% 節點出現問題的情況下就會徹底停止正常運轉。
在 BitShares 成功執行三年,Steem 執行一年期間,我們經歷了各種各樣的網路條件和軟體錯誤。對於各種狀況,DPOS 都成功地得以應對,並且證明了在維護共識的同時,處理了比任何其它區塊鏈更多的交易。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/151/viewspace-2804542/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSA GCR:共識演算法與共識安全白皮書(附下載)GC演算法
- NEO共識機制白皮書
- 共識演算法之爭(PBFT,Raft,PoW,PoS,DPoS,Ripple)演算法Raft
- 區塊鏈共識演算法(5)DPoS股份授權證明演算法區塊鏈演算法
- 【許曉笛】詳解 EOS 的新共識機制 BFT-DPoS
- PBFT共識演算法演算法
- Pow共識演算法演算法
- 共識演算法-PoW演算法
- 共識演算法-LevelDB演算法
- 【go共識演算法】-POWGo演算法
- 分散式共識演算法分散式演算法
- Bystack的高TPS共識演算法演算法
- Paxos共識演算法詳解演算法
- Raft共識演算法詳解Raft演算法
- 儲存基礎知識白皮書
- 近幾天對區塊鏈中幾種常見的共識機制(PBFT,Raft,PoW,PoS,DPoS,Ripple)區塊鏈Raft
- 可用於區塊鏈的共識演算法區塊鏈演算法
- 共識演算法的比較:Casper vs Tendermint演算法
- 深入剖析共識性演算法 Raft演算法Raft
- 區塊鏈主流共識演算法區塊鏈演算法
- 4.8 共識演算法的社會學探討演算法
- 對話 | 淺析NEO的dBFT共識演算法演算法
- 淺談 CAP 和 Paxos 共識演算法演算法
- 分散式系統之Raft共識演算法分散式Raft演算法
- 區塊鏈主流共識演算法彙總區塊鏈演算法
- 幽默!分散式系統共識演算法的三階段分散式演算法
- 分散式系統的共識(consensus)演算法比較分散式演算法
- 共識演算法PoS及Go語言實現演算法Go
- 《白皮書》:專為人臉識別定製的安全解決方案
- 第4章 區塊鏈靈魂:共識演算法區塊鏈演算法
- 區塊鏈中五種常見共識演算法區塊鏈演算法
- 區塊鏈共識演算法(3)PoS權益證明演算法區塊鏈演算法
- 以太坊原始碼分析(11)eth目前的共識演算法pow的整理原始碼演算法
- 【冰山白皮書】JS中的物件JS物件
- zarusz/SlimCluster:在.NET中實現的Raft分散式共識演算法Raft分散式演算法
- 《白皮書》:人臉識別系統的組成及面臨的安全風險
- JS演算法之找出缺失的整數JS演算法
- 深入剖析分散式一致性共識演算法分散式演算法