本文首發於「萬雲BaaS」微信公衆平臺,爲《DPOS Consensus Algorithm - The Missing White Paper》的譯文,譯者爲萬向區塊鏈旗下萬雲服務平臺首席技術官奚海峯。算法
這篇「缺失的白皮書」是對委託權益證實(DPOS)的分析,目的是爲DPOS的工做原理及其魯棒性根源提供一個分析。DPOS的早期描述能夠在bitshares.org(https://bitshares.org/technology/delegating-proof-of-stake-consensus/)找到;不過,那個描述還包含了許多不屬於實際共識過程的內容。安全
全部區塊鏈本質上都是一種由交易驅動的肯定性狀態機。共識是商定肯定性交易順序和過濾無效交易的過程。有許多不一樣的共識算法均可以產生等效的交易排序,但DPOS已經經過在多個區塊鏈上經年累月的可靠運行證實自身是健壯、安全和有效的。微信
像全部共識算法同樣,塊生產者可能致使的最大損害是審查。全部塊的有效性必須基於肯定性的開源狀態機邏輯。網絡
DPOS算法概要微信公衆平臺
DPOS算法分爲兩部分:選擇一組塊生產者和調度生產。選舉過程確保利益相關方最終獲得控制,由於當網絡不能順利運行時,利益相關方的損失最大。選舉方法對實際運行中如何達成共識幾乎沒有影響,所以,本文將重點介紹如何在塊生產者被選擇以後達成共識。性能
爲了幫助解釋這個算法,我想假設3個塊生產者A,B和C。由於共識(的達成)須要2/3+1多數來解決全部狀況,這個簡化的模型將假設生產者C是打破僵局的那我的。在現實世界中,將有21個或更多的塊生產者。像工做量證實同樣,通常規則是最長鏈勝出。任什麼時候候當一個誠實的對等節點看到一個有效的更長鏈,它都會從當前分叉切換到更長的這條鏈。區塊鏈
我將舉例說明在大多數想獲得的網絡條件下DPOS如何運行。這些例子應該能夠幫助您理解爲何DPOS穩健且難以破壞。優化
正常操做設計
在正常操做模式下,塊生產者每3秒鐘輪流生成一個塊。假設沒有人錯過本身的輪次,那麼這將產生最長鏈。塊生產者在被調度輪次以外的任什麼時候間段出塊都是無效的。排序
少數分叉
不超過節點總數三分之一的惡意或故障節點可能建立少數分叉。在這種狀況下,少數分叉每9秒只能產生一個塊,而多數分叉每9秒能夠產生兩個塊。這樣,誠實的2/3多數將永遠比少數(的鏈)更長。
離線少數的多重產生
(離線的)少數人以試圖產生無限數量的分叉,可是他們的全部分叉都將比多數人的那條鏈短,由於少數人在出塊速度上註定比多數人來的更慢。
網絡碎片化
網絡徹底有可能碎片化,致使沒有任何分叉擁有多數塊生成者。在這種狀況下,最長的鏈將倒向最大的那個少數羣體。當網絡連通性恢復時,較小的少數羣體會天然切換到最長的那條鏈,明確的共識將恢復。
有可能存在這樣三個分叉,其中兩個最長的分叉長度相同。在這種狀況下,第3個(較小)分叉的塊生產者從新加入網絡時會打破平局。塊生產者總數爲奇數,所以不可能長時間保持平局。稍後咱們還會講到生產者「洗牌」,它使得出塊順序隨機化,從而確保即便是生產者數目相同的兩個分叉也會以不一樣的步長增加,最終致使一個分叉超過另外一個。
在線少數的多重生產
在這種場景下,少數節點B在其時間段內產生了兩個或更多可供選擇的塊。下一個計劃生產者(C)能夠選擇基於B產生的任何一種方案繼續構建鏈條。一旦如此,這個選擇就成爲最長的鏈,而全部選擇B1的節點都將切換分叉。少數不良生產者企圖廣播再多的替代塊也可有可無,它們做爲最長鏈的一部分永遠不會超過一輪。
最後不可逆塊
在網絡碎片化的狀況下,多個分叉都有可能持續不斷增加至關長的時間。長遠來看最長的鏈終將獲勝,但觀察者須要一種確切的手段來斷定一個塊是否絕對處於增加最快的那條鏈。這能夠經過觀察來自2/3+1多數塊生產者的確認來決定。
在下圖中,塊B已被C和A所確認,這表明了2/3+1多數確認,由此咱們能夠推斷沒有其它鏈會比這個更長 – 若是2/3的生產者是誠實的。
請注意,這個「規則」相似於比特幣的6塊確認「規則」。一些聰明人也許能夠謀劃一系列事件使得兩個節點(應該是「交易」?)出如今不一樣的最後不可逆塊上。這種邊緣案例要求攻擊者能徹底控制通訊延遲,而且在幾分鐘內兩次--而不是一次--使用該控制。即使這真的發生了,那麼最長鏈(勝出)的長期規則仍然適用。咱們估計這種攻擊的可能性足夠接近0,且經濟後果可有可無,所以不足爲慮。
生產者法定人數不足
在缺少明晰的生產者法定人數這種不太可能的狀況下,少數人仍是能夠繼續出塊。利益相關方能夠在這些塊裏包括更改投票的交易。這些投票能夠選出一組新的生產者,並將出塊參與率恢復到100%。一旦如此,少數鏈將最終超過全部其餘以低於100%參與率運行的鏈。
在此過程當中,全部觀察者都會知道,在一條參與率超過67%的鏈造成以前,網絡狀態是不定的。那些選擇在此條件下進行交易的人所冒的風險與選擇接受不到6個確認的人類似。他們知道存在這樣一些小的可能性,即:共識也許最終在一個不一樣的分叉上創建起來。在實踐中,這種狀況比接受少於3個比特幣交易確認的塊要安全多了。
多數生產者舞弊
若是多數生產者變得腐敗,那麼他們能夠產生無限數量的分叉,每一個分叉都看起來以2/3多數確認向前走。這種狀況下,最後不可逆塊算法蛻變爲最長鏈算法。最長鏈就是爲最大多數所批准的那條鏈,而這將由少數剩下的誠實節點決定。這種行爲不會持續很長時間,由於利益相關方最終會投票替換生產者。
交易做爲權益證實(TaPoS)
當用戶爲一個交易簽名時,他們是在對區塊鏈狀態的必定假設下這樣作的。這個假設是基於他們對最近幾個塊的見解。若是最長鏈的共識發生改變,則潛在會使簽名者以前的假設失效。
就TaPoS而言,全部交易都包含最近一個塊的散列,若是該塊在鏈歷史中不存在則這些交易被認爲是無效的。任何在孤兒分叉上給交易簽名的人,都會發現該交易無效且沒法遷移到主分叉。
該過程的一個附帶做用是能夠抵禦試圖產生替代鏈的長期攻擊。每一個利益相關方在每次交易時都直接對區塊鏈作出確認。隨着時間推移,全部的塊都是由全部利益相關方確認過的,這在一條僞造鏈裏是沒法複製的。
肯定性生產者洗牌
在上面全部例子中,咱們展現的都是塊生產者按循環調度出塊。實際上,每出N個塊(N是生產者數量),塊生產者集合都會洗牌一次。這種隨機性確保塊生成者B不會老是忽略塊生成者A,每當造成多個擁有相同數量生產者的分叉時,平局最終都會被打破。
結論
在每個咱們能想到的天然網絡分裂的狀況下,委託權益證實都是強健的,甚至在面對至關數量生產者舞弊的情形時也是安全的。不像其它共識算法,當大多數生產者不合格時,DPOS仍是能夠繼續工做。在此過程當中,社區能夠投票替換掉不合格的生產者,直到恢復100%參與率。我還不知道有任何其它算法能夠在如此高強度和變化無窮的失敗條件下依然保持強健。
說到底,DPOS引人注目的安全性來自於其選擇塊生產者和驗證節點質量的算法。運用同意投票的過程能夠確保一我的即便擁有50%的有效投票權也不能獨自挑選哪怕一個生產者。DPOS旨在優化擁有強壯網絡鏈接的誠實節點100%參與(共識過程)的名義條件。這使得DPOS有能力在平均只有1.5秒的時間內以99.9%的肯定性確認交易,同時以優雅和可檢測的方式降級 – 從降級中恢復正常也不過是小事一樁。
其它共識算法以網絡條件差的不誠實節點爲名義條件展開設計,這樣設計的最終結果就是性能更差、延遲更高、通訊開銷高的網絡,並且這個網絡在33%節點失效的狀況下會徹底停擺。
在BitShares成功運行三年以及在Steem運行一年期間,咱們經歷了各類各樣的網絡條件和軟件錯誤。DPOS成功穿行於其間,在處理了比任何其它區塊鏈更多交易的同時持續達成共識,展示了非凡的能力。