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