EOS共識算法進化史

1. DPOS時期

和POS不同的是,只有21個超級節(jié)點進行記賬操作。

特點:

1.1 核心還是POW的最長鏈規(guī)則: 塊生產者總是基于它所知道的最長鏈生成下一個塊

1.2 出塊順序會洗牌(知道出塊順序,作惡者容易攻擊).

1.3 一個塊,在后面跟上了2/3+1個塊之后,被最終確認.(3s出一個塊,那么最終確認大概需要3*8=24s)

(嚴謹?shù)刂v,是有2/3+1個生產者在其之后順利出塊之后,被最終確認)

2. DPOS-BFT

為了優(yōu)化1.確認時間2.減少分叉的可能性,新算法做了以下改動:

2.1塊生產者的出塊順序不再隨機洗牌,而是按照固定順序

(考慮21個出塊節(jié)點在全世界的分布的情況,固定順序,減少兩點之前的延遲,

減小分叉的可能性)

2.2 最近不可逆塊用更優(yōu)化的條件計算

(用PBFT的做法,在生成塊之后,收集其他節(jié)點的投票,如果超過2/3+1個節(jié)點投票,則此塊為不可逆塊)

通過這兩個優(yōu)化,可以讓交易的確認時間縮短到1~2s(出塊0.5s)

3. DPOS 3.0

tendermint的一個程序員發(fā)現(xiàn)EOS的?DPOS-BFT算法是存在問題的,可以構造出一種情況使他分叉。

大概是這樣的:網絡隔離,形成了A和B兩個互不相通的區(qū)域: A|B (A, B區(qū)域里節(jié)點數(shù)量大致相當)

A區(qū)域生產了一個快X, B區(qū)域生產了一個塊Y, 但是都不能得到超過2/3+1的投票

考慮A區(qū)域的一部分A2突然可以和B區(qū)域相連了(A1|A2|B1|B2),同樣B2也可以和A相連了,

A2對Y投票,B2對X投票,那么X,Y都有超過2/3+1的投票,同時變成了最近不可逆塊(LIB),這樣就造成了分叉。

其實問題的關鍵在于對同一個高度的塊重復投票。

解決方法大概是這樣的:每個節(jié)點都會記錄對塊的投票,并在投票的信息里(對高度H的塊)加上自己曾經對高度H的投票信息。如果已經投過票了,這一票就不算。


參考

https://steemit.com/dpos/@dantheman/dpos-consensus-algorithm-this-missing-white-paper

https://medium.com/eosio/dpos-bft-pipelined-byzantine-fault-tolerance-8a0634a270ba

https://github.com/EOSIO/eos/issues/2718

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容