不少讀者都很關心 BM 和 V神 在 EOS issue 上對於 DPOS 的機制的討論,接下來咱們具體討論下他們的討論內容。git
咱們先來說述一下最初 EOS 的 DPOS + BFT 的共識機制:當一個特定的區塊被 ( 2/3 + 1 ) 生產者確認的時候,該塊成爲不可逆塊。github
假設如今有 A, B 和 C 三個 BP。網絡
狀況 a: A 生產了一個區塊 N, B 生產區塊 N + 1 而且確認了區塊 N, C 生產區塊 N + 2 而且確認了區塊 N, N +1 , 此時 N 已經有 3 個確認,達到了 2/3 + 1 個確認,則區塊 N 成爲不可逆。spa
狀況 b: A 生產一個區塊 Na, B 生產一個區塊 Nb, C 在 Nb 的基礎上生產一個區塊 N + 1, 此時發現 兩個區塊 N( Na 和 Nb ) 都不能達到 2/3 + 1 的確認數了,那豈不是永遠不會不可逆了?假如此時 A 在 N + 1 的基礎上生產區塊 N + 2, B 生產區塊 N + 3, 此時區塊 N + 1 達到了不可逆的,那麼 N + 1 所在的該分叉上小於等於 N + 1 的都會變成不可逆, 也就是 Nb 也變成不可逆。blog
上面所述的只通過了一次共識,那麼會出現什麼問題呢。圖片
V 神就在 issue 上提出一個例子。ip
能夠看出第一條鏈 A 生產的 101 通過 B、C 已經達到了 3 個確認數已經成爲不可逆了, 但此時 D 因網絡很差, 沒接收到這些塊, 從而產生分叉開始生產區塊 101 , 以後 A 生產區塊 102 , 由於塊高度大於以前的 101 因此是可生產的,B同理, 通過 A B 以後 D 生產的 101 一樣達到了 三個確認數, 這樣就會有 2 個塊高度爲 101 的區塊成爲了避免可逆,形成 conflict。get
由於區塊 101 沒有通過全部節點就成爲不可逆了, 致使後面的產生的區塊 101 可在下一輪被確認成爲不可逆塊。若是說 A ,B ,C ,D 都確認了區塊 101, 那麼下一輪誰都沒可能生產塊高度爲 101 的區塊。也就不會同時出現 2 個不可逆塊了。 但所有節點確認才成爲不可逆這就破壞了引入 BFT 的想法, 並且你沒辦法保證全部節點都會對他進行確認,畢竟網絡波動的緣由會一直存在。it
那怎麼解決不可逆塊衝突, 可是又不會破壞 BFT 的想法呢。pip
那咱們能夠繼續使用 BFT 的思想, 也就是破壞掉第二個區塊 101成爲 lib 的條件。
這裏引進 proposed lib的概念, 即資格成爲 lib 的區塊,簡稱 plib。
一個區塊通過 2/3 + 1共識後,他不會立馬成爲 lib, 會先成爲 plib, 而後再 plib 通過 2/3 共識後纔會成爲lib。
由上圖,區塊101 成爲了 lib, 那麼表明 plib 高度至少是 105 了,也就是 7 個節點中至少有五個生產的區塊高度達到了 110, 這時候,假如一個 E 生產出區塊 101, 那麼至少須要 2/3 的節點幫他確認成爲 plib,也就是有節點能生成 102 - 105,須要 4 個節點,可是 7 個 BP 已經有 5 個的塊高度達到了 110,根本就不夠節點能讓 區塊 101 成爲不可逆, 那麼就不會有 2 個 相同 block_num 的 lib 存在了。也就是當 N 能成爲 lib 的時候,根本沒有任何狀況能讓 2 個 N 同時成爲 plib ( 當這裏的 N 成爲 lib 是排除掉由於 N + m 成爲 lib 才使 N 成爲 lib 的狀況 )。
其實這種方式你能夠當作幾條帶 plib 的分叉鏈, BP 節點對這些鏈進行 2/3 共識來選出哪條 plib 分叉鏈做爲主鏈,丟棄掉其餘 plib 分叉鏈。
總結: dpos 3.0 + BFT 有最初的一次共識增長到了2次,避免掉出現 conflict lib , 可是這也讓 head block num 和 lib 的高度拉到至少 2 2/3 21 * 12 = 336 個塊( 這種計算方式是忽略 BP 漏塊的狀況 )。用時間算比較準確也就是 168 秒。 還有不要嫌字跡不清晰, 寫到一半筆沒墨水了,我也沒辦法 T T
以上爲我的看法,若有錯誤或者缺漏,還請指正哈。
參考文章:
https://github.com/EOSIO/eos/...
https://medium.com/eosio/dpos...
轉載請註明來源: https://eos.live/detail/19947