Combining GHOST and Casper以太坊2.0共識機制Gasper:part 1
共識機制設(shè)計理念
正如以太坊基金會成員Vald zamfir,所說的Casper的設(shè)計出發(fā)點,源于對系統(tǒng)最差情況的經(jīng)濟分析,這也是是公鏈PoS共識算法的唯一路徑。也因此,Casper希望通過引入懲罰措施來最大化拜占庭容錯。
并且,Casper是為輕節(jié)點而生,為此需要提供兩大特性:
- 最終性(敲定的塊就不能再改了)
- 低延遲
那么針對這些特性,就需要在指定分叉規(guī)則的同時,還要有最終性的共識算法,那么這該如何解決呢?
在2020年5月修改版的《Combining GHOST and Casper》一文中,V神的團隊給出了詳細的答案及解釋。
設(shè)計目標
Eth2.0的共識算法設(shè)計目標就是讓PoS就有一定的安全性和可用性(certain safety and liveness claims).
對應著這個目標,提出了兩大組件來定義分叉規(guī)則和最終性:
1 最終性規(guī)則Casper FFG
Buterin 和Griffith提出了Casper the Friendly Finality Gadget (FFG),引入驗證和敲定(justification and finalization)來定義最終性,什么意思呢?其實有點像檢查點,簡單來說就是,在特定的區(qū)塊高度需要有驗證節(jié)點的簽名信息A->B(其中A,B代表檢查點區(qū)塊),表明我A舉手贊成B成為下一任黨委書記,也就是贊成B成為下一個檢查點,這樣就不要再從創(chuàng)世區(qū)塊去算狀態(tài)保證安全性了,因為檢查點之后的就改不了了。道理其實很簡單,當上了黨委書記就有話語權(quán)了,政策就不能再由著下面的人亂改了嘛。
同時,Casper也引入了懲罰條件(slashing conditions),來判定誰是壞人誰是好人,違反這兩個規(guī)則的人就得被開罰單:
- 驗證者對同一個高度的檢查點,只能給一個完全一致的證明
- 驗證者在兩個不相鄰的檢查點之間只能給一個完全一致的證明,也就是說這兩個檢查點之間的檢查點不能再給不一樣的證明了
可以看出,Casper只是規(guī)定了檢查點是怎么確定下來的,也就是說最終性是如何確定的,而把分叉規(guī)則單獨最為一個組件,這么做也是為了解耦這兩部分。
2 分叉規(guī)則LMD GHOST
LMD由Sompolinsky等人提出的The Greediest Heaviest Observed SubTree rule (參見通俗的解釋GHOST)改進而來,由于PoS的共識算法需要消息驅(qū)動來獲取投票的權(quán)重,因此稱之為Latest Message Driven Greediest Heaviest Observed SubTree(LMD GHOST).
算法如下所示:

LMD GHOST算法規(guī)則
舉例來說就是,假設(shè)每個人擁有一個stake代表一票的權(quán)重(下圖中用圓圈表示),那么按照這個算法就確定了途中藍色的主鏈:

LMD GHOST舉例
那么這兩個協(xié)議是如何結(jié)合到一起的呢,以太坊提出了Gasper(Ghost第一個字母G+Casper的后四個字母)協(xié)議:
Gasper
為了理解Gasper,我們先要了解三個基本概念:
- 紀元邊界(Epoch boundary):Gasper把12秒定義為了一個基本時間槽(slot),然后把64個slot定義為一個紀元(epoch).那么每個紀元開始的那個區(qū)塊就成為邊界區(qū)塊,用EBB(B,j)=C表示,第j個epoch的區(qū)塊B的邊界區(qū)塊是區(qū)塊C
- 委員會:所有的驗證者被分配到每一個epoch中,構(gòu)成了一個大的委員會,并且對于每一個slot從這個大的委員會選出一個特定的委員會。再每一個slot中,由一個驗證者來打包出塊,該委員會的其他成員使用HLMD GHOST(LMD GHOST的一個輕微變種,后面會講)附上認可這個區(qū)塊的證明。
- 驗證和敲定(Justification and Finalization):這個其實和Casper FFG很像,不過這里不是對單個檢查點操作,而是對所有的紀元邊界區(qū)塊進行操作。
紀元邊界區(qū)塊驗證
驗證規(guī)則定義,如果這個投票的總和大于總staking的2/3,那么就認為邊界區(qū)塊被驗證了。
具體而言,對于下面的例子:

這是一個驗證者的視圖,由于網(wǎng)路延遲等問題,他之前很多區(qū)塊沒收到,因此64號區(qū)塊就是193號區(qū)塊Epoch1和Epoch2的邊界區(qū)塊,因此他再這里寫入投票****α****,表示(64,2)是(180,3)的邊界區(qū)塊。同時根據(jù)GHOST規(guī)則可以看出需要投193號區(qū)塊為當前的鏈頭。
敲定
而敲定相對于驗證是一個更強一點的概念,如果說區(qū)塊B0構(gòu)成的邊界區(qū)塊(B0,j)被敲定了,那么要么他是創(chuàng)世區(qū)塊,要么存在一個k>=1的數(shù)滿足以下三個條件:
- (B0, j), (B1, j + 1), . . . , (Bk, j + k) 是相鄰的epoch邊界
- (B0, j), (B1, j + 1), . . . , (Bk?1, j + k ? 1) 都已經(jīng)被驗證了
- (B0, j)被 (Bk, j + k)驗證了
其實總的來說就是B0,需要被其他區(qū)塊驗證!
舉個例子:

藍色的區(qū)塊代表被敲定了,帶箭頭的邊表示被驗證了(思考k=2時,B1為什么沒有被敲定?)
分叉規(guī)則Hybrid LMD GHOST(HLMD)
驗證了邊界區(qū)塊之后,只要沒有超過1/3的攻擊者stake就不能篡改這個區(qū)塊,在這個假設(shè)基礎(chǔ)上就能唯一確定邊界區(qū)塊,從而定義epoch內(nèi)部的分叉規(guī)則了,算法如下:

這個算法思路其實表簡單,就是先選取最新驗證的epoch邊界區(qū)塊Bj,然后再根據(jù)GHOST規(guī)則來找到當前主鏈的鏈頭區(qū)塊。
細心的你可能發(fā)現(xiàn)這里有個問題就是,最新被驗證的區(qū)塊可能會變,因為被驗證了不等于finalize了,只要還沒被完全敲定就有可能會變;同時,每個驗證節(jié)點的視圖可能不一致,就導致我們自己的這個區(qū)塊Bj可能跟別人的不一樣!
那么對于這兩個問題如何解決呢?還有整個系統(tǒng)的安全性和可用性如何呢?且聽下回分解...