進一步透視一下以太坊雄心勃勃的線路圖。
- 原文標題:《The Hitchhiker’s Guide to Ethereum》
- 原文作者:Jon Charbonneau
- 原文編譯:[email protected], DoraFactory
核心要點:
- 以太坊是唯一一個主要協議,意在建立可擴展的統一的結算和數據可用性層。
- 在利用以太坊安全性的同時,rollup 擴大了計算量。
- 所有的道路都通向中心化區塊生產、去中心化的無需信任區塊驗證和抗審查這一終局。
- 諸如發起者—建設者分離和弱無狀態等創新,帶來了權力分離(建設和驗證),可以在實現可擴展性的同時,不犧牲安全性或去中心化目標。
- MEV 現在是前沿和中心——許多設計都是為了減輕其危害和防止其中心化傾向而計劃的。
- Danksharding 結合了前沿研究的多種途徑,為以太坊以 rollup 為中心的路線圖提供所需的可擴展基礎層。
- 我確實期待 Danksharding 在我們的有生之年得到實施。
目錄
第 1 部分 通往 Danksharding 之路
- 原始的數據分片設計——獨立分片提議
- 數據可用性抽樣(DAS)
- KZG 承諾(KZG Commitment)
- KZG 承諾 vs. 欺詐證明
- 協議內的發起者和建設者分離
- 審查抵抗列表(Censorship Resistance List, crList)
- 2D KZG 策略
- Danksharding
- Danksharding——誠實多數驗證
- Danksharding——重建
- Danksharding——私人隨機抽樣的惡意多數安全
- Danksharding——關鍵總結
- Danksharding——在區塊鏈擴展上的制約
- 原生的 danksharding(EIP-4844)
- 多維度的 EIP-1559
第 2 部分 歷史和狀態管理
- Calldata gas 成本縮減及 calldata 總量限制(EIP-4488)
- 在執行客戶中限定歷史數據(EIP-4444)
- 恢復歷史數據
- 弱無狀態性(Weak Statelessness)
- Verkle Tries(Verkle 嘗試)
- 狀態過期
第 3 部分 一切都是 MEV 的鍋
- 如今的 MEV 供應鏈
- MEV-Boost
- 委員會驅動的 MEV Smoothing
- 單槽拍板(Single-slot Finality)
- 單一秘密領袖選擇(Single Secret Leader Election)
第 4 部分 合併的秘密
- 合併後的客戶端
- 合併後的共識
總結時刻
簡介
自從 Vitalik 說今天出生的人有 50-75% 的機會活到公元 3000 年,而他希望能長生不老,我就一直對合併的時機持相當懷疑的態度。但是,管他呢,還不許找樂子嗎,藉此機會,我們進一步透視一下以太坊雄心勃勃的路線圖。
這篇文章不能速食。如果你想對以太坊雄心勃勃的路線圖有一個廣泛而細緻的了解,請給我一個小時,我將為你節省幾個月的工作。
以太坊的研究有很多需要跟蹤的地方,但一切最終都交織成一個總體目標——在不犧牲去中心化驗證的情況下擴大計算量。
Vitalik 有一個著名的「終局」說,不知道你有沒有聽過,他承認以太坊擴展需要一些中心化成份。在區塊鏈中,代表中心化的 C 字母是可怕的,但又是一個現實。我們只是需要用去中心化和無需信任的驗證來控制這種權力,這裡並沒有妥協。
專業人士將為 L1 及其之上添磚加瓦。以太坊透過簡單的去中心化驗證保持了令人難以置信的安全性,而 rollup 則從 L1 繼承其安全性。然後,以太坊提供結算和數據的可用性,使 rollup 的規模得以擴大。這裡所有的研究最終都是為了優化這兩個角色,同時,使區塊鏈的完全驗證比以往更加容易。
下面的術語大概會重複出現個七八五十九次:
- DA – Data Availability 數據可用性
- DAS – Data Availability Sampling 數據可用性抽樣
- PBS – Proposer-builder Separation 發起者和建設者分離
- PDS – Proto-danksharding 原生的 danksharding
- DS – Danksharding 一個以太坊的分片設計
- PoW – Proof of Work 工作量證明
- PoS – Proof of Stake 質押證明(或稱權益證明)
第 1 部分 通往 Danksharding 之路
希望你已經聽說,以太坊已經轉向以 rollup 為中心的路線圖。不再有更多的執行分片——以太坊將轉而優化對數據要求較高的 rollup。這是透過數據分片(有點算 Ethereum 的計劃)或更大的區塊(Celestia 的計劃)實現的。
共識層(Consensus layer)不解釋分片的數據。它只有一項工作——確保數據是可用的。
我將假設你熟悉一些基本概念,如 rollup,欺詐(Fraud)和 ZK 證明,以及為什麼 DA(數據可用性)很重要。如果你不熟悉或者只是需要複習一下,可以看 Can 最近的 Celestia 報告。
原始的數據分片設計——獨立分片提議
這裡描述的設計已經被廢止了,但作為背景值得了解一下。為了簡單起見,我把它稱為「分片 1.0」。
64 個分片區中的每一個都有單獨的提案和委員會從驗證者集合中輪流通過。他們單獨驗證他們的分片的數據是否可用。最初不會是 DAS(數據可用性抽樣)——它依賴於每個分片的驗證者集裡誠實的多數來完全下載數據。
這種設計引入了不必要的複雜性、更糟糕的用戶體驗,以及攻擊的載體。在分片之間重組驗證者可能帶來風險。
除非你引入非常嚴格的同步假設,否則也很難保證投票將在單個槽內完成。 Beacon 區塊提議需要收集所有個別委員會的投票,而這可能會有延遲。
原始的數據分片設計,每個分片由委員會投票確認,投票不總是在單個槽內完成,分片可以確認到最多兩個 epoch
DS (Danksharding )則完全不同。驗證者進行 DAS,確認所有的數據都是可用的(不再有單獨的分片委員會)。一個專門的建設者(Builder)用 Beacon 區塊和所有分片的數據一起創建一個大區塊,並進行確認。因此,PBS(提案和建設者分離)對於 DS 保持去中心化是必要的(一起建立那個大區塊是資源密集型的)。
數據可用性抽樣(DAS)
Rollups 會發布大量的數據,但我們不想增加節點負擔來下載所有的數據。這將意味著高資源配置,從而損害了去中心化。
相反,DAS 允許節點(甚至是輕型客戶端)輕鬆、安全地驗證所有的數據是否可用,而不需要下載所有的數據。
- 天真的解決方案——只是從區塊中檢查隨機的一部分。如果沒問題,就簽字完事。但是,如果你錯過了某一筆交易,而這筆交易將掏空你所有的 ETH 給某個壞人呢?這安全(safu)嗎?
- 聰明的解決方案——首先對數據進行擦除編碼(或稱糾刪碼,Erasure code),使用 Reed-Solomon 碼對數據進行擴展。這意味著數據被插值為多項式,然後我們可以在其他地方來對它評估。這有點複雜,我們來分解一下。
別擔心你的數學,這裡是速成班。(我保證這裡的數學不那麼可怕——我不得不看一些可汗學院的影片來寫這些部分,但現在連我都明白了)。
多項式是由有限數量的cxk形式的式子相加的表達式,項數代表最高的那個指數。例如,2x3+6x2+2x-4 是一個三次的多項式,你可以從位於該多項式上的任何 d+1 個坐標來重構任何 d 次的多項式。
現在來看一個具體的例子。下面我們有四個數據塊(d0 到 d3),這些數據塊可以被映射到給定點的多項式 f(X) 的值上。例如:f(0) = d0。然後你找到滿足這些數值的最小次數的多項式。由於這是四個數據塊,我們可以找到三次的多項式。然後,我們可以擴展這個數據,增加四個數值(e0 到 e3),這些數值位於同一個多項式上。
記住那個關鍵的多項式屬性——我們可以從任何四個點重建它,而不僅僅是我們最初的四個數據塊。
回到我們的 DAS。現在我們只需要確定任何 50%(4/8)的擦除編碼數據是可用的。由此,我們可以重建整個數據塊。
因此,攻擊者必須隱藏超過 50% 的數據塊,才能成功地欺騙 DAS 節點,使其認為數據是可用的(其實不是)。
在多次成功的隨機採樣之後,<50% 的數據可用的概率是非常小的。如果我們成功地對擦除編碼的數據進行了 30 次採樣,那麼 <50% 可用的概率是 2-30。
KZG 承諾(KZG Commitment)
好的,所以我們做了一堆隨機樣本,而且都是可用的。但是我們還有一個問題——數據擦除的編碼是否正確?否則,也許區塊製作者在擴展區塊時只是添加了 50% 的垃圾,而我們的採樣是白忙活。在這種情況下,我們實際上將無法重建數據。
通常,我們只是透過使用默克爾根(或稱根雜湊,Merkle root)來承諾大量的數據。這對於證明在一個集合內包含一些數據是有效的。
然而,我們還需要知道,所有的原始數據和擴展數據都位於同一個低次多項式上。默克爾根不能證明這一點。因此,如果你採用這個方案,你還需要欺詐證明,以防止可能的紕漏。
默克爾根允許我們對數據和數據的擴展進行承諾,但它無法告訴我們,它們是否落在同一個低次多項式上
開發者可以從兩個方向解決這個問題:
- Celestia 正在走欺詐證明的路線。這個方案需要有人觀察,如果區塊被錯誤地擦除編碼,他們會提交一個欺詐證明來提醒大家。這需要標準的誠實少數假設(Honest minority assumption)和同步假設(Synchrony assumption)(即,除了有人給我發送欺詐證明,我還需要假設我出於連網狀態,並且會在有限的時間內收到它)。
- 以太坊和 Polygon Avail 正在走一條新路——KZG 承諾(又名凱特承諾,Kate commitments)。這免去誠實少數假設和同步假設,以保證欺詐證明的安全(儘管它們仍然存在並用於重建,我們很快會談到)。
其他方案不是沒有,但較少人追捧。例如,你可以使用 ZK-proofs。不幸的是,它們在計算上是不切實際的(目前來說)。然而,它們有望在未來幾年內得到改善,所以以太坊很可能會在未來轉向 STARKs,因為 KZG 承諾不具有量子抗性。
我覺得你們還沒準備好接受後量子 STARKs,但你們的下一代會愛上它的
回到 KZG 承諾——這些是一種多項式承諾方案。
承諾方案只是一種加密方式,可以使對一些數值的承諾可證。最好的比喻是,把一封信放在一個上了鎖的盒子裡,然後把它遞給別人。這封信一旦放進去就不能改變,但可以用鑰匙打開並證明。你承諾這封信,而鑰匙就是證明。
在我們的案例中,我們將所有的原始數據和擴展數據映射到一個 X,Y 網格上,然後找到符合它們的最小次數的多項式(這個過程被稱為拉格朗日插值〔Lagrange interpolation〕),這個多項式就是證明人要承諾的。
KZG 承諾讓我們可以對數據 di 和數據擴展 ei 進行承諾,並證明它們落在同一個低次多項式上
幾個關鍵點:
- 首先有一個多項式 f(X)。
- 證明人對這個多項式的承諾 C(f) 形成。
.這有賴於橢圓曲線加密法的可信設置,至於如何起作用,可以參考一個來自 Bartek 的很棒的串推。 - 對於這個多項式的任意值 y = f(z),證明人可以計算一個證據 π(f,z)。
- 給出承諾 C(f),證據 π(f,z),任何位置 z,以及在位置 z 的多項式的任意值 y,驗證者可以確認確實 f(z)=y。
.說人話:證明人將這些片段交給任何驗證者,那麼驗證者可以確認某個點的數值(這裡的數值代表背後的數據)正確地位於被提交的多項式上。
.這證明我們對原始數據的擴展是正確的,因為所有的數值都位於同一個多項式上。
.注意:驗證者並不需要用到多項式 f(X)。 - 重要屬性——符合 O(1) 的承諾大小(size),O(1) 的證明大小,以及 O(1) 的驗證時間。即使對證明人來說,承諾和證明的生成也只有 O(d) 的複雜度,其中 d 是多項式的次數。
.說人話:即使 n(X 的值的數量)增加(即,數據集隨著分片大小的增加而增加)——承諾和證明的大小保持不變,驗證需要的工作量是恆定的。
.承諾 C(f) 和證明 π(f,z) 都只是配對友好曲線(Pairing Friendly Curves,這裡用的是 BLS12-381)上的一個橢圓曲線元素。在這種情況下,它們每個只有 48 個字節(真的很小)。
.因此,證明人對大量原始和擴展數據(表示為多項式上的許多值)的承諾仍然只有 48 個字節,而證明也將只有 48 個字節。
.更簡單的說法:擴展性相當好。
這裡,KZG 根(一種多項式承諾)就類似於 Merkle 根(一種向量承諾)。
原始數據是多項式 f(X) 在 f(0) 到 f(3) 位置的值,然後我們透過在 f(4) 到 f(7) 評估多項式來擴展它。所有的點 f(0) 到 f(7) 都保證是在同一個多項式上。
一句話總結:DAS 允許我們檢查擦除編碼的數據是否可用。KZG 承諾向我們證明原始數據被正確擴展,並承諾所有的數據。
好了,所有的代數到此為止了。
KZG 承諾 vs. 欺詐證明
了解了 KZG 的工作原理,讓我們回過頭來比較一下這兩種方法。
KZG 的缺點在於,它不會是後量子安全的(Post-Quantum secure),而且它需要一個可信的初始化,這並不令人擔憂。 STARKs 提供了一個後量子替代方案,而可信初始化(開放參與)只需要一個誠實的參與者。
KZG 的優勢在於,相比欺詐證明設置,它延遲更低(儘管如前所述,GASPER 無論如何不會有快速的最終結果),而且它確保了適當的編碼擦除,而無需引入欺詐證明中固有的同步性和誠實少數假設。
然而,考慮到以太坊仍然會在區塊重建中重新引入這些假設,所以你實際上並沒有移除它們。 DA 層總是需要假設區塊最初可用,但隨後節點需要相互通信以將其重新組合起來。這種重建需要兩個假設:
- 你有足夠多的節點(輕度或重度)對數據進行採樣,這樣他們就有足夠的能力將數據組合起來。這是一個相當弱的、不可避免的誠實少數假設,無需過多擔心。
- 重新引入了同步性假設——節點需要在一定時間內進行通信,才能把它重新組合起來。
以太坊驗證者在 PDS(原生的 danksharding)中完全下載分片數據,而對於 DS,他們只會進行 DAS(下載指定的行和列)。Celestia 將要求驗證者下載整個區塊。
請注意,在這兩種情況下,我們都需要同步假設來進行重建。在區塊只有部分可用的情況下,完整的節點必須與其他節點進行通信以將其組合起來。
如果 Celestia 想從要求驗證者下載整個數據轉變為只進行 DAS,那麼 KZG 的延遲優勢就會顯現出來(儘管這種轉變目前還沒有計劃)。然後,他們也需要實現 KZG 承諾——等待欺詐證明意味著大大增加區塊間隔,而且驗證者為錯誤編碼的區塊投票的危險性也會很高。
我推薦閱讀以下文章來深入了解 KZG 承諾的原理:
- 橢圓曲線密碼學的(相對容易理解的)基礎知識
- 探索橢圓曲線配對 by Vitalik
- KZG 多項式承諾 by Dankrad
- 可信初始化的原理 by Vitalik
協議內的發起者和建設者分離
今天的共識節點(礦工)和合併後的共識節點(驗證者)分任不同角色。他們建立實際的區塊,然後將其提交給其他共識節點,由其進行驗證。礦工透過在上一個區塊之上進行「投票」,而在合併後驗證者將直接對區塊進行有效或無效的投票。
PBS(發起者和建設者分離)將這些分割開來——它明確地創建了一個新的協議內建設者角色。專門的建設者將把區塊放在一起,並為發起者(驗證者)選擇他們的區塊而出價。這可以對抗 MEV 的中心化力量。
回顧 Vitalik 的「終局」——所有的道路都通向中心化的區塊生產,並進行無需信任和去中心化的驗證。 PBS 對此發揚光大。我們需要一個誠實的建設者來服務於網路的有效性和審查阻力(兩個會更有效),但驗證者組需要誠實多數。PBS 使發起者的角色盡可能簡單,以支持驗證者的去中心化。
建設者收到優先費提示,加上他們可以提取的任何 MEV。在一個有效的市場中,有競爭力的建造者會出價到他們能從區塊中提取的全部價值(減去他們的攤銷成本,如昂貴的硬體等)。所有的價值都會滲透到去中心化的驗證者組中——這正是我們想要的。
具體的 PBS 實現仍在討論中,但雙槽 PBS 可能是這樣的:
- 建設者在出價的同時對區塊標頭作出承諾。
- 信標區塊發起者選擇獲勝的區塊頭和投標。發起者無條件地得到中標的報酬,即使建設者未能製造區塊主體。
- 證人委員會(committees of attestors)確認中標的區塊頭
- 建設者披露中標的主體
- 不同的證人委員會選出中標的主體(如果中標的建設者不出示主體,則投票證明其不存在)。
使用標準的 RANDAO 機制從驗證者組中選擇發起者。然後,我們使用一個承諾—披露策略,在區塊頭被委員會確認之前,完整的主體不會被披露。
承諾—披露的方式更有效率(發送數百個完整的區塊主體可能會使 p2p 層的頻寬不堪重負),而且它還能防止 MEV 的竊取。如果建設者提交他們的完整區塊,另一個建設者可以看到它,找出其策略,將其納入,並迅速發布一個更好的區塊。此外,複雜的發起者可以檢測到所使用的 MEV 策略,在不補償建設者的情況下複製它。如果這種偷竊 MEV 的行為成為一股均衡力量,就會激勵建設者和發起者的合併,所以我們用承諾—披露策略來避免這種情況。
在發起者選擇了獲勝的區塊頭後,委員會進行確認,並將其固化在分叉選擇規則中。然後,獲勝的建設者公佈他們獲勝的完整「建設者區塊」主體。如果及時公佈,下一個委員會將對其進行證明。如果他們未能及時公佈,他們仍需向發起者支付全額報酬(並失去了所有的 MEV 和費用)。這種無條件的支付,使得發起者無需對建設者信任。
這種「雙槽」設計的缺點是延遲。合併後的區塊將是固定的 12 秒,所以在沒有引入任何新的假設時,我們需要 24 秒作為完整區塊時間(兩個 12 秒的槽)。 8 秒一個槽(16 秒的區塊時間)似乎是一個安全的妥協,不過研究還在進行。
審查抵抗列表(Censorship Resistance List,crList)
不幸的是,PBS 給了建設者很大的審查交易的能力。也許建設者只是不喜歡你,所以他們忽略了你的交易。也許他們的工作能力很強,以至於其他建設者都放棄了,也可能他們會因為真的不喜歡你而為區塊制定高價。
crLists 可以防止這種情況。具體的實現方式又是一個開放的設計空間,但「混合PBS」似乎是最受歡迎的。建設者指定一個他們在 mempool 中看到的所有符合條件的交易的列表,建設者將被迫接受一攬子交易(除非區塊已滿)。
- 發起者公佈 crList 和 crList 摘要,當中有所有符合條件的交易。
- 建設者創建一個擬議的區塊主體,然後提交一個投標,其中包括 crList 摘要的哈希值,以證明他們已經看過。
- 發起者接受中標者的出價和區塊頭(他們還沒有看到區塊主體)。
- 建設者發布他們的區塊,包括證明他們已經包括了 crList 中的所有交易,或者區塊已滿。否則,該區塊將不會被分叉選擇規則所接受。
- 證人(attestors)檢查已發布的主體的有效性。
這裡仍有一些重要的問題需要解決。例如,有一種主導經濟策略是發起者提交一份空名單。這樣一來,只要出價最高,即使是本該被審查的建設者也能贏得拍賣。有一些方法可以解決這個問題(或者還有其他問題),我只是強調這裡的設計並不是堅如磐石。
2D KZG 策略
我們看到了 KZG 承諾是如何讓我們承諾數據並證明它被正確擴展的。然而,這是對以太坊實際操作的簡化。它不會在一個 KZG 承諾中承諾所有的數據——一個區塊將使用許多 KZG 承諾。
我們已經有了專門的建設者,那麼為什麼不直接讓他們創建一個巨大的 KZG 承諾?問題是,這需要一個強大的超級節點來重構。我們可以接受初始建設的超級節點要求,但我們需要避免對重建作出假設。我們需要普通實體能夠處理重建,所以將 KZG 承諾分成多份就好了。考慮到手頭的數據量,重建甚至可能是相當普遍的,或者說是本設計中的基本假設。
為了使重建更容易,每個區塊將包括編碼進 m 個 KZG 承諾中的 m 個分片數據。如果不聰明點這樣做會導致大量的採樣——你會在每個分片數據塊上進行 DAS,才能確保可用(需要 m*k 個樣本,其中 k 是每個數據塊的樣本數)。
所以,以太坊將使用一個 2D KZG 策略。我們再次使用 Reed-Solomon 代碼,將 m 個承諾擴展到 2m 個承諾。
我們透過擴展額外的 KZG 承諾(這裡是256-511)使其成為一個 2D 策略,這些承諾位於與 0-255 相同的多項式上。現在我們只需在上面的表格上進行 DAS,以確保所有分片數據的可用性。
2D 採樣要求 75% 的數據是可用的(有別於早先提到的 50%),這意味著我們需要抽取一個更多的固定數量的樣本。前面簡單版的 1D 策略需要 30 個樣本,這裡將需要 75 個樣本,以確保重建一個可用區塊的概率一致。
分片 1.0 (對應 1D KZG 承諾策略)只需要 30 個樣本,但你需要對 64 個片進行採樣,完整的檢查需要 1,920 個樣本。每個樣本是 512 B,所以就是:
(512 B x 64 片區 x 30 樣本) / 16 秒 = 60 KB/s 頻寬
現實中,驗證者會隨機選擇,而不是一個人檢查所有片區。
採用 2D KZG 策略的合併塊使得完整的 DA 驗證變得異常輕鬆。只需要從單一合併後的區塊選出 75 個樣本:
(512 B x 1 區塊 x 75 樣本) / 16 秒 = 2.5 KB/s 頻寬
Danksharding
PBS 最初是設計來對沖 MEV 在驗證者組的中心化力量。然而,Dankrad 最近吸取了這種設計的優勢,並想出一個更好的分片方案—— DS(Danksharding)。
DS 利用專門的建設者來實現信標鏈(Beacon Chain)執行區塊和分片之間更緊密的整合。我們現在有一個建設者,他可以創建整個區塊;一個提議者;以及一個進行投票的委員會。如果沒有 PBS,DS 是不可行的——普通的建設者無法擁有巨大帶寬,以滿足包含無數 rollup 數據塊的區塊。
分片 1.0 包括 64 個獨立的委員會和發起人,可以允許每個分片單獨出問題。透過更緊密的整合使我們能夠一次性地確保完整的數據可用(DA)。數據在黑盒中仍然是「分片」的,但從實用的角度來看,分片開始感覺起來更像是大塊的數據,這簡直太好了。
Danksharding——誠實多數驗證
我們來看看驗證者是如何證明數據可信的:
這需要依靠佔多數的誠實驗證者——作為單一的驗證者,我的列和行可用,不足以給我統計上的信心,證明整個區塊可用。我們需要誠實的大多數人,才能下這個結論。去中心化的驗證很重要。
注意這與我們之前討論的 75 個隨機樣本不同。私人隨機抽樣是指低配置的個體將能夠輕鬆地檢查可用性(例如,我可以運行一個 DAS 輕節點並知道區塊是可用的)。然而,驗證者將繼續使用行和列的方法來檢查可用性和引導區塊重建。
Danksharding——重建
只要一個單獨的行或列的 50% 是可用的,那麼它就很容易被採樣驗證者完全重建。當他們重建某行/列中缺失的任何塊時,他們將這些塊重新分配到正交線上(orthogonal line)。這有助於其他驗證者根據需要從他們相交的行和列中重建任何丟失的塊。
這裡重建一個可用區塊的安全假設是:
- 有足夠多的節點執行抽樣請求,以便它們共同擁有足夠的數據來重建該區塊
- 正在廣播他們各自的區塊碎片的節點之間的同步性假設
那麼,多少個節點才夠呢?粗略估計需要 64,000 個單獨的實例(目前為止,已有超過 38 萬個)。這也是一個非常保守的計算,它假設同一驗證者運行的節點沒有交叉(事實遠非如此,因為節點被限制在 32 個 ETH 實例)。如果你的採樣超過 2 行和 2 列,你就會因為交叉而增加集體檢索(collectively retrieve)的機率。這開始呈二次方擴展——如果驗證者正在運行,比如說 10 個或 100 個驗證器,64,000 的要求可能會下降幾個數量級。
如果在線驗證者的數量開始變得非常低,DS 可以被設置為自動減少分片數據塊的數量。因此,安全假設將被降低到一個安全的水平。
Danksharding——私人隨機抽樣的惡意多數安全
我們看到,DS 的驗證是依靠誠實的多數來證明區塊。我作為一個個體,不能透過下載幾個行列來證明一個區塊是可用的。然而,私人隨機抽樣可以在不信任任何人的情況下,給這個保證。這就是前面討論的節點檢查 75 個隨機樣本的情形。
DS 最初不會包括私人隨機抽樣,因為這是在網路方面非常難解決的問題(PSA:也許你可以幫助他們!)。
注意「私有」是很重要的,因為如果攻擊者對你進行了去匿名化處理,他們就能欺騙少量的採樣節點。他們可以只返回你所要求的確切的數據塊,而隱瞞其他的。所以你不會僅從自己的採樣中知道所有的數據都被提供了。
Danksharding——關鍵總結
DS 非常令人興奮,不僅僅是名字起的好。它最終實現了以太坊對統一的結算和 DA 層的願景。信標區塊和分片的這種緊密耦合,能達到以假亂真的不分片效果。
事實上,讓我們定義一下為什麼它甚至被認為是「分片」的。這裡唯一的分片,只是體現在驗證者不負責下載所有數據這一事實,沒有其他了。
所以,如果你現在質疑這是否是真正的分片,你並沒有瘋。這就是為什麼 PDS(我們很快就會討論這個問題)不被認為是「分片」(儘管它的名字裡有「分片」,是的,我知道這很令人困惑)。 PDS 要求每個驗證者完全下載所有的分塊,以證明其可用性。然後,DS 引入了抽樣,所以個別驗證者只下載其中的某些片段。
最小化的分片意味著比分片 1.0 更簡單的設計(所以交貨更快,對吧?)。簡化內容包括:
- 與分片 1.0 規範相比,DS 規範可能少了數百行代碼(客戶端少了數千行)。
- 沒有更多的分片委員會作為基礎設施,委員會只需要對主鏈進行投票。
- 不需要跟蹤單獨的分片數據塊(blob)確認,現在它們都在主鏈中得到確認,或者不被確認。
這樣做的一個很好結果是——數據的合併收費市場。分片 1.0 由不同的發起者做出不同的區塊,會使這一切變得支離破碎。
取消分片委員會也有力地抵制了賄賂現象。DS 驗證者在每個紀元對整個區塊投票一次,所以數據會立即得到整個驗證者組的 1/32 的確認(每個紀元有 32 個名額)。分片 1.0 驗證者也是每紀元投票一次,但每個片區都有自己的委員會需要重組。因此,每個片區只由 1/2048 個驗證者組確認(1/32 分給 64 個片區)。
正如所討論的那樣,與 2D KZG 承諾方案相結合的區塊也使 DAS 的效率大大提高。分片 1.0 需要 60KB/s 的頻寬來檢查所有分片的全部 DA,DS 只需要 2.5KB/s。
DS 還有一種令人興奮的可能性存在——ZK-rollup 和 L1 以太坊執行之間的同步調用。來自分片數據塊的交易可以立即確認並寫入 L1,因為一切都在同一個信標鏈區塊中產生。分片 1.0 會因為單獨的分片確認而消除這種可能性。這就有了令人興奮的設計空間,對共享流動性(例如,dAMM)等事情來說可能是非常有價值的。
Danksharding——在區塊鏈擴展上的制約
模塊化的層可以優雅地擴展——更多的去中心化帶來更多的擴展。這與我們今天看到的情況有根本的不同,向 DA 層添加更多的節點,可以安全地增加數據吞吐量(即有更多的空間允許 rollup)。
區塊鏈的可擴展性仍有限制,但相比今天,我們可以提高好幾個數量級。安全和可擴展的基礎層允許執行被快速擴展。數據存儲和頻寬的改進也將隨著時間的推移提高數據吞吐量。
超過本文所設想的 DA 吞吐量肯定是有可能的,但是很難說這個最大值會落在哪裡。我們沒有一個明確的紅線,但可以列舉支持某些假設開始變得困難的區間。
- 數據存儲——這與 DA 與數據可檢索性有關。共識層的作用不是保證數據可以無限期地被檢索,它的作用是讓數據在足夠長的時間內可用,任何願意下載它的人都可以滿足我們的安全假設。然後,它被轉存到任何地方——這很舒服,因為歷史是 N 個信任假設中的 1 個,而且我們實際上並不是在談論那麼多的數據,那樣大的計劃。不過,隨著吞吐量的增加,可能會進入令人不舒服的區間。
- 驗證者——DAS 需要足夠的節點來共同重建區塊。否則,攻擊者可以在周圍等待,只對他們收到的查詢作出回應。如果提供的這些查詢不足以重建區塊,攻擊者可以扣留其餘的查詢,我們就沒戲了。為了安全地提高吞吐量,我們需要增加更多的 DAS 節點或增加它們的數據頻寬要求。對於這裡討論的吞吐量來說,這並不是一個問題。不過,如果吞吐量在這個設計的基礎上再增加幾個數量級,這可能會讓人感到不舒服。
注意建設者不是瓶頸。你需要為 32MB 的數據快速生成 KZG 證明,所以會希望有一個 GPU 或相當強大的 CPU 加上至少 2.5GBit/s 的頻寬。無論如何,這是一個專門的角色,對他們來說,這是一個可以忽略不計的業務成本。
原生的 danksharding(EIP-4844)
DS 很棒,但我們必須要有耐心。 PDS 是來幫我們渡過難關的——它在一個緊湊的時間表上(以上海硬分叉為目標)實現了必要的向前兼容的步驟,以便在過渡期間提供數量級的擴展。然而,它實際上還沒有實現數據分片(即驗證者需要單獨下載所有的數據)。
今天的 rollup 使用 L1 calldata 進行存儲,它可以在鏈上永存。不過,rollup 只需要在一些較短的時間段內使用 DA,因此,任何感興趣的人都有足夠的時間來下載它。
EIP-4844 介紹了新的攜帶 blob 的交易格式(blob-carrying transaction format),其中 rollup 將用於未來的數據存儲。Blob 攜帶大量的數據(約 125KB),它們比類似數量的 calldata 便宜得多。數據塊(Data blobs)在一個月後將從節點上修剪掉,這就降低了存儲需求。使得有足夠的時間來滿足我們的 DA 安全假設。
對於擴展的背景,目前的以太坊區塊一般是平均約 90 KB(calldata 是其中的約 10 KB)。 PDS 為 blob 釋放了更多的 DA 頻寬(目標~1MB,最大~2MB),因為它們在一個月後會被修剪掉。它們並不會一直給節點造成負擔。
一個 blob 是一個由 4096 個字段元素組成的矢量(或稱向量,Vector),每個字段元素 32 個字節。 PDS 允許每個區塊最多有 16 個 blob,而 DS 會將其提高到 256 個。
PDS DA 頻寬 = 4096 x 32 x 16 = 2 MiB 每區塊, 目標是 1 MiB
DS DA 頻寬= 4096 x 32 x 256 = 32 MiB 每區塊, 目標是 16 MiB
每一步都是數量級的擴展。PDS 仍然需要共識節點來完全下載數據,所以它比較保守。DS 在驗證者之間分配了存儲和傳播數據的負載。
以下是 EIP-4844 在通往 DS 的道路上引入的一些好玩意兒:
- 攜帶 blob 的交易格式數據
- 對 blob 的 KZG 承諾
- DS 所需的所有執行層邏輯
- DS 所需的所有執行/共識交叉驗證邏輯
- 信標區塊驗證和 DAS blob 之間的層分離
- DS 所需的大部分信標區塊邏輯
- 為 blob 提供的自我調整的獨立 gas 價格(多維度 EIP-1559 與指數定價規則)
DS 未來還會加入:
- PBS
- DAS
- 2D KZG 策略
- 託管證明(Proof-of-custody) 或著類似的協議內要求,使每個驗證者驗證每個區塊特定部分分片數據可用性(大約為期一個月)
請注意,這些數據塊(data blob)是作為執行鏈上的一個新交易類型被引入的,但它們不會給執行方帶來額外的負擔。 EVM 只查看附著在數據塊上的承諾。由 EIP-4844 帶來的執行層變化也與 DS 同樣向前兼容,在這頭不需要更多的改變。從 PDS 到 DS 的升級只需要改變共識層。
在 PDS 中,數據塊完全由共識客戶端下載。數據塊現在被引用,但不是完全編碼在信標區塊主體中。與其將全部內容嵌入到主體中,不如將 blob 的內容作為「sidecar」單獨傳播。每個區塊有一個 blob sidecar,在 PDS 中被完全下載,然後 DS 驗證者對其進行 DAS(數據可用性抽樣)。
我們在前面討論瞭如何使用 KZG 多項式承諾對 blob 進行承諾。然而,EIP-4844 沒有直接使用 KZG,而是實現了我們實際使用的東西——它的版本化哈希(versioned hash)。這是一個單一的 0x01 字節(代表版本),後面是 KZG 的 SHA256 哈希值的最後 31 字節。
我們這樣做是為了方便 EVM 的兼容性和向前兼容:
- EVM 兼容性——KZG 承諾是 48 字節,而 EVM 更自然地使用 32 字節的值。
- 前向兼容性——如果我們從 KZG 轉換到其他(如 STARKs 適用於量子抗性),承諾可以繼續保持 32 字節。
多維度的 EIP-1559
PDS 最終創造了一個量身定做的數據層——數據塊將獲得自己獨特的收費市場,有獨立的浮動 gas 價格和限制。因此,即使一些 NFT 項目在 L1 上出售一堆猴子土地,你的 rollup 數據成本也不會上升(儘管證明結算成本會)。這顯示了今天任何 rollup 項目的主要成本是將其數據發佈到 L1(而不是證明)。
Gas 費市場沒有變化,而數據塊作為一個新的市場加入:
Blob 費用是在 gas 裡收取的,但它是一個可變的金額,根據其自身的 EIP-1559 機制進行調整。每個區塊的長期平均 blob 數量應該等於所定目標。
這裡實際上有兩個並行的拍賣——一個用於計算,一個用於 DA。這是高效資源定價的一個巨大進步。
可以看到一些有趣的設計。例如,將目前的 gas 和 blob 定價機制從線性 EIP-1559 改為新的指數 EIP-1559 機制可能是合理的。目前的實施並沒有平均到我們的目標區塊大小。現今的基本費用穩定性很差,導致觀察到的每個區塊的 gas 使用量平均超過目標值約 3%。
第 2 部分 歷史和狀態管理
快速回顧一下基礎概念:
- 歷史——鏈上曾經發生過的一切。你可以直接把它放在硬碟上,因為它不需要快速訪問。這是長期的 N 個誠實假設中的 1 個。
- 狀態——所有當前帳戶餘額、智能合約等的快照。完整的節點(目前)都需要有這個數據,以驗證交易。它對記憶體(RAM)來說太大了,而硬碟又太慢了——它很適合固態硬碟裡。高吞吐量的區塊鏈讓這個狀態迅速膨脹,增長速度遠遠超過我們常人在筆記本電腦上能保持的。如果日常用戶不能保有該狀態,他們就不能完全驗證,去中心化也就無從談起。
簡而言之,這些東西會變得非常大,所以你很難運行一個節點,如果要求節點必須保持這些數據。如果運行一個節點太難,我們普通人就不會去做。這很糟糕,所以我們需要確保這不會發生。
Calldata gas 成本縮減及 calldata 總量限制(EIP-4488)
PDS 是邁向 DS 的一個很好的鋪墊,它滿足了許多最終的要求。在一個合理的時間範圍內實施 PDS,就可以將 DS 的時間表提前。
一個更容易實施的修補是 EIP-4488。它不太優雅,但它還是解決了當前費用的緊急情況。不幸的是,它沒有給出通往 DS 的步驟,所以不可避免地日後還是補上。如果開始覺得 PDS 比我們希望的要慢一些,那麼快速通過 EIP-4488(它只是幾行代碼的修改),然後再在六個月後進入 PDS,可能是有意義的。我們可以自由把握時機。
EIP-4488 有兩個主要組成部分:
- 將 calldata 成本從每字節 16 個 gas 降低到每字節 3 個 gas
- 增加每個區塊 1MB 的 Calldata 限制,加上每個交易的額外 300 字節(理論上最大約 1.4MB 的總量)
需要增加限制以防止最壞的情況發生——一個充滿 calldata 的區塊將達到 18MB,這遠遠超出了以太坊可以處理的範圍。 EIP-4488 增加了以太坊的平均數據容量,但由於這個 calldata 限制(3000 萬 gas/16 gas 每 calldata 字節 = 1.875MB),其突發數據容量實際上會略有下降。
EIP-4488 的持續負載要比 PDS 高得多,因為這仍然是 calldata vs. 數據塊(一個月後可以被修剪掉)。有了 EIP-4488 ,增速將有意義地上升,但也會帶來運行節點的瓶頸。即使 EIP-4444 與 EIP-4488 同步實施,也只是在一年後減少運行有效負載歷史(execution payload history)。 PDS 的較低的持續負載顯然是更可取的。
在執行客戶中限定歷史數據(EIP-4444)
EIP-4444 允許客戶選擇本地修剪超過一年的歷史數據(包括 header, body, 和 receipt)。它規定客戶端停止在 p2p 層提供這種修剪後的歷史數據。修剪歷史數據使客戶可以減少用戶的磁碟存儲需求(目前有數百 GB,而且還在增加)。
這件事本來就很重要,但如果 EIP-4488 被實施,這基本上是強制性的(因為它大大增加了歷史數據)。我們希望這能在相對較短的時間內完成。最終某種形式的歷史過期是需要的,所以現在是處理它的一個好時機。
鏈的完全同步需要歷史記錄,但是對於驗證新的區塊是不需要的(只需要狀態)。因此,一旦客戶端同步到鏈的頂端,歷史數據只有在通過 JSON-RPC 明確請求或某個點試圖同步鏈的時候才會被檢索。隨著 EIP-4444 的實施,我們需要為這些找到替代的解決方案。
客戶端將無法像今天一樣使用 devp2p 進行「完全同步」——而是從一個弱主觀檢查點進行「檢查點同步」(checkpoint sync),他們將把這個檢查點視為創世區塊。
請注意,弱主觀性(weak subjectivity)不會是一個額外的假設——這是轉向 PoS 必然會有的。由於存在遠程攻擊的可能性,這就要求使用有效的弱主觀性檢查點來進行同步。這裡的假設是,客戶不會從一個無效的或舊的弱主觀性檢查點進行同步。這個檢查點必須在我們開始修剪歷史數據的時期內(這裡是一年內),否則 p2p 層將無法提供所需的數據。
隨著越來越多的客戶採用輕量級同步策略,這也將減少網路的頻寬使用。
恢復歷史數據
EIP-4444 將在一年後修剪歷史數據聽起來不錯,而 PDS 修剪 blob 的速度更快(大約一個月後)。這些都是必要動作,因為我們不能要求節點存儲所有數據並保持去中心化。
- EIP-4488——長期可能需要約 1MB 每個插槽,每年增加約 2.5TB 存儲量
- PDS——目標是每個插槽約 1MB,每年增加約 2.5TB 的存儲空間
- DS——目標是每個插槽約 16MB,每年增加約 40TB 的存儲空間
但這些數據去哪裡了?難道我們還需要它們嗎?是的,但請注意,丟失歷史數據對協議來說不是一個風險——只是對個別應用程式來說是。所以以太坊核心協議的工作,不應該包括永久維護所有這些達成共識的數據。
那麼,誰來儲存這些數據呢?這裡有一些潛在的貢獻者:
- 個人和機構志願者
- 區塊瀏覽器(如 etherscan.io)、API 供應商和其他數據服務
- 第三方索引協議(如 TheGraph)可以創建激勵性的市場,客戶向服務器付費以獲得帶有 Merkle 證明的歷史數據
- 門戶網路(Portal Network,目前正在開發中)中的客戶可以存儲鏈歷史的隨機部分,而門戶網路會自動將數據請求引導到擁有這些數據的節點上
- BitTorrent,例如,自動生成並分發一個 7GB 的文件,其中包含每天的區塊的 blob 數據
- 特定的應用程式協議(如 rollup)可以要求其節點存儲與他們的應用程式相關的歷史部分
長期數據存儲問題是一個相對容易的問題,因為它是 N 個信任假設之一,正如我們之前討論的那樣。這個問題距離成為區塊鏈可擴展性的最終限制還有很多年。
弱無狀態性(Weak Statelessness)
好了,我們已經很好地掌握了管理歷史的方法,但是狀態呢?這實際上是目前提高以太坊 TPS 的主要瓶頸。
完整的節點取前狀態根(pre-state root),執行一個區塊中的所有交易,並檢查後狀態根(post-state root)是否與他們在區塊中提供的內容相符。為了知道這些交易是否有效,他們目前需要對手上的狀態進行驗證。
進入無狀態性——不需要手頭的狀態來發揮它的角色作用。以太坊正朝著「弱無狀態」努力,這意味著驗證區塊不需要狀態,但構建區塊時需要。驗證成為一個純粹的功能——給我一個完全隔離的區塊,我可以告訴你它是否有效。基本上像這樣:
由於 PBS 的原因,建設者仍然需要狀態,這是可以接受的——反正他們會是更中心化的高配置實體。我們的重點放在驗證者的去中心化上。弱無狀態性給建設者帶來了稍多一點的工作,而驗證者的工作少了非常多。非常划算。
我們用見證者(witnesses)來實現這種神奇的無狀態執行。見證者是正確狀態訪問的證明,建設者將開始在每個區塊中包括這些證明。驗證一個區塊實際上不需要整個狀態——你只需要該區塊中的交易所讀取或影響的狀態。建設者將開始在一個給定的區塊中包括受交易影響的狀態片段,他們將用證人來證明他們正確地訪問了這些狀態。
讓我們來舉個例子。 Alice 想向 Bob 發送 1 個 ETH。為了驗證這個交易的區塊,我需要知道:
- 在交易之前 – Alice 有 1 個 ETH
- Alice 的公鑰 – 所以我可以知道簽名是正確的
- Alice 的 nonce 碼 – 所以我可以知道交易是按照正確的順序發送的
- 執行交易後,Bob 多了 1 個 ETH,Alice 少了 1 個 ETH
在一個弱無狀態的世界裡,建設者將上述見證數據添加到區塊中並證明其準確性。驗證者收到區塊,執行它,並決定它是否有效。這就 ok 了。
從驗證者的角度來看,這裡有一些影響:
- 保持狀態所需的巨大的 SSD 需求消失了——這是目前擴展的關鍵瓶頸。
- 頻寬要求會增加一些,因為你現在也在下載見證數據和證明。這是 Merkle-Patricia 樹的一個瓶頸,但問題不大,不是 Verkle Tries 遇到的那種瓶頸。
- 你仍然執行交易來完全驗證。無狀態承認了一個事實,那就是目前這並不是擴展以太坊的瓶頸。
弱無狀態也允許以太坊放鬆對其執行吞吐量的自我限制,狀態膨脹不再是一個緊迫的問題。將 gas 限制提高到 3 倍可能是合理的。
在這一點上,大多數用戶的執行將在 L2 上進行,但更高的 L1 吞吐量即使對他們來說也是有益的。 Rollup 依靠以太坊進行 DA(發佈到分片)和結算(需要 L1 執行)。隨著以太坊擴展其 DA 層,發布證明的攤銷成本可能佔據 rollup 成本的更大份額(特別是對於 ZK-rollup)。
Verkle Tries(Verkle 嘗試)
我們有意跳過了這些證人如何工作。以太坊目前使用 Merkle-Patricia 樹來存儲狀態,但所需的 Merkle 證明對這些證人來說太大,並不可行。
以太坊將轉向 Verkle tries 來存儲狀態。 Verkle 證明的效率要高得多,所以它們可以作為可行的證人來實現弱無狀態。
首先讓我們回顧一下 Merkle 樹是什麼樣子的。每筆交易開始時都有哈希值——底部的這些哈希值被稱為「葉子」(leaf)。所有的哈希值都被稱為「節點」(node),它們是下面兩個子節點的哈希值。最終產生的哈希值是「Merkle 根」。
這個數據結構非常有幫助,它可以證明交易的完整性,而不需要下載整個樹。例如,如果你想驗證交易 H4 被包含,你需要 Merkle 證明中的 H12、H3 和 H5678。我們有來自區塊頭的 H12345678。因此,一個輕量級的客戶端可以向一個完整的節點索取這些哈希值,然後根據樹中的路線將它們散列(hash)在一起。如果結果是 H12345678,那麼我們就成功證明了 H4 在樹上。
不過樹越深,到底部的路線就越長,因此你需要更多的項目(item)來證明。因此,淺而寬的樹會更適合做高效的證明。
問題是,如果你想透過在每個節點下添加更多的子節點來使 Merkle 樹變得更寬,那將是非常低效的。你需要把所有同級節點的哈希值散列在一起,才能摸到整顆樹,所以你需要為 Merkle 證明接收更多的同級節點的哈希值。這將使證明的規模變得巨大。
這就是高效向量承諾的作用。請注意,Merkle 樹中使用的哈希值實際上是向量承諾——它們只是一些糟糕的承諾,只能有效地承諾兩個元素。所以我們想要向量承諾,我們不需要接收所有的同級節點來驗證它。一旦我們有了這一點,我們就可以使樹更寬,並減少其深度。這就是我們如何獲得有效率的證明大小(size)——減少需要提供的訊息量。
Verkle trie 類似於 Merkle 樹,但是它使用高效的向量承諾(因此被稱為「Verkle」)而不是簡單的哈希來承諾其子代(children)。因此,基本的想法是,每個節點可以擁有許多子節點,但我不需要所有的子節點來驗證證明。無論寬度如何,這都是一個恆定大小的證明。
實際上,我們之前已經介紹了這個可能性的一個很好的例子——KZG 承諾也可以作為向量承諾使用。事實上,這就是以太坊開發者最初計劃在這裡使用的東西。他們後來轉向了 Pedersen 承諾,以完成類似的作用。它將基於一個橢圓曲線(這裡指的是 Bandersnatch),承諾 256 個值(比兩個好得多!)。
那麼,為什麼不建立一個深度為 1 的樹,而且要盡可能寬?這對驗證者來說是件好事,因為他現在有了一個超級緊湊的證明。但是有一個實際的權衡,即驗證者需要能夠計算這個證明,而它越寬就越難。因此,Verkle tries 將位於 1~256 個值寬度的兩個極端之間。
狀態過期
弱無狀態從驗證者中移除狀態膨脹約束,但狀態並不會神奇地消失。交易的成本是有上限的,但它們透過增加狀態給網路帶來了永久的稅收。狀態的增長仍然是對網路的一種永久性拖累。我們需要做些什麼來解決這個根本問題。
這就是我們需要狀態過期的原因。長期不活動的狀態(比如一年或兩年)會被砍掉,即使是區塊建設者本來應包括的東西。活躍的用戶不會注意到任何事情變化,而我們可以丟棄不再需要的沉重狀態。
如果你需要恢復過期的狀態,你只需要出示一個證明並重新激活它。這又回到了 N 個存儲假設之一。只要有人仍然擁有完整的歷史(區塊瀏覽器等等),你就可以從他們那裡得到你需要的東西。
弱無狀態性將削弱基礎層對狀態過期的直接需求,但從長遠來看,特別是隨著 L1 吞吐量的增加,這是很好的。對於高吞吐量的 rollup,這將是一個更有用的工具。 L2 狀態將以更高的速度增長,以至於它甚至會拖累高配置建設者。
第3部分 一切都是 MEV 的鍋
PBS 是安全實現 DS(Danksharding) 的必要條件,但請記住它最初的設計其實是為了對抗 MEV 的中心化力量。你會注意到今天以太坊研究中反復出現的一個趨勢——MEV 現在是加密貨幣經濟學的前沿和中心。
在設計區塊鏈時,考慮到 MEV 是維護安全和去中心化的關鍵。基本的協議層面的方法是:
- 盡可能地減輕有害的 MEV(例如,單槽拍板〔finality〕,單一秘密領袖選擇)
- 將其餘部分民主化(例如,MEV-Boost、PBS、MEV smoothing)
剩餘的部分必須很容易被捕獲並在驗證者中傳播。否則,由於無法與復雜的搜索者競爭,它將使驗證者組走向中心化。合併後,MEV 佔驗證者獎勵的比例會高得多,這就加劇了這種情況(質押發行量遠低於給予礦工的通貨膨脹)。這一點是不能忽視的。
如今的 MEV 供應鏈
今天的事件順序長這個樣子:
礦池在這裡發揮了建設者的作用。 MEV 搜索者透過 Flashbots 將一捆捆交易(連同各自的出價)轉交給礦池。礦池運營者匯總出一個完整的區塊,並將區塊頭傳遞給各個礦工。礦工用 PoW 來證明區塊,在分叉選擇規則中給予其權重。
Flashbots 的出現是為了防止整個堆棧的垂直整合 – 這將為審查和其他討厭的外部因素打開大門。當 Flashbots 誕生時,礦池已經開始與交易公司達成獨家交易,以提取 MEV。但是,Flashbots 給了他們一個簡單的方法來聚合 MEV 競價,避免垂直整合(透過實施 MEV-geth)。
在合併之後,礦池會消失,我們讓普通的家庭驗證者也能夠相對容易地參與。這需要有人承擔專業的建設者角色,家庭驗證者可能並不像擁有高額工資的對沖基金那樣擅長捕捉 MEV。如果不加以控制,普通人無法在競爭中存活,這將使驗證者組走向中心化。如果結構合理,該協議可以將 MEV 收入轉用於日常驗證者的質押收益。
MEV-Boost
不幸的是,協議內的 PBS 在合併時根本沒有準備好。Flashbots 再次提供了一個救急解決方案——MEV-Boost。
合併後的驗證者默認直接從公共 mempool 接收交易到他們的執行客戶端。他們可以將這些交易打包,交給共識客戶端,並將其廣播到網路上。 (如果你需要復習一下以太坊的共識和執行客戶端是如何一起工作的,我在第四部分有過介紹)。
但是你的媽媽和大眾驗證者不知道如何提取 MEV,就像我們討論的那樣,所以 Flashbots 正在提供一個替代方案。 MEV-boost 將接入你的共識客戶端,允許你外包專門的區塊建造。重要的是,你仍然保留了使用你自己的執行客戶端的權利。
MEV 搜索者將繼續發揮它們今天的作用。他們將運行特定的策略(統計套利、原子套利、三明治策略等),並為他們的打包塊出價,使其被包括在內。然後建設者將他們看到的所有打包塊以及任何私人訂單流(例如,來自 Flashbots Protect)匯總到最佳的完整塊中。建設者透過運行在 MEV-Boost 上的中繼,只把區塊頭傳遞給驗證者。Flashbots 打算運行中繼器和建設者,併計劃隨著時間的推移進行去中心化,但對其他建設者發放白名單的過程可能會很慢。
MEV-Boost 要求驗證者信任中繼,也就是共識客戶端收到頭部訊息、簽署它,之後區塊主體才會顯現。中繼的目的是向發起者證明主體是有效的和存在的,這樣驗證者就不必直接信任建設者。
當協議內的 PBS 準備好了,它就會把 MEV-Boost 在這期間提供的東西匯總起來。 PBS 提供了同樣的權力分離,使建設者更容易去中心化,並使發起者人無需信任任何人。
委員會驅動的 MEV Smoothing
PBS 還使得一個很酷的想法成為可能——委員會驅動的 MEV Smoothing(MEV 平滑化)。
我們看到提取 MEV 的能力是對驗證者組的一股中心化力量,但分配也是如此。每個區塊的 MEV 獎勵的高變異性鼓勵驗證者的組隊,以便隨著時間的推移使回報平滑(正如我們今天看到的礦池,儘管作用程度不同)。
默認情況是實際的區塊發起者獲得來自建設者的全部付款。而 MEV 平滑化將從這筆錢中拿一部分給許多驗證者。一個驗證者委員會將檢查提交的區塊,並證明這確實是出價最高的區塊。如果一切正常,該區塊進入流程,獎勵將在委員會和發起者之間分配。
這也解決了另一個問題——帶外的賄賂(out-of-band bribe)。發起人可能會被激勵提交一個次優的區塊,並接受直接的帶外賄賂,以隱藏他們從某人那收到的付款。這種證明使發起人受到制約。
協議內 PBS 是實現 MEV 平滑的先決條件。你需要對建設者市場和正在提交的明確的出價有一個認識。這裡面有幾個開放的研究問題,但不妨礙這是一個令人興奮的提議,對確保去中心化的驗證者非常關鍵。
單槽拍板(Single-slot Finality)
快速得到最終結果是很好的。等待 15 分鐘對於用戶體驗或跨鏈溝通來說並不理想。更重要的是,這是一個 MEV 重組問題。
後以太坊合併時代,會出現比現在更強大的確認——數以千計的驗證者證明每個區塊,而不是現在這樣,礦工互相競爭,並可能在同一區塊高度挖礦,而不投票。這將使重組變得相當困難。然而,這仍然不是真正的最終拍板結果。如果最後一個區塊有一些誘人的 MEV,可能會誘使驗證者試圖重新組鏈,並吃下獎勵。
單槽拍板消除了這種威脅。逆轉一個已完成的區塊需要至少三分之一的驗證者,而且他們的股份會立即被削減(數百萬的 ETH)。
我不會在這裡對潛在的機制進行過多的討論。單槽拍板在以太坊的路線圖中是非常遙遠的部分,它是一個開放的設計空間。
在今天的共識協議中(沒有單槽拍板),以太坊只需要 1/32 的驗證者來證明每個槽(目前超過 38 萬的驗證者中的 12,000 個)。在單槽中用 BLS 簽名聚合將這種投票擴展到全部驗證者組,需要更多的工作。這會把數十萬張投票壓縮到一個驗證中。
Vitalik 列出了一些有趣的解決方案,這裡查看。
單一秘密領袖選擇(Single Secret Leader Election)
SSLE 旨在修補合併後我們將面臨的另一個 MEV 攻擊載體。
信標鏈驗證者名單和即將到來的領袖選擇名單是公開的,而且相當容易對他們進行去匿名化處理並映射其 IP 地址。你應該很容易發現這裡的問題。
更複雜的驗證者可以使用一些技巧來更好地隱藏自己,但普通驗證者將特別容易被挖出,隨後被 DDOSd。這很容易被 MEV 所利用。
假設你是 n 區的發起者,而我是 n+1 區的發起者。如果我知道你的 IP 地址,我可以很容易對你進行 DDOS,使你因超時而無法生成你的區塊。現在我就可以捕獲兩個區塊的 MEV,獲得雙倍的回報。 EIP-1559 的彈性區塊大小(每個區塊的最大 gas 是目標大小的兩倍)加劇了這種情況,所以我可以把本應是兩個區塊的交易塞進我的單個區塊,而這個區塊現在是兩倍長。
簡而言之,家庭驗證者可以直接放棄驗證,因為他們會被攻擊。 SSLE 將使得除了發起者之外沒有人知道什麼時候輪到他們,從而防止了這種攻擊。這不會在合併時就生效,但希望它能儘早實施。
第4部分 合併的秘密
好吧,其實上面我一直在開玩笑。我真的認為(希望)合併相對很快就會來到。
這麼令人激動的事情,我覺得我得站出來喊兩句。你的以太坊速成課程到此結束。
合併後的客戶端
今天,你運行一個單體客戶端(如 Go Ethereum、Nethermind 等)來處理一切。具體來說,全節點做以下兩件事:
- 執行——執行區塊中的每個交易,以確保有效性。使用前狀態根,執行各個操作,並檢查產生的後狀態根是否正確
- 共識——驗證你在最長的(最高 PoW)鏈上,完成了最多的工作(即中本聰共識)。
兩者是不可分割的,因為完整的節點不僅遵循最長鏈,還要遵循最長的有效鏈。這就是為什麼他們是全節點而不是輕節點。即使在 51% 的攻擊下,全節點也不會接受無效的交易。
信標鏈目前只運行共識,給 PoS 進行試運行,但沒有執行。最終,終端總難度(terminal total difficulty)將被決定,屆時,目前的以太坊執行區塊將合併到信標鏈區塊中,合併成一條鏈:
然而,完整的節點將在黑盒下運行兩個獨立的客戶端,並進行互操作。
- 執行客戶端(f.k.a. Eth1 客戶端)——當前 Eth 1.0 客戶端繼續處理執行。他們處理區塊,維護 mempools,並管理和同步狀態。 PoW 則被棄用。
- 共識客戶端(f.k.a. Eth2 客戶端)——當前的信標鏈客戶端繼續處理 PoS 共識。他們跟蹤鏈頭,對區塊進行通信和證明,並接收驗證者的獎勵。
客戶端收到信標鏈的區塊,執行客戶端運行交易,然後共識客戶端將遵循該鏈,如果一切檢查無誤。你將能夠混合和匹配你所選擇的執行和共識客戶端,所有的客戶端都支持互操作。一個新的引擎 API 將被引入,用於客戶端之間的通信:
或者像這樣:
合併後的共識
今天的中本聰共識很簡單。礦工創建新的區塊,並將其添加到觀察到的最長的有效鏈上。
合併後的以太坊轉向 GASPER ——結合 Casper FFG(拍板工具)加上 LMD GHOST(分叉選擇規則)來達成共識。一句話——這是一個偏向活躍度的共識(liveness favoring consensus),而不是偏向安全性的。
區別在於,支持安全的共識算法(例如 Tendermint)在無法獲得必要的票數(這裡是指驗證者組的 ⅔)時就會停止。支持活躍度的鏈(如 PoW + Nakamoto Consensus)無論如何都會繼續建立一個樂觀的帳本,但如果沒有足夠的票數,它們就無法完成拍板。今天的比特幣和以太坊永遠不會達到最終拍板——你只是假設在足夠多的區塊之後,重構不會再次發生。
然而,以太坊也會在有足夠票數的情況下通過定期檢查點來實現最終拍板。每個 32 個 ETH 的實例都是一個獨立的驗證者,目前已經有超過 38 萬個信標鏈驗證者。總的紀元由 32 個槽組成,所有驗證者被分割開來,在一個給定的紀元內對一個槽進行驗證(意味著每個槽有約 12,000 個驗證者)。分叉選擇規則 LMD Ghost 隨後根據這些證明來確定當前鏈頭。一個新的區塊在每個槽之後被添加(12 秒),所以總的紀元是 6.4 分鐘。一般在兩個紀元後,最終結果會以必要的票數實現(所以是每 64 個槽,儘管它可能需要多達 95 個)。
總結時刻
所有的道路都通向中心化區塊生產、去中心化的無需信任區塊驗證和抗審查這一終局。以太坊的路線圖突出了這一願景。
以太坊的目標是成為終極的統一化 DA 和結算層——大規模的去中心化和安全性為基礎,上面是可擴展的計算。這是將密碼學假設濃縮到一個強大的層。一個統一的模塊化(或者現在是分散的?)的、包括執行的基礎層,同時能捕捉到整個 L1 設計的最高價值——導致貨幣溢價和經濟安全,正如我最近報導的(現在公開發布)。
我希望你對以太坊的研究是如何交織在一起的有了更清晰的認識。這是非常前沿的,所有的部件都在變化當中,要最終弄清楚這一宏大藍圖並不容易。你需要時刻跟進。
最終,這一切都回到了那個單一的願景。以太坊為我們提供了一條通往大規模可擴展的令人信服的道路,同時又堅守了我們在這個領域非常關心的那些價值。
特別感謝 Dankrad Feist 的審閱和見解。