原文作者: Jon Charbonneau
原文標題: The Hitchhiker's Guide to Ethereum
核心要點:
以太坊是唯一一個主要協議,意在建立可擴展的統一的結算和數據可用性層
在利用以太坊的安全性的同時,rollup 擴大了計算量
所有的道路都通向中心化區塊生產、去中心化的無需信任區塊驗證和抗審查這一終局。
諸如發起者—建設者分離和弱無狀態等創新,帶來了權力分離(建設和驗證),可以在實現可擴展性的同時,不犧牲安全性或去中心化目標
MEV 現在是前沿和中心——許多設計都是為了減輕其危害和防止其中心化傾向而計劃的
目錄
目錄
目錄
第1部分通往Danksharding 之路
原始的數據分片設計——獨立分片提議
數據可用性抽樣(DAS)
KZG 承諾(KZG Commitment)
KZG 承諾vs. 欺詐證明
協議內的發起者和建設者分離
2D KZG 策略
2D KZG 策略
Danksharding
Danksharding——重建
Danksharding——重建
Danksharding——私人隨機抽樣的惡意多數安全
Danksharding——關鍵總結
原生的danksharding(EIP-4844)
原生的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 有一個著名的“終局”說,不知道你有沒有聽過。他承認以太坊擴展需要一些中心化成份。在區塊鏈中,代表中心化的C 字母是可怕的,但又是一個現實。我們只是需要用去中心化和無需信任的驗證來控制這種權力。這裡並沒有妥協。
專業人士將為L1 及其之上添磚加瓦。以太坊通過簡單的去中心化驗證保持了令人難以置信的安全性,而rollup 則從L1 繼承其安全性。然後,以太坊提供結算和數據的可用性,使rollup 的規模得以擴大。這裡所有的研究最終都是為了優化這兩個角色,同時,使區塊鏈的完全驗證比以往更加容易。
下面的術語大概會重複出現個七八五十九次:
DA – Data Availability 數據可用性
DAS – Data Availability Sampling 數據可用性抽樣
PDS – Proto-danksharding 原生的danksharding
PDS – Proto-danksharding 原生的danksharding
DS – Danksharding 一個以太坊的分片設計
PoW – Proof of Work 工作量證明
PoS – Proof of Stake質押證明
第1部分通往Danksharding 之路
希望你已經聽說,以太坊已經轉向以rollup 為中心的路線圖。不再有更多的執行分片——以太坊將轉而優化對數據要求較高的rollup。這是通過數據分片(有點算Ethereum的計劃)或更大的區塊(Celestia 的計劃)實現的。
共識層不解釋分片的數據。它只有一項工作——確保數據是可用的。
我將假設你熟悉一些基本概念,如rollup,欺詐和ZK 證明,以及為什麼DA(數據可用性)很重要。如果你不熟悉或者只是需要復習一下,可以看Can 最近的Celestia 報告。
原始的數據分片設計——獨立分片提議
這裡描述的設計已經被廢止了,但作為背景值得了解一下。為了簡單起見,我把它稱為“分片1.0”。
64個分片區中的每一個都有單獨的提案和委員會從驗證者集合中輪流通過。他們單獨驗證他們的分片的數據是否可用。最初不會是DAS(數據可用性抽樣)——它依賴於每個分片的驗證者集裡誠實的多數來完全下載數據。
這種設計引入了不必要的複雜性、更糟糕的用戶體驗,以及攻擊的載體。在分片之間重組驗證者可能帶來風險。
除非你引入非常嚴格的同步假設,否則也很難保証投票將在單個槽內完成。 Beacon 區塊提議需要收集所有個別委員會的投票,而這可能會有延遲。
(原始的數據分片設計,每個分片由委員會投票確認,投票不總是在單個槽內完成,分片可以確認到最多兩個epoch)
DS (Danksharding )則完全不同。驗證者進行DAS,確認所有的數據都是可用的(不再有單獨的分片委員會)。一個專門的建設者(Builder)用Beacon 區塊和所有分片的數據一起創建一個大區塊,並進行確認。因此,PBS(提案和建設者分離)對於DS 保持去中心化是必要的(一起建立那個大區塊是資源密集型的)。
數據可用性抽樣(DAS)
Rollups 會發布大量的數據,但我們不想增加節點負擔來下載所有的數據。這將意味著高資源配置,從而損害了去中心化。
相反,DAS 允許節點(甚至是輕型客戶端)輕鬆、安全地驗證所有的數據是否可用,而不需要下載所有的數據。
天真的解決方案——只是從區塊中檢查隨機的一部分。如果沒問題,就簽字完事。但是,如果你錯過了某一筆交易,而這筆交易將掏空你所有的ETH 給某個壞人呢?這能安全(safu)嗎。
聰明的解決方案——首先對數據進行擦除編碼。使用Reed-Solomon 碼對數據進行擴展。這意味著數據被插值為多項式,然後我們可以在其他地方來對它評估。這有點複雜,我們來分解一下。
別擔心你的數學,這裡是速成班。 (我保證這裡的數學不那麼可怕——我不得不看一些可汗學院的視頻來寫這些部分,但現在連我都明白了)。
多項式是由有限數量的形式的式子相加的表達式。項數代表最高的那個指數。例如, + + - 4 是一個三次的多項式。你可以從位於該多項式上的任何個坐標來重構任何次的多項式。
現在來看一個具體的例子。下面我們有四個數據塊(到)。這些數據塊可以被映射到給定點的多項式的值上。例如,=。然後你找到滿足這些數值的最小次數的多項式。由於這是四個數據塊,我們可以找到三次的多項式。然後,我們可以擴展這個數據,增加四個數值( 到),這些數值位於同一個多項式上。
記住那個關鍵的多項式屬性——我們可以從任何四個點重建它,而不僅僅是我們最初的四個數據塊。
回到我們的DAS。現在我們只需要確定任何50%(4/8)的擦除編碼數據是可用的。由此,我們可以重建整個數據塊。
因此,攻擊者必須隱藏超過50%的數據塊,才能成功地欺騙DAS節點,使其認為數據是可用的(其實不是)。
在多次成功的隨機採樣之後,<50% 的數據可用的概率是非常小的。如果我們成功地對擦除編碼的數據進行了30次採樣,那麼<50%可用的概率是。
KZG 承諾(KZG Commitment)
好的,所以我們做了一堆隨機樣本,而且都是可用的。但是我們還有一個問題——數據擦除的編碼是否正確?否則,也許區塊製作者在擴展區塊時只是添加了50%的垃圾,而我們的採樣是白忙活。在這種情況下,我們實際上將無法重建數據。
通常,我們只是通過使用默克爾根(Merkle root)來承諾大量的數據。這對於證明在一個集合內包含一些數據是有效的。
然而,我們還需要知道,所有的原始數據和擴展數據都位於同一個低次多項式上。默克爾根不能證明這一點。因此,如果你採用這個方案,你還需要欺詐證明,以防止可能的紕漏。
(默克爾根允許我們對數據和數據的擴展進行承諾,但它無法告訴我們,它們是否落在同一個低次多項式上)
開發者可以從兩個方向解決這個問題:
Celestia 正在走欺詐證明的路線。這個方案需要有人觀察,如果區塊被錯誤地擦除編碼,他們會提交一個欺詐證明來提醒大家。這需要標準的誠實少數假設和同步假設(即,除了有人給我發送欺詐證明,我還需要假設我出於連網狀態,並且會在有限的時間內收到它)。
以太坊和Polygon Avail 正在走一條新路——KZG 承諾(又名凱特承諾Kate commitments )。這免去誠實少數假設和同步假設,以保證欺詐證明的安全(儘管它們仍然存在並用於重建,我們很快會談到)。
其他方案不是沒有,但較少人追捧。例如,你可以使用ZK-proofs。不幸的是,它們在計算上是不切實際的(目前來說)。然而,它們有望在未來幾年內得到改善,所以以太坊很可能會在未來轉向STARKs,因為KZG 承諾不具有量子抗性。
(我覺得你們還沒準備好接受後量子STARKs,但你們的下一代會愛上它的)
回到KZG 承諾——這些是一種多項式承諾方案。
承諾方案只是一種加密方式,可以使對一些數值的承諾可證。最好的比喻是,把一封信放在一個上了鎖的盒子裡,然後把它遞給別人。這封信一旦放進去就不能改變,但可以用鑰匙打開並證明。你承諾這封信,而鑰匙就是證明。
在我們的案例中,我們將所有的原始數據和擴展數據映射到一個X,Y 網格上,然後找到符合它們的最小次數的多項式(這個過程被稱為拉格朗日插值)。這個多項式就是證明人要承諾的。
(KZG 承諾讓我們可以對數據和數據擴展進行承諾,並證明它們落在同一個低次多項式上)
幾個關鍵點:
首先有一個多項式
證明人對這個多項式的承諾形成
這有賴於橢圓曲線加密法的可信設置。至於如何起作用,可以參考一個來自Bartek的很棒的串推。
對於這個多項式的任意值,證明人可以計算一個證據
說人話:證明人將這些片段交給任何驗證者,那麼驗證者可以確認某個點的數值(這裡的數值代表背後的數據)正確地位於被提交的多項式上。
這證明我們對原始數據的擴展是正確的,因為所有的數值都位於同一個多項式上
注意:驗證者並不需要用到多項式
重要屬性——符合的承諾大小(size), 的證明大小,以及的驗證時間。即使對證明人來說,承諾和證明的生成也只有的複雜度,其中是多項式的次數。
說人話:即使(的值的數量)增加(即,數據集隨著分片大小的增加而增加)——承諾和證明的大小保持不變,驗證需要的工作量是恆定的。
承諾和證明都只是配對友好曲線(Pairing Friendly Curves,這裡用的是BLS12-381)上的一個橢圓曲線元素。在這種情況下,它們每個只有48個字節(真的很小)。
因此,證明人對大量原始和擴展數據(表示為多項式上的許多值)的承諾仍然只有48個字節,而證明也將只有48個字節
更簡單的說法:擴展性相當好
這裡,KZG 根(一種多項式承諾)就類似於Merkle 根(一種向量承諾)。
原始數據是多項式在到位置的值,然後我們通過在到評估多項式來擴展它。所有的點到都保證是在同一個多項式上。
一句話總結:DAS 允許我們檢查擦除編碼的數據是否可用。 KZG 承諾向我們證明原始數據被正確擴展,並承諾所有的數據。
好了,所有的代數到此為止了。
KZG 承諾vs. 欺詐證明
了解了KZG 的工作原理,讓我們回過頭來比較一下這兩種方法。
KZG 的缺點在於,它不會是後量子安全的,而且它需要一個可信的初始化。這並不令人擔憂。 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 策略
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個片進行採樣,完整的檢查需要1920個樣本。每個樣本是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 was initially designed to blunt the centralizing forces of MEV on the validator set. However, Dankrad recently took advantage of that design realizing that it unlocked a far better sharding construct – DS.
DS leverages the specialized builder to create a tighter integration of the Beacon Chain execution block and shards. We now have one builder creating the entire block together, one proposer, and one committee voting on it at a time. DS would be infeasible without PBS – regular validators couldn’t handle the massive bandwidth of a block full of rollups’ data blobs:
PBS 最初是設計來對沖MEV 在驗證者組的中心化力量。然而,Dankrad 最近吸取了這種設計的優勢,並想出一個更好的分片方案—— DS (Danksharding)。
DS 利用專門的建設者來實現信標鏈(Beacon Chain)執行區塊和分片之間更緊密的整合。我們現在有一個建設者,他可以創建整個區塊;一個提議者;以及一個進行投票的委員會。如果沒有PBS,DS 是不可行的——普通的建設者無法擁有巨大帶寬,以滿足包含無數rollup 數據塊的區塊。
分片1.0 包括64 個獨立的委員會和發起人,可以允許每個分片單獨出問題。通過更緊密的整合使我們能夠一次性地確保完整的數據可用(DA)。數據在黑盒中仍然是“分片”的,但從實用的角度來看,分片開始感覺起來更像是大塊的數據,這簡直太好了。
Danksharding——誠實多數驗證
我們來看看驗證者是如何證明數據可信的:
這需要依靠佔多數的誠實驗證者——作為單一的驗證者,我的列和行可用,不足以給我統計上的信心,證明整個區塊可用。我們需要誠實的大多數人,才能下這個結論。去中心化的驗證很重要。
Danksharding——重建
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節點或增加它們的數據帶寬要求。對於這裡討論的吞吐量來說,這並不是一個問題。不過,如果吞吐量在這個設計的基礎上再增加幾個數量級,這可能會讓人感到不舒服。
原生的danksharding(EIP-4844)
原生的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 個字段元素組成的矢量,每個字段元素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 與指數定價規則)
2D KZG 策略
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個。
狀態——所有當前賬戶餘額、智能合約等的快照。完整的節點(目前)都需要有這個數據,以驗證交易。它對內存來說太大了,而硬盤又太慢了——它很適合固態硬盤裡。高吞吐量的區塊鏈讓這個狀態迅速膨脹,增長速度遠遠超過我們常人在筆記本電腦上能保持的。如果日常用戶不能保有該狀態,他們就不能完全驗證,去中心化也就無從談起。
簡而言之,這些東西會變得非常大,所以你很難運行一個節點,如果要求節點必須保持這些數據。如果運行一個節點太難,我們普通人就不會去做。這很糟糕,所以我們需要確保這不會發生。
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 誕生時,
