1. 程式人生 > >EOS的BFT-DPOS共識機制的進化過程及背後邏輯

EOS的BFT-DPOS共識機制的進化過程及背後邏輯

不知道是閱讀量到了質變,還是後面引用的這篇文章太好,我終於對BFT-DPOS有了更深刻的理解

POS:

出塊不再由算力說了算,由節點持有的stake說了算,解決了POW算力資源被大量無用消耗,但由於無條件信任代表,節點作惡非常容易 , 比如nothing at stake攻擊

DPOS:

動態產生一定數量的代表比如21個節點代表,只由這21個節點生成區塊,降低了作惡的概率,同時用事後懲罰限制節點代表作惡行為,但始終不夠安全(怎麼懲罰,使用抵押物?抵押物需要多少?作惡導致的失敗交易的損失都是可以量化的嗎?如果不能量化抵押物就沒有意義),同時確認速度確實也慢(需要14個block)

BFT+DPOS:

    一個區塊生產後通過BFT協議立馬確認,解決了DPOS確認慢問題,需要超過1/3節點才能作惡,相比POW 51%作惡條件,這個1/3值相對來說還是偏低了點,但是這是一個折中,也只能這樣了

BFT + DPOS + 小塊:

    該協議是為了加快出塊速度,該改進的核心思想是讓同一個節點產生6個小塊。這個能提升效能的核心原因是6個小塊的產生沒有等待確認的環節。在BFT+DPOS演算法中,一個節點要建立新塊,必須等上一個塊被確認(或者超時),因為它不確定上一個節點是否作惡是否會被確認,所以它只能等。但是如果上一個塊時也是該節點產生的,它自然不需要等上一塊確認,因為它知道上一個塊是真實的,不是作惡的塊,最後肯定會被確認,所以安心生產下一塊。

可見DPOS+BFT+小塊機制中,區塊生成和確認以pipeline的方式進行,是同時進行的,加快了出塊速度。

何為作惡:

    各種共識演算法,節點基本都會進行資料檢驗功能,因而資料偽造作惡基本不可能。那真正的作惡是什麼?

   主動作惡:節點主動生產兩個區塊,給一部分節點發送新區塊A,另外一部分節點發送區塊A1,這樣系統就產生分叉了。

    被動作惡: 塊傳播因為網路延時或者中斷,會導致一部分節點缺失該塊的資訊,進而會產生分叉,然後後續區塊生產者發現分叉後,如果遵循只選擇一個分支生產區塊就會讓分叉收斂(能收斂最後就能達成共識),但是如果繼續保持並加重這個分叉,最後就會導致整個鏈變成一顆森林,最後節點就永遠沒法達成共識, 這是被動作惡。比如POS的noting at stake攻擊,當系統出現分叉時,生產者基於自己的利益會在兩個分叉區塊上各自生成一個區塊(這樣不管哪個分叉獲勝,自己都能獲得收益),這其實間接助長和加重了分叉

    因而要阻止這些作惡行為,有三種方法:

    1)機制保證,讓生產者沒有時間來生成2個區塊(POW)

    2)利益保證,生成兩個區塊最後肯定沒用(BFT演算法, 大家最後只會認可一個快),生產者獲取不了什麼好處,自然沒必要生產兩個區塊

    3)事後懲罰,比如DPOS,這種方法其實沒啥用,因為事後發現作惡節點後,系統沒法回溯區塊,只能懲罰作惡節點,但是這個作惡損失是不確定的(前面提到過),起不到懲罰作用,且抵押物模式是一種限制,不利於生態發展

引用原文

區塊鏈中最重要的便是共識演算法,比特幣使用的是POW(Proof of Work,工作量證明),以太幣使用的POS(Proof of Stake,股權證明)而EOS使用的是BFT-DPOS。

什麼是BFT-DPOS呢?即拜占庭容錯式的委任權益證明。

要想明白BFT-DPOS的執行機制,首先就要先明白什麼是DPOS。                

由於POW在比特幣的共識演算法中極大地消耗了演算法的資源。而且會有演算法集中的問題,所以在2014年的時候Dan Larimer提出了一個相較於POW來說更加高效,輕便的共識機制即DPOS。該共識機制一邊能讓網路成本小型化,另一方面有回覆語每個持股人一定的投票權。

這些超級節點呢能夠:供相關計算資源和網路資源,保證節點的正常執行;當輪到某超級節點擁有出塊權時,超級節點收集該時段內的所有交易,並對交易驗證後打包成區塊廣播至其他超級節點,其他節點驗證後把區塊新增到自己的資料庫中。這種共識機制採用隨機的見證人出塊順序,出塊速度為 3 秒,交易不可逆需要45秒。為什麼需要 45 秒呢?因為 DPoS 下,見證人生產一個新區塊,才表示他對之前的整條區塊鏈進行了確認,表明這個見證人認可目前的整條鏈。而一個交易要達到不可逆狀態,需要 三分之二以上的見證人確認,在 EOS 裡就是 14 個見證人。DPoS共識演算法也有極強的抗分叉能力,因為區塊新增到一條區塊鏈分叉的速率與擁有該共識的超級節點比例是相關的。當一個超級節點設法在兩條分叉上同時生產區塊時,EOS的持有者會在下一輪投票中將該超級節點刪掉,並且EOS社群會給予相關惡意節點一定的懲罰。因此,在一般情況下,使用DPoS的EOS都是很難經歷分叉的。

其次,我們還要明白BFT所代表的的意義。

拜占庭容錯技術(Byzantine Fault Tolerance,BFT)是一類分散式計算領域的容錯技術。拜占庭假設是對現實世界的模型化,由於硬體錯誤、網路擁塞或中斷以及遭到惡意攻擊等原因,計算機和網路可能出現不可預料的行為。拜占庭容錯技術被設計用來處理這些異常行為,並滿足所要解決的問題的規範要求。

拜占庭容錯技術來源於拜占庭將軍問題。拜占庭將軍問題是Leslie Lamport在20世紀80年代提出的一個假象問題。拜占庭是東羅馬帝國的首都,由於時拜占庭羅馬帝國國土遼闊,每支軍隊的駐地分隔很遠,將軍們只能靠信使傳遞訊息發生戰爭時,將軍們必須制訂統一的行動計劃。然而,這些將軍中有叛徒,叛徒希望通過影響統一行動計劃的制定與傳播,破壞忠誠的將軍們一致的行動計劃。因此,將軍們必須有一個預定的方法協議,使所有忠誠的將軍能夠達成一致,而且少數幾個叛徒不能使忠誠的將軍做出錯誤的計劃。也就是說,拜占庭將軍問題的實質就是要尋找一個方法,使得將軍們能在一個有叛徒的非信任環境中建立對戰鬥計劃的共識。在分散式系統中,特別是在區塊鏈網路環境中,也和拜占庭將軍的環境類似,有執行正常的伺服器(類似忠誠的拜占庭將軍),有故障的伺服器還有破壞者的伺服器(類似叛變的拜占庭將軍)。共識演算法的核心是在正常的節點間形成對網路狀態的共識。

簡單形容就是:通過在一群數量有限的節點中,使用輪換或者其他演算法來篩選出某個節點作為主節點。並且賦予該節點出塊的權利。在主節點是將該時段的交易打包成區塊後用自己的私鑰對該區塊簽名,並將其廣播到所有節點。當主節點收到至少三分之二的不同節點的簽名區塊後,則該區塊完成了所有節點的驗證成為不可逆區塊串聯到區塊鏈中。

BFT與DPOS二者相結合就誕生了BFT—DPOS共識演算法。

、為了挖掘 EOS 系統的效能,Daniel Larimer 在以上基礎上又進行了修改。首先,他將出塊速度由 3 秒 縮短至 0.5 秒,理論上這樣可以極大提升系統性能,但帶來了網路延遲問題:0.5 秒的確認時間會導致下一個出塊者還沒有收到上一個出塊者的區塊,就該生產下一個區塊了,那麼下一個出塊者會忽略上一個區塊,導致區塊鏈分叉(相同區塊高度有兩個區塊)。比如:中國見證人後面可能就是美國見證人,中美網路延遲有時高達 300ms,很有可能到時美國見證人沒有收到中國見證人的區塊時,就該出塊了,那麼中國見證人的區塊就會被略過。

為解決這個問題,Daniel Larimer 將原先的隨機出塊順序改為由見證人商議後確定的出塊順序,這樣網路連線延遲較低的見證人之間就可以相鄰出塊。比如:日本的見證人後面是中國的見證人,再後面是俄羅斯的見證人,再後面是英國的見證人,再後面是美國的見證人。這樣可以大大降低見證人之間的網路延遲。使得 0.5 秒的出塊速度有了理論上的可能。

為了保證萬無一失,不讓任何一個見證人因為網路延遲的意外而被跳過,Daniel Larimer 讓每個見證人連續生產 6 個區塊,也就是每個見證人還是負責 3 秒的區塊生產,但是由最初的只生產 1 個變成生產 6 個。最惡劣的情況下,6 個區塊中,最後一個或兩個有可能因為網路延遲或其他意外被下一個見證人略過,但 6 個區塊中的前幾個會有足夠的時間傳遞給下一個見證人。

再來討論 BFT-DPoS 的交易確認時間問題:每個區塊生產後立即進行全網廣播,區塊生產者一邊等待 0.5 秒生產下一個區塊,同時會接收其他見證人對於上一個區塊的確認結果。新區塊的生產和舊區塊確認的接收同時進行。大部分的情況下,交易會在 1 秒之內確認(不可逆)。這其中包括了 0.5 秒的區塊生產,和要求其他見證人確認的時間

使用上述BFT-DPoS協議就可以使得EOS的出塊間隔從原來的3秒降低到500毫秒,這也使得跨鏈通訊的時延大大縮短,單位時間內可確認的交易數量大大提升。筆者相信如果這樣的機制在EOSIO1.0的正式版本中成功實現,那無疑是區塊鏈技術向支援百萬級別使用者的目標邁出的巨大一步。

引用原文來自:金色財經