前言2017年,Vitalik Buterin 與 Virgil Griffith 共同發(fā)表了Casper the Friendly Finality Gadget(Casper FFG)。Casper FFG 是受 PBFT 啟發(fā)
前言
2017年,Vitalik Buterin 與 Virgil Griffith 共同發(fā)表了 Casper the Friendly Finality Gadget(Casper FFG)。Casper FFG 是受 PBFT 啟發(fā)并經(jīng)過改良的共識協(xié)議,它雖然被設(shè)計得很簡潔(Simple),但其對安全性的證明卻不簡單(Easy)。
筆者將于本文解析 Casper FFG 的原理,讀者可以一窺權(quán)益證明共識所嘗試解決的問題及其設(shè)計理念。此外,Casper FFG 是以太坊 2.0 的共識機制,理解其運作也能幫助研究員與開發(fā)者進一步理解以太坊 2.0 的設(shè)計。
最后要特別感謝以太坊研究員 Chih-Cheng Liang(梁智程)提供重要素材并與筆者共同大量討論及給予回饋,沒有他的協(xié)助便不會有這篇文章的誕生。
Casper FFG 是怎么開始的?
以太坊對權(quán)益證明(Proof-of-Stake, PoS)的研究最早可追溯至 2014 年的這篇文章。從此之后,以太坊研究員們便一直朝「實現(xiàn)基于 PoS 的共識協(xié)議」此一目標(biāo)前進。PoS 共識的設(shè)計是一個跨領(lǐng)域且相當(dāng)復(fù)雜的問題,其包含計算機科學(xué)/經(jīng)濟學(xué)/密碼學(xué)等方面。以太坊擁有區(qū)塊鏈生態(tài)系中最跨領(lǐng)域的團隊,對 PoS 的研究可以說是相當(dāng)透徹。
筆者于日前翻譯了一篇關(guān)于 Casper FFG 發(fā)展脈絡(luò)的重要文獻:
Casper FFG 與 Casper CBC 的瑜亮情結(jié)
Casper FFG 受到 PBFT 的啟發(fā),并可以被視為改良后的 PBFT ——它繼承了 PBFT 的重要設(shè)計,同時添加新的機制與簡化若干規(guī)則。若讀者對 PBFT 感到陌生,可以參考筆者日前針對 PBFT 的解析文:
若想搞懂區(qū)塊鏈就不能忽視的經(jīng)典:PBFT
簡而言之,PBFT 是一個具有二輪投票機制的共識協(xié)議,且具有下列特性:
許可制的(Permissioned):只有被「允許」的節(jié)點能參與共識。
基于領(lǐng)袖的(Leader-based):只由主導(dǎo)節(jié)點負(fù)責(zé)「提案」(Propose),其他節(jié)點只負(fù)責(zé)投票,因此需要視域變換(View Change)機制來節(jié)制不誠實的主導(dǎo)節(jié)點。
基于通訊的(Communication-based):使用決定性的(Deterministic)多數(shù)決來形成共識,而不是非決定性的(Non-Deterministic)算力解謎賽局。
安全性重于活躍性的(Safety-over-Liveness):無論網(wǎng)絡(luò)是否延遲,協(xié)議都能保證共識的安全性(即不分叉),這賦予協(xié)議的特性。
其中 PBFT 所具備的即時敲定性,或許是其受到 Vitalik 青睞的主要原因。Vitalik 在熟讀 PBFT 后也特撰文總結(jié),并于其中提出日后演變成 Casper FFG 的重要想法。
Casper FFG 的前身:砍押金的 4 條規(guī)則
PBFT 雖然具有即時敲定性,但并不具有抵抗共謀的能力,因此需要一個懲罰機制來遏止作惡的行為,只要節(jié)點做出逾越規(guī)則的行為,便必須承受經(jīng)濟損失——透過經(jīng)濟學(xué)法則來調(diào)節(jié)節(jié)點的行為正是 PoS 的設(shè)計理念。任何支付押金的節(jié)點,都可以加入網(wǎng)絡(luò)參與共識,無需任何人的許可,因此基于 PoS 模型的共識都是非許可制的(Permissionless)。
在這里要澄清一下「許可」這件事。我們會說他「非許可制」,是因為任何驗證節(jié)點可以加入和退出。但如果在他加入的時候,鏈要維持一個驗證節(jié)點清單,從這個角度看又有點是「許可制」。從 PBFT 的角度看,投票的驗證節(jié)點也必須從許可的清單中挑選。
那么下一個問題是:哪些行為該被懲罰?Vitalik 仔細(xì)推敲 PBFT 后發(fā)現(xiàn),PBFT 只需 4 條規(guī)則(PBFT 中的斷言)便能確保共識運作良好:最少的砍押金條件Vitalik 在這篇文章中總結(jié)了這 4 條規(guī)則,并把它們稱為 PBFT 的「最少的砍押金條件」(Minimal Slashing Conditions),任何違反此 4 條規(guī)則的行為都要被取走押金。這 4 條規(guī)則如下:
1.提交(commit_req):收到2/3節(jié)點的預(yù)備訊息后才能提交。2.預(yù)備(prepare_req):每個預(yù)備訊息只能指向某個也具有2/3節(jié)點預(yù)備訊息的高度(Epoch),且這些預(yù)備訊息也必須都指向同一個高度。3.預(yù)備提交一致性(prepare_commit_consistency):任何新的預(yù)備訊息只能指向最后一個已提交的或其他比其更新的高度。4.不重復(fù)預(yù)備(no_double_prepare):不能在同一個高度送出兩次預(yù)備。
這 4 條規(guī)則可以進一步簡化為 2 條:
某驗證節(jié)點v必不可發(fā)出兩個相異的投票:<ν,s1,t1,h(s1),h(t1)>及<ν,s2,t2,h(s2),h(t2)>,且使下列任一條件成立:1.h(t1)=h(t2)驗證節(jié)點必不可對某高度發(fā)出兩個相異投票。2.h(s1)
這 2 條規(guī)則便是 Casper FFG 的最少砍押金條件。
Casper FFG 如何運作?
-Casper FFG: 檢查點樹-Casper FFG 是一個將出塊機制(Block Proposing Mechanism)抽象化的覆蓋鏈(Overlay),只負(fù)責(zé)形成共識。出塊機制由底層鏈實現(xiàn),而來自底層鏈的出塊(Block Proposal)稱為檢查點(Checkpoints)。檢查點組成檢查點樹(Checkpoint Tree),例如:把高度為 0、50、100、150 的區(qū)塊哈希值取出,形成一棵新的樹,如上圖所示。最底部的檢查點則稱為根檢查點(Root)。每個節(jié)點都必須對檢查點送出投票(Vote),投票的內(nèi)容是由兩個不同高度的檢查點組成的連結(jié)(Link),連結(jié)的起點高度較低,稱為源頭(Source);連結(jié)的終點高度較高,稱為目標(biāo)(Target)。
節(jié)點會將投票廣播到網(wǎng)絡(luò)中,并同時收集來自其他節(jié)點的投票。其中若投票給某連結(jié) L 的節(jié)點押金總和超過全部押金的 2/3,則稱 L 為絕對多數(shù)連結(jié)(Supermajority Link),以 s → t 表示。例如上圖中,b1 / b2 / b3 之間都形成了絕對多數(shù)連結(jié),分別以 b1 → b2、b2 → b3 表示。由根檢查點開始,若兩個檢查點之間形成絕對多數(shù)連結(jié),則該連結(jié)的目標(biāo)進入「已證成」( Justified)狀態(tài);而在連結(jié)建立當(dāng)下已處于「已證成」?fàn)顟B(tài)的源頭,則進入「已敲定」(Finalized)狀態(tài);根檢查點則預(yù)設(shè)為「已證成」及「已敲定」?fàn)顟B(tài)。
由此可知,每個檢查點在經(jīng)過兩次投票后,會先「證成」(Justify)而后「敲定」(Finalize),幾乎等同于 PBFT 的「預(yù)備」與「提交」。例如在上圖右邊的分支中,r / b1 / b2 皆為「已敲定」?fàn)顟B(tài),只有 b3 為「已證成」?fàn)顟B(tài)。那么驗證節(jié)點該對哪些檢查點建立連結(jié)?每個節(jié)點都必須遵循分叉選擇規(guī)則(Fork Choice Rule)來選擇下一個要連接的檢查點,Casper FFG 的規(guī)則是:選擇最高的「已證成」?fàn)顟B(tài)的檢查點。
-Casper FFG: 驗證節(jié)點集合的大幅變化引起的分叉-由于 Casper FFG 能讓任何存入押金的節(jié)點成為驗證節(jié)點,因此驗證節(jié)點集合(Validator Set)會動態(tài)地隨著時間變化。節(jié)點從退出網(wǎng)絡(luò)至取出押金需要等待一段期間,該等待期間稱為提領(lǐng)延遲(Withdrawal Delay)。每個檢查點 C 都有其對應(yīng)的朝代數(shù)(Dynasty),其定義為:從根檢查點開始至 C 為止的已敲定檢查點數(shù)量,例如上圖中,b3 的朝代數(shù)為 3。每一代檢查點都對應(yīng)兩種驗證節(jié)點集合:前端(Front)驗證節(jié)點集合(包含于此代加入的節(jié)點)以及后端(Rear)驗證節(jié)點集合(包含于此代退出的節(jié)點)。
理論上每代檢查點的前端/后端集合會高度重復(fù),但難保節(jié)點共謀造成前端/后端集合的大幅變化,若此情形發(fā)生,則出錯時可能會砍不到壞節(jié)點的押金(因為壞節(jié)點已退出)導(dǎo)致安全性受到威脅。例如上圖中,驗證節(jié)點 A 可以退出,代表對 C' 分叉(綠色)來說 A 退出了,可是對 C 分叉(紫色)來說, A 卻從來沒退出過。因此 A 有辦法繼續(xù)投舊鏈 C,但新鏈 C' 砍不到 A 的押金(因為已退出)。
為了讓每代檢查點在出錯時都能確實歸責(zé),因此需要縫合機制(Stitching Mechanism)將檢查點的前端/后端集合「縫」起來,確保每個錯誤都必定能歸責(zé)(出錯的可能是前端集合或者后端集合)。綜合以上,Casper FFG 幾乎針對 PBFT 的所有方面都做出改進:
經(jīng)濟上的制約:PBFT 是許可制的,它仰賴原本就存在信任基礎(chǔ)的組織共同運行協(xié)議;Casper FFG 則是非許可制的,它引入最少砍押金條件,利用經(jīng)濟損失的風(fēng)險來制約節(jié)點的行為,節(jié)點之間不需要任何信任基礎(chǔ)也能共同運行協(xié)議,實現(xiàn)真正的去中心化。
抽象的出塊機制:PBFT 仰賴誠實的主導(dǎo)節(jié)點產(chǎn)生區(qū)塊并需要視域變換機制節(jié)制拜占庭節(jié)點;Casper FFG 無需理會底層的出塊機制,只需負(fù)責(zé)形成共識。出塊抽象的好處是:底層鏈的出塊頻率不必與覆蓋鏈的共識頻率一致,如此可以增加效率并降低網(wǎng)絡(luò)的負(fù)擔(dān)。例如:每 100 個底層區(qū)塊只產(chǎn)生 1 個檢查點。
流水線化的投票:PBFT 具有 < Prepare >、< Commit >、< View-change > 等數(shù)種投票訊息;Casper FFG 僅有 < Vote > 一種,且投票的內(nèi)容并不是單一的區(qū)塊/請求,而是兩個形成連結(jié)的檢查點,這使 Casper FFG 能夠在不犧牲太多表達(dá)力的前提下變得簡潔許多。這些形成鏈?zhǔn)浇Y(jié)構(gòu)的檢查點,會于兩個不同高度分別經(jīng)歷兩輪投票,由于每一輪投票都會敲定源頭與證成目標(biāo),因此共識能如流水線(Pipeline)般不斷推進。相似的設(shè)計理念也出現(xiàn)于 Hot-Stuff,有趣的是,該論文作者 Dahlia Malkhi 還撰文比較 Hot-Stuff 與Casper FFG,其相似程度可見一斑。
這些形成鏈?zhǔn)浇Y(jié)構(gòu)的檢查點,會于兩個不同高度分別經(jīng)歷兩輪投票,由于每一輪投票都會源頭與目標(biāo),因此共識能如流水線(Pipeline)般不斷推進。相似的設(shè)計理念也出現(xiàn)于 Hot-Stuff,有趣的是,該論文作者 Dahlia Malkhi 還撰文比較 Hot-Stuff 與Casper FFG,其相似程度可見一斑。
強健的抗攻擊性:PBFT 不具備對遠(yuǎn)程攻擊(Long-range Attack)以及災(zāi)難性崩潰(Catastrophic Crash)的抗性;Casper FFG 則具有特別的機制來防御這兩種攻擊:針對遠(yuǎn)程攻擊,節(jié)點必須定期同步區(qū)塊及禁止回朔(Revert)已敲定的區(qū)塊;針對災(zāi)難性崩潰,Casper FFG 則引入「離線溢金」(Inactivity Leak)機制來應(yīng)對。關(guān)于這兩種攻擊的說明,筆者將于日后另撰文論述。
由于 Casper FFG 相當(dāng)簡潔,以太坊研究員一度實現(xiàn)了合約版本的 Casper FFG:ethereum/casper然而,這個合約版的 Casper FFG 后來被棄用了!在合約版中原本假設(shè)投票能夠被并行處理,但在計算投票報酬有很多中間狀態(tài),不同投票處理的先后順序?qū)绊懽詈蟮玫降臓顟B(tài),這代表并行化將無法達(dá)成共識。而要修正這個問題則必須要在合約與客戶端做大量修改,失去了「邏輯用合約實現(xiàn),避免修改客戶端」的精神。因此,為了能夠更好地整合 Casper FFG 與其他優(yōu)化提案(例如分片),全新的以太坊 2.0磅礴登場了。
以太坊2.0 中的 Casper FFG
-以太坊 2.0: 分片-以太坊 2.0 是一個基于 EVM 并整合 Casper FFG 與眾多優(yōu)化提案(以分片為主)的分布式帳本。以太坊 2.0 除了想實現(xiàn) PoS,還試圖將每秒交易數(shù)(TPS)擴展到 10000 筆的量級,使區(qū)塊鏈成為如網(wǎng)際網(wǎng)絡(luò)一般的基礎(chǔ)設(shè)施(Infrastructure),并且讓任何存入 32 個以太幣的押金的節(jié)點都能成為驗證節(jié)點。
分片(Sharding)即是為了增加可擴展性(Scalability)的重要設(shè)計,也是以太坊 2.0 最重要的目標(biāo)。分片就是分工合作,我們可以用一個簡單的例子來說明分片的概念(實際上的解釋要比這復(fù)雜得多):2 人寫 2 題作業(yè),2 人各寫不同的 1 題再合起來一定比 2 人都各寫完 2 題來得更有效率。目前的以太坊只有 1 條區(qū)塊鏈,所有節(jié)點必須各自處理所有交易(如同 2 人各自寫完 2 題作業(yè));在以太坊 2.0 中,網(wǎng)絡(luò)會分成 1024個片(Shard),每片分別運行 1 條分片鏈(Shard Chain),它們將各自處理一部分的交易后再將結(jié)果交由 1 條信標(biāo)鏈(Beacon Chain)統(tǒng)整(如同 2 人各做不同的 1 題再合起來)。
因此,以太坊 2.0 預(yù)計會有 1 條信標(biāo)鏈以及 1024 條分片鏈。值得注意的是:片是一個抽象層,并不特指某一群節(jié)點。為了更了解這個概念,筆者擴充一下上文的例子:假設(shè)寫作業(yè)有找答案及抄答案兩個步驟,那么 A / B 2人寫 2 題作業(yè),由讀速快的 A 找第 1 題答案,讀速慢的 B 找第 2 題答案;由手速快的 B 抄第 1 題答案,手速慢的 A 抄第 2 題答案。如此,A / B 便可以依照讀/寫的快/慢來分別負(fù)責(zé)不同題目的不同步驟。同樣地,在以太坊 2.0 中,除了有 1024 個片,還會有 1024 個持續(xù)委員會(Persistent Committee)與 1024 個交聯(lián)委員會(Crosslink Committee):
每個片都會對應(yīng) 1 個持續(xù)委員會與 1 個交聯(lián)委員會,如同上例中每個題目可以依照讀/寫的步驟來對應(yīng)不同的個體。
使用鏈上隨機數(shù)(On-chain Random Number)決定各委員會的分派,如同上例中依照讀/寫的快/慢來分派題目(關(guān)于鏈上隨機數(shù)的實現(xiàn)細(xì)節(jié)留待筆者日后詳述)。
持續(xù)委員會負(fù)責(zé)維護分片鏈與產(chǎn)生分片區(qū)塊(Shard Block)、交聯(lián)委員會負(fù)責(zé)維護信標(biāo)鏈與產(chǎn)生信標(biāo)區(qū)塊(Beacon Block),如同上例中讀速快的負(fù)責(zé)找答案、手速快的負(fù)責(zé)抄答案。各區(qū)塊的出塊節(jié)點(Block Proposer)也交由鏈上隨機數(shù)決定。
換句話說,每個驗證節(jié)點都需維護 1 條唯一的信標(biāo)鏈及 1 條所屬片的分片鏈,也都會隸屬于與該分片對應(yīng)之 1 個交聯(lián)委員會與 1 個持續(xù)委員會。Casper FFG 是運行于以太坊 2.0 之上的覆蓋鏈,這個覆蓋鏈同樣由檢查點構(gòu)成,各檢查點之間的跨度稱為時期(Epoch),1 個時期(Epoch)切成 64 個時段(Slot ),每個時段對應(yīng) 16 個片(16 = 1024 ÷ 64),因此每片在每時期中都有對應(yīng)的時段,并只能在輪到自己時才廣播其對檢查點的投票,且每分片只能 1 個時段中投出 1 票——也就是說,各分片需要先對投票內(nèi)容形成共識,不過各片內(nèi)部形成共識的方法仍尚未定論,近期最新的提案是使用聚合簽名。
另外,Casper FFG 在以太坊 2.0 中的分叉選擇規(guī)則是最新消息驅(qū)動GHOST(Latest-Message Driven GHOST, LMD GHOST)。理論上,Casper FFG 于每個檢查點的投票應(yīng)該要與底層出塊機制的投票分開;實際上,以太坊 2.0 的底層投票內(nèi)容會同時包含頂層投票內(nèi)容(檢查點的連結(jié)),如同頂層投票搭了底層投票的便車(Piggyback),借此優(yōu)化效能。如此在每個時期結(jié)束時,每個片都會收到所有其他片在該時期的投票,Casper FFG 活躍性得以維持。
結(jié)語
Casper FFG 是一個實現(xiàn)權(quán)益證明的大膽嘗試,它在以太坊 2.0 的表現(xiàn)值得期待。然而以太坊 2.0 還有許多難題留待解決,例如輕節(jié)點(Light Client)/ 鏈上隨機數(shù)生成器(On-chain Random Number Generator)/ 跨片交易(Cross-shard Transaction)等等。
與此同時,許多以太坊 2.0 的競爭者也提出新的共識協(xié)議與分片技術(shù),例如 RapidChain / Harmony / Chainspace 等等。Casper FFG 以及以太坊 2.0 是經(jīng)過眾多研究員/開發(fā)者不斷激蕩與迭代的重要結(jié)晶,但一直以來都缺乏提供系統(tǒng)性論述的中文材料,希望此文可以幫助中文世界的研究員/開發(fā)者快速理解 Casper FFG 與以太坊 2.0 的精要。(作者:Juin Chiu)