原文標題:《基於委員會的累積終結性模型》
作者:Vitalik Buterin
本文提出了一種以太坊信標鏈(Beacon Chain)的擬議替代設計,在未來長期內可以切換到該設計(取代當前計劃切換的CBC)。該替代設計旨在提供一些關鍵屬性:
在正常情況下提供有意義的單槽(single-slot)經濟終結性(即類似Tendermint 的屬性):使單槽重組的成本高得多,即使是多數人串通的情況下也能執行,從而降低共識可提取價值(CEV)
擺脫對LMD GHOST 分叉選擇的嚴重依賴,避免已知的缺陷以及需要引入複雜的混合分叉選擇規則來修復這些缺陷。
可能允許更低的最小存款大小和更高的驗證器數量
保存經濟終結性最終接近一個非常大的數字(數百萬ETH)的屬性
1
準備工作
讓CONSENSUS 成為一種異步安全的共識算法(例如Tendermint、Casper FFG ……)。我們假設這種共識算法有一些槽(slot)或視圖的概念,它在每個固定時間段嘗試達成共識。我們還假設它將一種加權驗證器集作為輸入(現有的BFT 共識算法可以輕鬆修改以添加此屬性)。
在下面的設計中,我們修改了CONSENSUS,以便在每個視圖中,需要最終性的集合是不同的。也就是說,CONSENSUS 將一個函數get_validator_set(view_number: int) -> Map[Validator, int](代表驗證器餘額的int)作為輸入,而不是驗證器集,它可以為新視圖生成驗證器集。 get_validator_set 應該具有以下屬性:驗證器集根據從一個視圖到下一個視圖的最大1/r值進行更改,其中r(例如r=8192 )是恢復期長度。更正式地說,我們想要:
其中丨x丨返回x 中值的絕對值之和, diff 返回每個鍵值的差值(例如diff({a: 0.1, b:0.2}, {b:0.1, c:0.3}) = {a :0.1,b:0.1,c:-0.3})。
在實踐中,兩個相鄰驗證器集之間的差異將包括現有驗證器洩漏餘額,以及以與洩漏餘額相等的速率引入新驗證器。
請注意,這意味著如果兩個終結性的視圖數量相差足夠遠,則這時候可以在不削減的情況下進行雙重終結性確定;這是有意為之,並且該協議以與當今Casper FFG 處理不活動洩漏的方式相同的方式圍繞它工作。
2
機制
我們使用兩級分叉選擇:
選擇 LATEST_FINALIZED_BLOCK
從 LATEST_FINALIZED_BLOCK,應用一些其他叉選擇(例如 LMD GHOST)來選擇head
共識算法的視圖在每個插槽都會被嘗試,將基於get_post_state(LATEST_FINALIZED_BLOCK) 數據的驗證器集生成函數作為輸入傳入。在視圖i 中,一個有效的提案必須包含從LATEST_FINALIZED_BLOCK 到插槽LATEST_FINALIZED_BLOCK.slot + i 處的區塊的鏈。如果提示的父級是分叉選擇的贏家,這時驗證者才需要準備並提交提案。
如果CONSENSUS 在某個視圖中成功,則該視圖中的提案將成為新的LATEST_FINALIZED_BLOCK,更改未來輪次的驗證器集。如果失敗,它將在下一個槽/視圖中進行下一次嘗試。
注意:插槽應始終等於當前視圖編號加上每個先前驗證器集中成功完成的視圖編號的總和。
我們有以下處罰:
由共識算法確定的定期削減處罰
不活躍懲罰:如果這條鏈未能實現終結性,所有未參與的人都會受到懲罰。此懲罰旨在將r/2個插槽後的餘額削減一半。
3
屬性
如果一個區塊獲得終結性,那麼要終結確定一個競爭區塊,需要發生以下情況之一:
某些委員會被破壞,其中他們中≥1/3會被削減以對不同的區塊實現雙重終結性
最近的委員會離線,在r/3個插槽之後,委員會輪換足夠多,以便能夠在不削減的情況下使一個不同的區塊獲得終結性。然而,這是以嚴重的不活躍懲罰為代價的(≥1/3的攻擊者余額)
在任何一種情況下,即使還原一個終結區塊也至少需要銷毀DEPOSIT_SIZE * COMMITTEE_SIZE / 3個ETH。如果我們設置COMMITTEE_SIZE = 131,072(ETH2 委員會中每個插槽的驗證器數量在理論上最大400 萬個驗證器限制),則該值為1,398,101 個ETH。
該方案的其他一些重要屬性包括:
驗證器的負載將非常穩定,無論存入多少驗證器,處理每個插槽的 COMMITTEE_SIZE 交易
驗證者的負載會更低,因為當他們沒有被要求加入委員會時,他們可以休眠
在不犧牲安全性的情況下,可以允許休眠的驗證器快速退出+撤回
4
擴展:具有較小委員會的鏈終結性
如果出於效率原因,我們必須減小COMMITTEE_SIZE,我們可以進行以下調整:
我們沒有選擇最新的終結性區塊,而是選擇作為最長終結性區塊鏈末端的終結區塊(但拒絕恢復超過 COMMITTEE_LOOKAHEAD)
get_validator_set 應該只使用來自狀態超過 COMMITTEE_LOOKAHEAD 之前的信息
視圖編號應該只是插槽編號(這可以更容易地推斷出在不同鏈中使用相同的驗證器集嘗試達成共識的情況,這只有在可能破壞一些終結性的情況下才會發生)
這保留了上述所有屬性,但它也引入了一個新屬性:如果一個區塊獲得多個終結性(即該區塊被終結,並且其後代鏈獲得k-1 個更多終結,總共k 個影響該區塊的順序終結性),然後恢復該區塊需要違反多個委員會的終結性保證。這允許多個委員會的安全級別疊加:一個人需要COMMITTEE_SIZE * DEPOSIT_SIZE * k / 3 ETH 來恢復k個終結性,最多k = COMMITTEE_LOOKAHEAD,此時委員會分歧。
還要注意,出於p2p 子網安全的原因,先行機制無論如何都值得做,所以用它來設計系統可能是一個好主意,如果需要的話,讓客戶端來決定他們如何處理終極性反轉。
5
具體值的例子
請注意,“打破終結性所需的ETH”數量假設攻擊者控制的驗證器數量遠遠超過質押總量的一半(即數百萬ETH);這個數量是攻擊者將失去的。並不是任何擁有2,730 - 174,762 ETH 的人都可以進入並銷毀該ETH 以逆轉單一插槽的終結性。