【Fractal】ETH2.0 都要來了你還不知道 Casper 嗎?(二)

買賣虛擬貨幣

在上篇文章中,我們介紹了Vitalik原始論文中的Casper FFG,其藉助PoS對PoW產生的區塊進行確認來提高系統的安全性,但這只是一種過渡的方案,在以太坊2.0中會使用一個純PoS的Casper協議,這篇文章中將為大家介紹在以太坊2.0中將要使用的Casper協議。

如何成為Validator

首先我們看看以太坊2.0的架構是什麼樣子,如圖1所示,在以太坊2.0中會有一條稱之為Beacon chain的主鏈,其透過PoS的Casper產生。在beacon chain下,存在1024個分片,每個分片可以獨立地處理資料。

圖1 以太坊2.0架構

從圖1可以看出,以太坊2.0和以太坊1.0將會是兩條鏈,在2.0分片實現之後,1.0將作為以太坊2.0的一個分片繼續執行。在上一篇文章中,我們介紹過可以透過抵押stake成為Validator參與到PoS共識中,為了使以太坊平穩得過度到2.0,如何透過抵押以太坊1.0中的stake成為以太坊2.0中的Validator是Casper需要解決的一個重要問題。

在以太坊2.0中,原有的使用者可以透過抵押以太坊1.0中的ETH成為Validator,參與到2.0的PoS中,並且可以透過贖回操作,在2.0的以太坊中取回代幣。這裡需要注意的是,以太坊1.0和2.0中的代幣並不相同,使用者抵押的是1.0中的ETH(燒燬ETH),贖回的是2.0中的代幣(鑄造新的token)。

使用者想要成為Validator,首先要向以太坊1.0中的一個特殊合約傳送一筆交易抵押一定數量的ETH(目前最小值為32ETH),然後使用者會得到關於這筆交易的一個證明。使用者透過向以太坊2.0展示這個證明,在驗證透過後成為Validator,如圖2所示:

圖2 抵押以太坊1.0中的ETH成為以太坊2.0中的Validator過程

為了驗證使用者抵押交易的正確性,以太坊2.0中需要儲存當前以太坊1.0中的區塊資訊、抵押合約中當前所有交易構成的Merkle的根雜湊,使用者向以太坊2.0展示其抵押交易,以及該抵押交易到完整的Merkle樹的證明,就可以驗證這幣交易的合法性。透過驗證的使用者成為以太坊2.0中的Validator。

以太坊2.0Capser的出塊過程

在上一篇文章中,我們介紹的Casper是透過PoW進行出塊,使用PoS對區塊進行最終的確定。因此,純PoS的Casper一個需要解決的問題是如何產生區塊。在正式介紹協議過程前,我們先明確幾個定義:

  • Validators 集合: V = V1 … Vn,假設每個Validator擁有相同的stake;

  • slot:基本的時間單位,目前設定為6s;

  • epoch:64個slot組成一個epoch;

  • 隨機數生成器:根據需要產生一個隨機數;

在明確了上述的定義之後我們來進一步描述以太坊2.0中的Capser出塊過程,如圖3所示。

圖3 以太坊2.0中Casper共識過程

1、每一個epoch開始,透過隨機數生成器產生隨機數,將Validator集合V平均分為64份,得到S1、S2,…,S64。

2、在一個epoch中,每一個slot i根據步驟1中產生的隨機數,選取Si中的一個Validator提交一個候選區塊,在slot i中提交候選區塊的Validator寫作proposer_i,提交的候選區塊寫作B_i。

3、對於每一個slot i,Si中除 proposer_i 外的剩餘Validator對 B_i 進行投票,該投票寫作attestation。

4、在每一個slot i中, proposer_i 負責將上一個slot中的attestation資訊打包到當前slot的候選區塊中。即 

5、對於每一個slot i,Si中除 proposer_i 外的剩餘Validator在收到了slot i的block(B_i)或等待了3s後,其公佈一個在他看來的當前鏈的頭部。

LMD GHOSTLastest Message Driven GHOST

至此,我們介紹了Casper如何進行出塊以及Validator對於候選區塊的投票過程。需要注意的是,上文中提及到Validator需要對在它看來為鏈的頭部進行投票,以太坊2.0使用了一種新的最優鏈選擇演算法來選擇鏈的頭部。

在介紹這種新的最優鏈選擇演算法之前,讓我們回憶一下以太坊1.0的最優鏈選擇演算法——GHOST。GHOST演算法的主要思想是,對於一條區塊鏈因為時間延遲和惡意節點的存在會產生許多的分叉,當發現分叉時,選擇子樹的總Difficulty最大作為最優鏈,如圖4所示:

圖4 GHOST協議

鏈在紅色的點產生分叉,假設每個區塊的Difficulty相同為1,藍色子樹的總Difficulty為8,紫色子樹的總Difficulty為4,因此選擇藍色作為最優鏈上的點。

GHOST協議在在PoW協議中是沒有問題,但是PoS協議天然受到 Lang Range 攻擊的影響,即攻擊者可以透過少量資金購買曾經擁有大量stake但是目前為空的賬戶,回到過去,在過去的位置進行分叉產生大量的非法的區塊,GHOST協議將無法保證系統的安全性。如圖5所示:

圖5:Lang Range 攻擊

攻擊者透過在過去位置產生黃色的區塊,子樹B的總Difficulty為10,紫色區塊將成為最優鏈上的點。雖然在投票前需要抵押token,但是在贖回自己的token後,攻擊者就可以在其還是Validator的epoch中肆意妄為,不擔心token會被罰沒。

因此,為了解決這個問題,以太坊2.0設計了一個新的演算法——LMD GHOST(Lastest Message Driven GHOST)。LMD GHOST的主要思想是,對一條存在分叉的鏈,在找尋鏈的頭部過程中,當其遇到分叉點時,選擇當前epoch中Validator支援多的那棵子樹。協議的主要過程為:

對於一條存在分叉的鏈:

        1、H等於創世區塊;

        2、M=[M1,…,Mn] 是Validator的最新訊息;

        3、選擇M中支援率最多的孩子節點,將其設定為H;

        4、重複步驟(2-3)直到沒有孩子節點;

雖然LMD GHOST的使用是為了解決Long Range攻擊,但是筆者認為, 購買曾經的賬戶相當於時光倒流,形成了一個新的平行宇宙,當一個新使用者進入時,面對兩條分叉鏈在不借助額外資訊(checkpoint)的情況下很難判斷哪個是攻擊者構造的鏈,因此LMD GHOST無法徹底抵禦Long Range攻擊。

至此我們已經介紹鏈以太坊2.0中的Casper如何進行出塊,接下來將是最後一個部分,如何對候選區塊進行最終的確認。

區塊確認

在上一篇文章中,我們解釋了justified和finalized的checkpoint,finalized的checkpoint之前的節點被最終確認。概括的說,以太坊2.0中的Casper將每個epoch當成一個checkpoint,attestation對checkpoint進行投票,進而確定checkpoint的justified和finalized狀態,確定justified和finalized的核心邏輯和上文中描述的類似。接下來,來說明一下block如何進入到justified和finalized狀態。

如何 justify block

現在Casper將一個epoch分成64個slot,最後一個slot稱之為epoch_boundary_slot,用它的hash寫作epoch_boundary_hash代表一個epoch,將一個epoch看作一個checkpoint。讓鏈維護一個map,我們叫他justified_hashes,儲存的格式是<slot, hash>。為Validator 的 attestation增加兩個欄位 epoch_boundary_hash(上一個epoch中slot最小的block的hash) 和 latest_justified_hash(epoch_boundary_hash引用區塊中的justified_hash epoch最新的block的hash),只有當attestation中的latest_justified_hash 等於justified_hashes中的slot最新的hash,這個attestation才合法。

鏈會跟蹤最新的justified hash,因此選擇相同epoch_boundary_hash會投票給相同的latest_justified_hash。現在我們來看看在一個 epoch boundary 中,狀態是如何轉變的。假設對於一條鏈,最近的4個 epoch的epoch_boundary_block B1, B2, B3, B4 其中B4是epoch最新的epoch_boundary_block,他們的 slot 寫作 B1_slot, B2_slot, B3_slot, B4_slot, B3_slot = B4_slot -  64, etc。如果有超過2/3的Validator選擇B4作為epoch_boundary_block,那麼把<B4_slot, hash(B4)> 加入justified_hashes。

一個epoch_boundary_block成為justified的條件是超過2/3的Validator在其attestation中epoch_boundary_hash指向該block,當一個block被含在justified_hashes中表示,該block是justified,並且證明該block已經是justified的狀態被記錄到了鏈上。

如何finalize block

在確認了justified的狀態後,下一步需要確定如何讓block進入finalize狀態。

如果B4和B3在justified_hashes中,投票給B4作為epoch_boundary_block的attestation選擇B3作為latest_justified_hash,finalize B3。

 如果B4、B3、B2在justified_hashes中,投票給B4作為epoch_boundary_block的attestation選擇B2作為latest_justified_hash,finalize B2。

 如果B3、B2、B1在justified_hashes中,投票給B3作為epoch_boundary_block的attestation選擇B1作為latest_justified_hash,finalize B1。

可以類比上一篇文章,Validator的投票為<v, s, t, h(s), h(t)>,可以將epoch_boundary_block看成h(t),latest_justified_hash看成h(s),這樣能更方便的理解block的確認過程。

其他的一些小事

為了Casper完整的執行,還有一些小事需要解決,由於篇幅比較短小我們放在一起來說吧。

懲罰條件

為了抵禦noting at stake攻擊,使用者透過抵押token成為Validator進行PoS,當Validator非法操作時,沒收其抵押的token,來防止壞人作惡。Validator的懲罰條件為:

    1、同一個Validator不能在相同的epoch中發出兩個不同的attestation。

    2、同一個Validator不能發出兩個attestation,他們的 epoch_boundary_block 分別為t1和t2,latest_justified_hash 為s1和s2,且 s1<s2<t2<t1。

這個懲罰條件和上一篇文章中的懲罰條件是相同的。

Validator更換條件

dynasty(B)表示從block B開始到創世區塊之間,finalized epoch的個數。兩個dynasty之間可以更換1/64的Validator。

分叉選擇條件

從最新的finalized block開始,進行LMD GHOST。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;