以太坊 2.0 Serenity的設計原則與考量

以太坊創始人 Vitalik Buterin 對名為「Serenity」的以太坊 2.0 進行了詳細闡述,包括設計原則、Layer1 與 Layer2 的折衷、使用權益證明、Casper 與 Sharding 的理由、安全模型、Casper 的激勵機制、BLS 簽名、隨機選擇驗證者、LMD GHOST 分叉選擇規則、信標鏈 / 分片鏈結構、驗證者生命周期。Eth1.0 鏈的設計原理文檔見 此處

Serenity 設計原則

簡潔性:特別是由於加密貨幣經濟 PoS 和二次分片 (quadratic sharding) 在本質上很複雜,因此協議應該在其決策中儘可能地追求最大的簡潔性。這是非常重要的,因為這將能夠:

(i) 最大限度地減少開發成本,
(ii) 減少發生意外安全問題的風險,且
(iii) 使得協議設計人員更容易讓用戶確信參數選擇的合法性。

通過此鏈接 1 了解相關的背景信息。當我們為了實現特定級別的功能時,是無法避免一定的複雜性的。複雜性的優先順序別是:Layer2 協議的複雜性 > 客戶端實現的複雜性 > 協議規範的複雜性。

長期穩定性:理想情況下,應該構建較低級別的協議,這樣就不需要在 10 年或更長時間內更改協議,並且任何需要的創新都可以在更高的級別 (客戶端實現或 Layer2 協議) 上進行。

充裕性:在協議之上應能夠構建儘可能多的應用程序類別。

深度防禦性:協議應能夠在各種可能的安全性假設 (例如有關網路延遲、故障數量、用戶動機的假設) 的情況下繼續運行。

輕客戶端的可驗證性:鑒於一些安全性假設 (例如網路延遲,攻擊者預算界限,只存在 1/n 或少數誠實的驗證者),驗證 O© 數據 (理想情況是只驗證信標鏈) 的客戶端應該能夠獲得間接的保證,即整個系統的所有數據是可用且有效的,即使在受到 51% 攻擊的情況下(備註:這是「深度防禦性」方面的其中一個目標)。

Vitalik 萬字闡述以太坊 2.0 Serenity 設計原則與考量

Layer1 與 Layer2 的折衷

讀者可以先閱讀我之前的兩篇文章:Layer 1 Should Be Innovative in the Short Term but Less in the Long Term2 和_Sidechains vs Plasma vs Sharding_3。

在任何區塊鏈協議設計中,在 Layer1 (即共識層) 引入更多的特性,與構建一個更為簡潔的 Layer1 協議並在 Layer2 (即應用層) 上允許構建這些特性,這兩者之間各有折衷之處:

支持 Layer2 的論據:

  • 減少共識層的複雜性 (參見上方提到的「簡潔性」);
  • 減少修改協議層的必要性 (參見上方提到的「長期穩定性」):
    • 降低無法達成共識的風險;
    • 減少協議治理和政治風險方面的工作量
  • 隨著時間的推移,擁有更多的靈活性和實現新想法的能力

支持 Layer1 的論據:

  • 減少由於缺乏強制每個人升級到新協議 (即硬分叉) 的機制而導致進展停滯的風險;
  • 可能會降低整個系統的複雜度;
  • 如果 Layer1 不夠強大,那麼就不可能在 Layer1 上搭建具有所需性能的 Layer2 系統 (參見上方提到的「充裕性」)

以太坊 2.0 的設計在很大程度上都是要致力于謹慎地在 Layer1 和 Layer2 之間保持平衡。這包括 (i)類似圖靈完備的、包含豐富狀態的代碼執行,(ii)在數據有效性和計算方面的擴展性,以及 (iii)更快的區塊確認時間,這對於協議實現【充裕性】都是非常必要的,因為:

  • 如果不實現 (i),那就無法具有穩健的信任模型來搭建 Layer2 應用程序。
  • 如果不實現 (ii),那擴展性將僅限於藉助狀態通道或者 Plasma 等技術實現,而這些技術在推廣以及資金鎖定和 / 或大規模退出方面存在挑戰。
  • 如果不實現 (iii),那就無法在不使用通道技術的情況下進行快速交易,而通道技術在推廣以及資金鎖定和 / 或大規模退出方面存在挑戰。

但以太坊 2.0 也將一些其他的特性有意地留給了 Layer2 來實現:(i)隱私性,(ii)高級編程語言,(iii)可擴展的狀態存儲,以及 (iv)簽名方案。這些特性留給 Layer2 來實現,是因為這些方面都是快速創新的領域,現有的許多方案具有不同的特性,並且不可避免地要進行權衡,以獲得更好、更新的方案。比如:

  • 隱私性:環簽名 (Ring Signature) + 機密性值 (confidential values) vs. ZK-SNARKs 和 ZK-STARKs,Rollup vs. ZEXE 等等。
  • 高級編程語言:聲明式編程 vs. 命令式編程,語法,形式化驗證特性,類型系統,保護性特徵 (比如禁止在算術表達式中使用非純函數),本地支持的隱私特徵等等;
  • 可擴展的狀態存儲:賬戶模型 vs. UTXO (未使用交易輸出) 模型、不同的租金方案、原始默克爾分支見證 (raw Merkle branch witnesses) vs. SNARK/STARK 壓縮 vs. RSA 累加器,稀疏的默克爾樹 vs. AVL 樹 vs. 基於使用情況的不平衡數等等 (除此之外,還有針對驗證狀態轉換的不同方案)。
    *簽名方案:Schnorr 簽名、BLS 簽名、Lamport 簽名等等

為何使用權益證明?

參見 :
https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQhttps://medium.com/@VitalikButerin/a-proof-of-stake-design-philosophy-506585978d51

為何使用 Casper?

當前權益證明 (PoS) 共識演算法主要要三個陣營:

  • 受到中本聰啟發的權益證明演算法 (比如 Peercoin (點點幣)、NXT (未來幣)、Ouroboros (Cardano 的共識演算法) 等實用的演算法)
  • 受到 PBFT (實用拜占庭容錯) 啟發的權益證明演算法 (比如 Tendermint、Casper FFG、Hotstuff 等演算法)
  • CBC Casper (解釋詳見 4 和 5)

在後兩個陣營存在一個問題,即是否使用以及如何使用保證金存款 (質押金) 和 Slashing (質押金罰沒)。這三種權益證明機制都優於工作量證明 (PoW),但我們想在本文捍衛一下以太坊 2.0 使用的方法。

質押金罰沒 (Slashing)

以太坊 2.0 使用一種 Slashing (質押金罰沒) 機制,即被檢測到行為不端的驗證者將會被懲罰,最輕微的懲罰是銷毀~1% 的質押金,最嚴重的懲罰是銷毀驗證者的所有質押金

我們通過以下幾個方面來為 Slashing 機制的使用進行辯護:

1.增加攻擊成本:我們想要確保的是,任何對 PoS 鏈發起的 51% 攻擊都將導致攻擊者消耗一筆非常大的費用(比如價值數億美元的加密貨幣),且系統能夠快速地從任何攻擊中恢復。這使得攻擊 / 防禦演算對於攻擊者來說非常不利,並實際上可能使攻擊適得其反。
2.克服驗證者帶來的困境:節點開始偏離「誠實」行為的最現實直接的方法就是疏忽職守 (比如驗證者本該參與驗證,但卻不參與驗證;或者在不該簽名時進行簽名等等)。驗證者帶來的困境詳見 6,比特幣 SPV 挖礦 7 就是這種情況發生的例子,這將導致非常嚴重的後果。對非誠實的驗證者進行驗證懲罰有助於緩解這些困境

上方第 2 點的一個更為微妙的例子就是,在 2019 年 7 月 Cosmos 鏈上的一名驗證者因對兩個相互矛盾的區塊進行簽名而被罰沒了 8。對此事件的調查結果顯示,該驗證者同時運行了一個主節點 (primary node) 和一個備份節點 (backup node),該驗證者的目的是為了確保當其中一個節點下線時,該驗證者依舊能夠獲得獎勵,而這兩個節點恰好同時啟動了,導致這兩個節點對兩個相互矛盾的區塊進行了簽名。

如果同時擁有一個主節點和備份節點成為常態,那麼攻擊者就可以對區塊鏈網路進行分區,並使所有驗證者的主節點和備份節點提交不同的區塊,從而導致兩個相互矛盾的區塊被敲定。slashing 懲罰有助於在很大程度上抑制這種操作,降低發生這種情況的風險。

共識演算法的選擇

在上文提及的 PoS 共識演算法的三個陣營中,只有後兩個陣營 (即受 PBFT 啟發的共識演算法和 CBC Casper) 這兩種演算法中存在 finality (確定性) 的概念,即某個區塊是通過這種方式得以確認的:只有當很大一部分驗證者 (受 PBFT 啟發的演算法要求至少有 1/3 的驗證者,CBC Casper 演算法要求至少有 1/4 的驗證者) 行為不當並因此被罰沒時,該區塊才會被逆轉

而第一個陣營–受中本聰啟發的 (最長鏈規則) 共識演算法無法實現這種意義上的確定性 (finality)。

需要注意的是,確定性要求大多數驗證者在線,而這已經是 Sharding (分片) 機制中已經存在的要求,即Sharding 機制要求每個由隨機驗證者組成的委員會中的 2/3 驗證者對交聯 (crosslink) 進行簽名,只有這樣,該交聯才將被信標鏈接受

我們選擇 Casper FFG 只是因為它是協議在實現確定性時可用的最簡單的演算法。當前我們正在積極探索在以太坊 2.0 的階段 3 將之切換為 CBC Casper

Sharding,或者說我們為何討厭超級節點?

對於 Layer1 擴展而言,sharding (分片) 方式的一個主要替代方法就是使用超級節點 (supernodes),超級節點要求每個共識節點都擁有一個強大的伺服器,這樣該節點就能單獨地處理每一筆交易。

基於超級節點的擴展方式很方便,因為很容易實現:這與當前很多區塊鏈採取的方式一樣,除了需要進行更多的軟體設計工作來以一種更加並行化的方式進行構建。

我們不選擇這種使用超級節點的方式,主要理由如下:

  • 驗證礦池中心化風險:在一個基於超級節點的系統中,運行一個節點將需要消耗一筆高昂的固定成本,這使得能夠參與進來的用戶數量受到限制。雖然有些人會反駁道「在大多數 PoW 和 PoS 加密貨幣中,共識是由 5-20 個礦池子 (礦池或驗證礦池) 控制的,而這些礦池子可以很好地運行節點。」但這種觀點的問題在於忽視了其中存在的中心化壓力風險,即便是財力雄厚的礦池子之間也存在這種風險。如果運行驗證者的固定成本相對於回報來說是非常高的,那更大的驗證礦池就能夠提供比小型驗證礦池更低廉的手續費,這將可能導致那些小型的驗證礦池被排擠並感受到進行合併的壓力而在分片系統中,質押更多 ETH 的驗證者將需要驗證更多的交易,因此成本並不是固定的
  • 雲端中心化風險:在一個基於超級節點的系統中,用戶在家裡進行 staking 就變得不可行了,因此大多數 staking 更有可能發生在雲計算環境中。這將創建一個單點故障。
  • 抗審查性降低:如果沒有達到高計算+帶寬要求,用戶就不可能參與共識,這使得檢測和審查驗證者變得更加容易。
  • 擴展性:在一個基於超級節點的系統中,隨著交易吞吐量的增加,上文提及的風險也會相應地增加,而分片系統能夠更加輕鬆地處理交易量的增長**。

上述這些中心化風險也是我們為何不會試圖實現以太坊的超低延遲性 (低於 1 秒) 的原因,而是選擇 (相對) 保守的延遲時間。在以太坊 2.0 系統中,使用儘可能少或儘可能多的 ETH 以及使用儘可能少或儘可能多的計算能力來參與是可能的(儘管你需要在 ETH 和計算能力方面相一致,即你無法在僅擁有很少計算能力的情況下質押大量的 ETH,反之亦然),且固定成本是最小化的,儘管這種成本會隨著你質押的 ETH 的數量的增長而增加 (一旦你質押的 ETH 數量超過了 32,768 ETH,那麼大部分時間你將在驗證所有的分片鏈(備註:共計 1024 條分片鏈,每個驗證者身份需要質押 32 ETH,因此 1024*32=32,768))。

安全模型

人們通常認為區塊鏈的安全性依賴於「大多數參與者是誠實的」這一假設,即≥50% 的參與者將會誠實地遵循既定的協議,會為了個人的利益放棄叛變的機會。

事實上,(i)「大多數參與者是誠實的」這種假設並不切實際,因為參與者可能會「懶惰 (lazy)」,在不驗證區塊的情況下籤署區塊 (參見驗證者帶來的困境 9 和比特幣 SPV 挖礦導致的分叉 10),這都是非常普遍的叛變情況;但幸運的是,(ii)區塊鏈通常會通過一些安全模型(而非假定大多數參與者將保持誠實)來維護自身的安全特性

一種常見的較為嚴苛的安全模型就是非協同的理性多數模式 (uncoordinated rational majority),即參與者會按照自己的利益行事,但相互協同的參與者數量不會超過一定的比重 (在簡單的 PoW 鏈中,這一比重為 23.2% 11)。

另一個更為嚴苛的安全模式是應對最糟情況的模式,即當單個參與者控制了超過 50% 的算力或質押金時,此時的問題就變成了

(1) 在這種情況下,我們能保證驗證者在試圖破壞整條鏈時將付出非常高昂的成本嗎?
(2) 我們可以無條件地保持哪些保證?

在 PoS 鏈中,slashing (對質押金的罰沒) 可以提供上方第一個問題的保證,即當攻擊者試圖破壞整條鏈時,將需要成大非常高昂的成本。在不存在分片的區塊鏈 (比如當前的以太坊 1.0 鏈) 中,每個驗證所有區塊的節點都會通過提供以下兩個保證來完成上方第二個問題的要求:(i) 最長的鏈是有效的,且 (ii) 最長的鏈也是可用的 (通過此鏈接 12 查看「數據可用性」的重要性的理論依據)。

在以太坊 2.0 中,我們通過 sharding (分片) 的方式來實現深度防禦,即通過將隨機選擇的驗證者委員會組合起來,基於大多數驗證者將保持誠實的安全模式,以實現有效性和可用性保證,且通過託管證明 (proof of custody) 來防止懶惰的驗證者(即如果驗證者「懶惰」不參與驗證將會面臨懲罰),通過欺詐證明 (fraud proofs)數據可用性證明 (data availability proofs)9 在無需下載和驗證所有數據的情況下檢測無效和不可用的鏈。這將允許客戶端拒絕無效和不可用的鏈,即便當這條鏈是由大多數 PoS 驗證者支持的鏈。

客戶端可以通過某種保留共識的方式來檢測交易的審查性 (詳見 13),但這方面的研究還沒有整合到以太坊路線圖之中。

下表中展示了預計的安全特徵:

Vitalik 萬字闡述以太坊 2.0 Serenity 設計原則與考量

Casper 設置的激勵機制

基本獎勵 (Basic rewards)

在每個 epoch 期間 (在以太坊 2.0 中,每生成 64 個區塊 (大約 6.4 分鐘) 稱為一個 epoch),每個驗證者都要進行「證明 (attestation)」,也即對鏈頭 (head) 進行投票簽名 (鏈頭也就是頂端區塊)。如果驗證者的「證明」被包含在了鏈頭中,那該驗證者將獲得獎勵,這個獎勵由五個部分組成:

  1. 因「證明」被包含在頂端區塊中而獲得的獎勵;
  2. 因「證明」明確了正確的 epoch 檢查點而獲得的獎勵 (備註:每個 epoch 期間的最後一個 slot 被稱為 checkpoint (檢查點),slot 為協議設定的生成一個區塊所需的時間 (6 秒));
  3. 因「證明」明確了正確的鏈頭 (頂端區塊) 而獲得的獎勵;
  4. 因「證明」被迅速地包含在鏈上而獲得的獎勵 (如果「證明」是在 1 個 slot 之後就被包含在鏈上,那驗證者將獲得全部獎勵;如果在 n 個 slot 之後才被包含在鏈上,那獲得的獎勵將是全部獎勵的 1/n);
  5. 因「證明」明確了正確的分片區塊而獲得的獎勵。

在每種情況下,實際獎勵的計算如下。如果 B 是基本的獎勵,P 是執行所需「證明」操作的一部分驗證者,那麼任何執行了所需操作的驗證者所獲得的獎勵將是 B*P,而任何本該執行相關操作但卻未進行該操作的驗證者將受到 -B 的懲罰。這種「集體獎勵」機制的目標是「如果有人表現得更好,那每個人都表現得更好」,從而限制惡意破壞因素。(參見本文 13 查看有關惡意破壞因素的描述以及為何限制這些因素非常重要)

需要注意的是,上方第 4 點是一個例外;這種獎勵取決於「證明」被採納的延遲性,而不是取決於驗證者的行為,而且沒有懲罰的風險。

基本獎勵 B 本身的計算方式是

Vitalik 萬字闡述以太坊 2.0 Serenity 設計原則與考量

其中 D1…Dn 是驗證者質押金的規模,k 是一個常量。這是兩種常見模式的折中方案,這兩種常見的模式是 (i) 設置固定的獎勵率,也即 k*Di,(ii) 設置固定的總獎勵,也即

Vitalik 萬字闡述以太坊 2.0 Serenity 設計原則與考量

反對 (i) 的主要論據是,這種模式給網路帶來了兩個方面的不確定性:幣的發行總量不確定,以及參與質押的總數不確定(因為如果固定的獎勵率太低,那基本沒人會參與進來,這威脅了整個網路;而如果固定的獎勵率太高,那將有太多的人參與進來,使得幣的發行量出乎意料的高)。

反對 (ii) 的的主要論據是,這種模式將會使網路更容易遭受「discouragement attacks」攻擊,詳見 13。

採取基本獎勵的方式折衷了這兩種方法,並避免了每種方法的最壞結果。

區塊提議者將「證明」包含在區塊中之後獲得的獎勵是基本獎勵的 1/8,這樣的目的是鼓勵區塊提議者儘可能地監聽信息並接受儘可能多的信息。

達到收支平衡的在線時間

假設存在兩種驗證者:(i) 發揮作用的在線驗證者,和 (ii) 離線的驗證者,如果前一類驗證者部分是 P,基本的獎勵是 B,那麼在線驗證者預計將獲得的獎勵是:上方第 1、2、3、5 種情況下的獎勵 B*4P + 上方第 4 種情況的獎勵 7/8*B*(P+(P*(1-P))/2+(P*(1-P)^2)/3+...) (因為「證明」有可能會因為驗證者缺席而延遲被包含在鏈頭中) +區塊提議者獎勵 1/8*B*P。驗證者缺席 (即本該參與驗證而實際上並未進行驗證) 將受到的懲罰是 B*4。因此,如果所有其他驗證者都在線,那驗證者在線時將會獲得 B*5 的獎勵,而離線時將會受到 B*4 的懲罰,因此如果驗證者在線的時長為 ≥4/(4+5)≈44.44%,那驗證者將能夠處於不賠不賺 (收支平衡) 的狀態。如果 P=2/3 (即在線的驗證者占所有驗證者總數的 2/3),那驗證者將會因為在線而獲得的獎勵是

≈B*(2/3*4.125+7/8*0.81)≈B*3.46,或者將為因為在線時長≥53.6% 而達到收支平衡的狀態。

但是,如果 P 低於 2/3 (即在線驗證者的數量低於總數的 2/3),那針對離線的驗證者將會受到稱為「inactivity leak」的懲罰

Inacivity leak

如果以太坊 2.0 鏈在超過 4 個 epoch 的期間都未能實現確定性 (finality),那將會增加額外的懲罰,使得最大可能的獎勵是零(未能正確執行操作的驗證者受到懲罰),且還會增加第二個懲罰,此懲罰將會根據在多少個 epoch 期間未能實現 finality 而成比例地增長。這是為了確保如果超過 1/3 的驗證者下線,那這些離線的驗證者將會受到更為嚴重的懲罰,且這種懲罰會隨著時間的推移而成倍地增長。

這將帶來三個影響:

  • 離線驗證者將會受到更嚴重的懲罰,因為此時驗證者的離線實際上會阻止區塊被敲定;
  • 服務於「反相關性懲罰」的目標 (下文將進一步解釋)
  • 確保如果超過 1/3 的驗證者同時離線時,最終上線的驗證者數量將恢復至總數的 2/3,因為離線驗證者不斷減少的質押金將會導致他們被驅逐出驗證者行列。

基於當前這種參數化,如果區塊停止了被 finalize (敲定) 的進程,那驗證者將會在 2.6 天之後損失 1% 的質押金,在 8.4 天后損失 10% 的質押金,在 21 天后損失 50% 的質押金

這意味著,如果 50% 的驗證者離線了,那區塊會在 21 天之後重新開始被 finalize,因為 21 天之後,所有離線的驗證者已經損失了 50% 的質押金 (16 ETH),而如果驗證者的質押金低於 16 ETH 將被驅逐出驗證者行列。

Slashing & 反相關性懲罰

如果驗證者被發現違反了 Casper FFG 的 slashing (罰沒) 條件,那該驗證者將受到懲罰 (損失一部分質押金);如果大約在同一時間還有其他驗證者受到 slashing 懲罰 (具體來說,就是從該驗證者被懲罰的前 18 天到該驗證者退出驗證者行列的這段時間),那這種懲罰將是之前的三倍。這樣做有幾個目的:

  • 只有當某個驗證者同時與很多其他驗證者一起行為不當時,該驗證者的行為才會對網路造成真正的損害,因此這種情況下的懲罰會更加嚴重;
  • 這會對實際的攻擊行為進行嚴重地懲罰,但對可能並非惡意的單個獨立失誤採取非常輕微的懲罰;
  • 這確保了小型驗證者將比大型驗證者承擔更少的風險 (因為在正常情況下,只有大型驗證者才會在同一時間失效);
  • 這抑制了所有人都加入最大的驗證礦池中。

BLS 簽名

我們將使用 BLS 簽名,因為 BLS 簽名是聚合友好型的:由密鑰 k1 和 k2 (對應的公鑰 K1=G*k1K2=G*k2,其中 G 是橢圓曲線的基點) 對消息 M 進行的任意兩個簽名 S1 和 S2 都可以簡單地通過橢圓曲線點加法聚合起來:S1+S2。這允許生成數千個簽名,每個簽名的邊際成本就是一個數據位 (用於表示在該聚合簽名中存在一個特定的公鑰) 和一個用於計算的橢圓曲線加法。

需要注意的是,這種形式的 BLS 簽名易遭受流氓密鑰攻擊 (rogue key attackes):如果你看到其他驗證者已經公布了公鑰 K1...Kn,那你可以生成私鑰 r 並公布一個公鑰 G*r-K1-...-Kn。聚合的公鑰將是 G*r,這樣將能夠自己對聚合的公鑰進行簽名驗證。解決這個問題的標準方法是需要一個所有權證明 (proof of possession):基本上就是某條針對私鑰 k 和公鑰 k 對公鑰進行驗證的簽名。這確保了你控制了與你公布的公鑰相連接的私鑰。

我們使用驗證者質押消息的簽名作為所有權證明,該簽名明確了簽名的密鑰以及其他重要的信息,比如取款密鑰。

隨機選擇驗證者

用於實現隨機性的種子 (seed) 會通過對區塊提議者必須揭露的一個值進行「mixing in」 (即 seed <- hash(seed, new_data)) 從而在每個區塊中進行更新。就像託管證明子密鑰 (subkey) 一樣,驗證者的值 (values) 是在驗證者進行質押之後就立即確定好的,第三方無法計算出子密鑰,但是當子密鑰被資源揭露時對其進行驗證 (這種機制有時叫做 RANDAO)。

這確保了每個區塊提議者都對隨機性種子有「位操作」:提議者可以提議區塊,也可以不提議。如果提議者不提議區塊,那將錯過很多的獎勵。此外,由於長期委員會 (persistent committee) 和交聯委員會 (crosslink committee) 的規模很大,因此對隨機性的操控幾乎肯定是無法讓少數攻擊者控制任何一個委員會中的 2/3 的驗證者

未來我們計劃使用VDF (可驗證延遲函數)來進一步增加隨機性種子抵禦操控的魯棒性。

打亂驗證者 (Shuffle)

在每個 epoch 期間,我們使用 swap-or-not shuffle 13 的方式來打亂驗證者並分配職責。這種演算法確保了:

由於打亂驗證者 (shuffle) 就是一種置換,在每個 epoch 期間,每個驗證者都會被指定為一個交聯委員會的成員 (從而使驗證者的工作量穩定,並減少隨機性操控帶來盈利的可能性);

由於打亂驗證者 (shuffle) 就是一種置換,在每個 epoch 期間,每個驗證者都會被指定為一個長期委員會的成員;

交聯委員會

在每個 epoch 期間,每個分片都會進行一次交聯 (crosslink),即從分片委員會中隨機選擇 2/3 的驗證者 (每個分片委員會的驗證者數量約為 128 名) 對自上一次交聯以來在該分片中包含的所有數據的哈希進行簽名(由於分片中的交聯可能失敗,因此該哈希最多可以代表前 64 個 epoch 的數據;如果分片中連續好多次的交聯失敗,那可能需要實現多次成功的交聯才能趕上)。

每個分片委員會的驗證者數量被設定為 128 名,因為這是一個抵禦攻擊者在控制少於 1/3 的所有驗證者的情況下偶然地控制 2/3 的委員會成員的最低數量,通過二項式定理,攻擊者控制 2/3 的委員會成員的幾率是 5.55*10^(-15)

由於以太坊 2.0 系統中將有 1024 條分片鏈,這意味著要想每個分片鏈在每個 epoch 期間進行一次交聯,那我們將需要 131072 名驗證者 (備註:1024*128=131072),或者說,以太坊 2.0 系統中需要質押大約 440 萬 ETH(實際上,如果質押的 ETH 少於這個數,那分片鏈的交聯發生的次數就會更少)。而如果將最低的質押限制提高 (比如提高至 1024 ETH,當前確定的是 32 ETH),那意味著我們將無法獲得足夠多的驗證者數量來實現在每個 epoch 期間在每個分片鏈上進行交聯,除非所有的 ETH 都質押了進來。

每個 epoch (64 個區塊,約 6.4 分鐘) 之後,信標鏈都會重新為每個分片鏈重組一個分片委員會 (也即打亂驗證者)。對驗證者進行快速打亂,是為了確保如果攻擊者想要攻擊某條分片鏈,那該攻擊者將需要快速地破壞 (控制) 該分片委員會。

長期委員會

在每個 27 小時左右的時間段內,系統將會為每條分片鏈選擇一個長期委員會 (persistent committee)。在任何時間,以太坊 2.0 系統中的每個驗證者都是其中某個長期委員會的成員。長期委員會負責提議分片區塊、為用戶提供某種程度的有關分片區塊的保證 (直到分片區塊包含在了某次交聯中),且輕客戶端可以藉助長期委員會。為了保持 P2P 網路的穩定性和輕客戶端的效率,長期委員會的變更相對較少 (而分片委員會每隔約 6 分鐘就更換一次)。

每個長期委員會的驗證者數量上限是 128,因此如果系統中的驗證者數量超過了 131072,那任何時候都會有驗證者不被選中進入任何一個長期委員會中;這減少了不必要的驗證浪費。

為了進一步維護網路的穩定性,並不是所有的驗證者都會同時從_n時間段的長期委員會中輪換為n+1_時間段的長期委員會;而是每個驗證者的輪換都會有所延遲,直到下個時間段的某個隨機時間點再進行輪換。

LMD GHOST 分叉選擇規則

信標鏈使用 LMD GHOST 分叉選擇規則,相關描述參見 15。

LMD GHOST 分叉選擇規則會合併來自所有驗證者的信息,確保在正常情況下任何一個區塊都不可能會被逆轉。由於該分叉選擇規則依賴於所有的驗證者,這也確保了除非攻擊者控制了 50% 以上的驗證者,否則無法逆轉區塊,因為這種情況下攻擊者無法通過操控隨機性來獲得很大的優勢。

信標鏈 / 分片鏈結構

以太坊 2.0 分片系統的結構包含一個協調所有活動的中心「信標鏈」,以及 1024 條分片鏈。每條分片鏈都會定期地通過交聯 (crosslink) 的方式與信標鏈相連接。

這種分片結構的替代方案:

(1) 通過委員會對分片區塊進行簽名,將所有分片區塊都直接地放入信標鏈中;
(2) 不存在信標鏈,而是通過某種結構將所有的分片鏈連接起來。

上述第 (1) 種結構被捨棄的原因是:對分片鏈區塊設置一個 6 秒的時間 (slot) 是可取的,但是每 6 秒在信標鏈上進行 1024 次交聯將會導致信標鏈承受非常高的負荷。

上訴第 (2) 中結構被捨棄的原因是:中心輻射型的信標鏈結構比任何複雜的構造都更容易實現和理解。

分片鏈的設計

每個分片都是一條半獨立的鏈,它可以比交聯聚合區塊更快遞處理區塊 (目標是 3-6 秒)。這使得交易在被信標鏈 (通過交聯的方式) 確認之前,能夠通過分片長期委員會快速地獲得一定程度的確認。

分片鏈結構是這樣的,每個區塊都由分片委員會的每個驗證者進行證明 (attest),這保證了驗證的簡單性,並確保分片區塊獲得了程度相當高的確認;大多數處理較低價值的應用應該都可以依賴於單次確認。

在每個 epoch 開啟時,每個分片區塊都包含了一個指向其父塊的 pointer 和一個指向信標區塊的 pointer。信標鏈和分片鏈之間的這種半緊密耦合是為了 (i) 確保分片鏈知道有關其長期委員會的信息 (因為此信息是由信標鏈生成的),同時 (ii) 使驗證分片鏈區塊稱為一個決定哪條鏈才是規範信標鏈的可行方式。

分片鏈狀態 (獎勵、懲罰、歷史累加器) 被故意設計成小於區塊大小,目的是確保如果欺詐證明有需要,分片鏈狀態可以完全被放入信標鏈之中 (雖然這可能只會在階段 2 放寬限制,在階段 2,每個單獨的執行環境的狀態將受到此大小的限制,但所有狀態合併起來將非常大,因此欺詐證明將需要默克爾證明)。

交聯數據

交聯包含了 data_root,即自上次交聯以來,包含了某條分片中所有分片區塊的數據結構的默克爾根 (Merkle root)。這種交聯數據結構+根有多重目標:

  • 使信標鏈知道哪些才是規範的分片鏈區塊;
  • 創建一個簡單的位元組數組,可以通過不同的方法 (託管證明、數據可用性證明) 來驗證其可用性,並保證可以通多交聯來對分片區塊進行完全恢復。
  • 創建一個簡單的位元組數組,可以對欺詐證明進行評估。

驗證者生命周期

質押

驗證者通過發送一筆交易來進行 ETH 質押 (這筆交易會調用部署在 Eth1.0 鏈上的質押合約 (deposit contract) 的一個函數) ,最終我們會在 Eth2.0 鏈上加入進行質押的方式。驗證者的這一操作明確了:

  • 與用於對消息簽名的私鑰相對應的公鑰
  • 取款憑證(即公鑰哈希,當驗證者在完成驗證之後,公鑰哈希將用於提取資金)
  • 質押金額

這些值都是由簽名密鑰進行簽名的。將簽名密鑰 (signing key) 和取款密鑰 (withdrawal key) 分開,目的是讓更具安全風險的取款密鑰得更加安全 (取款密鑰處於離線狀態,不會與任何質押礦池進行共享等等),而簽名密鑰則用於在每個 epoch 期間對消息進行簽名。

質押合約 (deposit contract) 中保留著所有質押的默克爾根 (Merkle root)。一旦驗證者質押的默克爾根被包含在了 Eth2.0 鏈中 (通過 Eth1.0 數據投票機制),Eth2.0 區塊提議者就可以提交一個該質押的默克爾證明,並啟動質押過程。

激活

當某個驗證者往質押合約中發送了一筆交易之後,就立即加入了驗證者登記表中,但該驗證者一開始處於未激活狀態。只有當至少 4 個 epoch 之後,該驗證者才會被激活;驗證者之所以需要等待至少 4 個 epoch (每個 epoch 大約 6.4 分鐘),是為了確保 RANDAO 沒有被操縱,且如果很多驗證者同時加入進來,那 N 可能會超過 4。

如果 Eth2.0 中已經存在的驗證者總數是 |V|,那每個 epoch 期間能夠新加入的最大驗證者數量將是 max(4, |V|/65536);如果更多的驗證者想要加入進來,那他們將需要排隊,系統將儘可能快地進行處理。

退出

當某個驗證者從 Eth2.0 系統中退出時 (無論是通過發布一個自願退出消息,還是由於被罰沒而退出),那該驗證者也將需要進行排隊才能從系統中退出,每個 epoch 期間能夠退出的最大驗證者數量與上文所述的能夠新加入的最大驗證者數量一樣。

之所以設置這種新加入 / 退出排隊的限制,是為了確保系統中的驗證者總數不會在任何兩個時間點之間變化太快,這確保了只要驗證者足夠頻繁地登入 (如果驗證者總數≥262144,那驗證者保證能夠每 1-2 個月登入一次),那就能保證以太坊新舊兩條鏈之間依舊存在確定性。相關原理參考 17 和 18

取款

一旦驗證者成功地通過排隊退出了,還需要等待大約 27 小時的時間才能進行取款。這一等待時間有幾個作用:

  • 這確保了如果該驗證者有不當行為,將有時間抓獲該不當行為,並對該驗證者進行罰沒 (slashing);
  • 這給予系統時間將最後一段時間的分片獎勵發放給該驗證者;
  • 這為對託管證明發起挑戰提供了時間。

如果驗證者被罰沒了,那取款時間還將進一步延遲約 36 天。這是對驗證者的進一步懲罰 (並強迫他們持有 ETH;相比於那些想要支持以太坊但只是不小心犯錯的驗證者受到的懲罰,這使得那些想要破壞以太坊區塊鏈的惡意驗證者受到的懲罰將要更嚴重),同時也給系統預留了時間,用於計算在此期間也被罰沒的其他驗證者的數量。

在階段 0 期間,想要「取款」的驗證者實際上是還不能進行取款的;在之後的階段,將能夠把驗證者取出的資金轉移至某個執行環境中。

有效餘額

大多數基於驗證者餘額的計算都使用驗證者的「有效餘額(effective balance,EB)」;唯一的例外就是有關增加或減少驗證者餘額的計算。只有當驗證者的餘額 B 低於 EB 或者高於 EB+1.5 時,EB 才會調整為等於 floor(B)。這是為了確保有效餘額不會經常改變,減少每個 epoch 期間重新計算狀態所需的 hashing 量;平均而言,只需要更新餘額,而每個驗證者只需相對更少地對有效餘額進行更新。

分叉機制

Fork 數據結構包含了 (i) 當前的 「fork ID」,(ii) 前一個「fork ID」 和 (iii) 切換這兩個分叉的 slot。當前區塊高度的 fork ID 影響著所有消息的有效簽名;因此,使用一個 fork ID 簽名的消息對於使用任何其他 fork ID 的驗證函數無效。

通過在某個 「fork slot」 增加一個狀態轉換就可以進行分叉。簽名驗證函數將使用消息所在的 slot 的 fork ID 來驗證該消息,這個 fork ID 有可能是前一個 fork ID,也有可能是當前的 fork ID。

如果任何用戶不想要加入某個分叉,只需繼續留在那條沒有在 fork slot 改變 fork ID 的鏈上。這兩條鏈都可以繼續存在,驗證者可以自由地對這兩條鏈進行驗證,且不會受到罰沒懲罰。

原文標題:《V 神親訴 Serenity 設計原理,帶你了解這項宏偉工程背後的獨具匠心》
作者:Vitalik Buterin
編譯:Jhonny
來源:Unitimes

備註:譯文有所刪減

來源鏈接:notes.ethereum.org

提示:投資有風險,入市需謹慎,本資訊不作為投資理財建議。請理性投資,切實提高風險防範意識;如有發現的違法犯罪線索,可積極向有關部門舉報反映。
你可能還喜歡