背景
上一章節已經簡單的介紹了EOS節點的共識流程,下面舉例說明節點生產的區塊是如何達成共識的:
EOS共識分爲兩個部分:
1.共識出備選不可逆塊:當區塊有(2/3 + 1)個節點確認後,則這個區塊被加入到備選不可逆塊列表中。
2.從備選不可逆塊列表中選出最終的不可逆區塊:對備選不可逆列表中的塊進行從小到大排序,取1/3處,即爲最終的不可逆塊序號,小於此序號的都認爲已成爲不可逆塊。
1. 共識出備選不可逆塊
prduce block : 生產節點生產的區塊
confirm block : 生產節點要確認的區塊(本地生產+接收到的塊)
accept block : 非生產節點接收到的區塊
plib : 加入到備選的不可逆塊序號
lib : 最終的不可逆區塊序號
下面的舉例不考慮網絡延遲導致的漏塊情況:
假如有A,B,C,D四個生產者按A->B->C->D順序出塊,每個節點出12個塊,eos啓動後,此時A爲生產者,A先出12個塊,自己會把1-12的塊確認一次,並分別發給B,C,D,此時節點B,C,D只接收塊,即B,C,D每個節點上都有序號爲1->12塊待確認;
生產者切換到B後,B開始生產塊的序號爲13->24,總共12塊,此時B會把A發來的1->12的塊確認,並把自己生產的序號爲13->24的塊確認一次,併發給A,C,D,此時節點A生產的序號爲1->12的塊被確認兩次,收到序號爲13->24的塊,節點C,D上有新接收的13->24的塊,即有序號爲1->24的塊待確認;
生產者切換到C後,C開始生產塊,生產塊的序號爲25->36,總共12塊,此時C會把A發來的1->12的塊和B發來的序號爲13->24的塊確認,此時節點A生產的序號爲1->12的塊已經被確認了三次,B生產的序號爲13->24的塊已經被確認了兩次,C並把自己生產的序號爲25->36的塊確認一次,併發給A,B,D,此時A節點接收到序號爲25->36的塊,即有序號爲13->36的塊待確認;B節點接收到序號爲25->36的塊,即有序號爲25->36的塊待確認; D節點接收到序號爲25->36的塊,即有序號爲1->36的塊待確認;
此時節點A生產的序號爲1->12的塊被確認了三次,因爲有四個節點,那麼需要確認(4*2/3 + 1 = 3)即需要被確認三次,即可成爲備選不可逆塊。
此時,生產者爲C,序號爲12的塊成爲備選不可逆塊,會被加入到備選不可逆區塊列表中;
生產者切換到D後,依次按照此邏輯進行共識,序號爲24的塊就會被加入到備選不可逆區塊列表中;
生產者切換到A後,依次按照此邏輯進行共識,序號爲36的塊就會被加入到備選不可逆區塊列表中;
生產者切換到B後,依次按照此邏輯進行共識,序號爲48的塊就會被加入到備選不可逆區塊列表中;
2. 從備選不可逆塊列表中選出最終的不可逆區塊
根據上面的描述,可以知道C節點確認出的備選不可逆塊序號爲12,D節點確認出的備選不可逆塊序號爲24,A節點確認出的備選不可逆塊序號爲36,B節點確認出的備選不可逆塊序號爲48;
此時,備選不可逆塊列表中的內容爲:[12,24,36,48],根據EOS中給出的算法,從小到大排序,取1/3處,那麼12爲最終的不可逆塊序號。
總結
EOS共識需要理解以下三點:
- 各個節點需要共識出備選不可逆塊。
- 從備選不可逆塊列表中選出最終的不可逆區塊。
- 一個區塊成爲最終的不可逆塊序號,經過了2輪(2/3+1)的確認。
鏈接
http://www.3heu.club:8008/
https://www.jianshu.com/p/1f692784cd3f
https://blog.csdn.net/arm_snow/article/details/90020570