原文作者: Jon Charbonneau,Delphi Digital
原文: The Hitchhiker's Guide to Ethereum
核心要点:
以太坊是唯一一个主要协议,意在建立可扩展的统一的结算和数据可用性层
在利用以太坊的安全性的同时,rollup 扩大了计算量
所有的道路都通向中心化区块生产、去中心化的无需信任区块验证和抗审查这一终局。
诸如发起者—建设者分离和弱无状态等创新,带来了权力分离(建设和验证),可以在实现可扩展性的同时,不牺牲安全性或去中心化目标
MEV 现在是前沿和中心——许多设计都是为了减轻其危害和防止其中心化倾向而计划的
Danksharding 结合了前沿研究的多种途径,为以太坊以 rollup 为中心的路线图提供所需的可扩展基础层
我确实期待 Danksharding 在我们的有生之年得到实施
目录
01
第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
02
第2部分 历史和状态管理
Calldata gas 成本缩减及 calldata 总量限制(EIP-4488)
在执行客户中限定历史数据(EIP-4444)
恢复历史数据
弱无状态性(Weak Statelessness)
Verkle Tries(Verkle 尝试)
状态过期
03
第3部分 一切都是 MEV 的锅
如今的 MEV 供应链
MEV-Boost
委员会驱动的 MEV Smoothing
单槽拍板(Single-slot Finality)
单一秘密领袖选择(Single Secret Leader Election)
04
第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 的计划)实现的。
共识层不解释分片的数据。它只有一项工作——确保数据是可用的。
我将假设你熟悉一些基本概念,如 rollup,欺诈和 ZK 证明,以及为什么 DA(数据可用性)很重要。如果你不熟悉或者只是需要复习一下,可以看 Can 最近的 Celestia 报告。
原始的数据分片设计——独立分片提议
这里描述的设计已经被废止了,但作为背景值得了解一下。为了简单起见,我把它称为“分片1.0”。
64个分片区中的每一个都有单独的提案和委员会从验证者集合中轮流通过。他们单独验证他们的分片的数据是否可用。最初不会是 DAS(数据可用性抽样)——它依赖于每个分片的验证者集里诚实的多数来完全下载数据。
这种设计引入了不必要的复杂性、更糟糕的用户体验,以及攻击的载体。在分片之间重组验证者可能带来风险。
除非你引入非常严格的同步假设,否则也很难保证投票将在单个槽内完成。Beacon 区块提议需要收集所有个别委员会的投票,而这可能会有延迟。
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 承诺不具有量子抗性。
回到 KZG 承诺——这些是一种多项式承诺方案。
承诺方案只是一种加密方式,可以使对一些数值的承诺可证。最好的比喻是,把一封信放在一个上了锁的盒子里,然后把它递给别人。这封信一旦放进去就不能改变,但可以用钥匙打开并证明。你承诺这封信,而钥匙就是证明。
在我们的案例中,我们将所有的原始数据和扩展数据映射到一个 X,Y 网格上,然后找到符合它们的最小次数的多项式(这个过程被称为拉格朗日插值)。这个多项式就是证明人要承诺的。
几个关键点:
首先有一个多项式
证明人对这个多项式的承诺形成
这有赖于椭圆曲线加密法的可信设置。至于如何起作用,可以参考一个来自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 策略
我们看到了 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——诚实多数验证
我们来看看验证者是如何证明数据可信的:
这需要依靠占多数的诚实验证者——作为单一的验证者,我的列和行可用,不足以给我统计上的信心,证明整个区块可用。我们需要诚实的大多数人,才能下这个结论。去中心化的验证很重要。
注意这与我们之前讨论的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 个字段元素组成的矢量,每个字段元素 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个。
状态——所有当前账户余额、智能合约等的快照。完整的节点(目前)都需要有这个数据,以验证交易。它对内存来说太大了,而硬盘又太慢了——它很适合固态硬盘里。高吞吐量的区块链让这个状态迅速膨胀,增长速度远远超过我们常人在笔记本电脑上能保持的。如果日常用户不能保有该状态,他们就不能完全验证,去中心化也就无从谈起。
简而言之,这些东西会变得非常大,所以你很难运行一个节点,如果要求节点必须保持这些数据。如果运行一个节点太难,我们普通人就不会去做。这很糟糕,所以我们需要确保这不会发生。
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万的验证者中的12000个)。在单槽中用 BLS 签名聚合将这种投票扩展到全部验证者组,需要更多的工作。这会把数十万张投票压缩到一个验证中。
Vitalik 列出了一些有趣的解决方案,这里查看。
单一秘密领袖选择
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个槽组成,所有验证者被分割开来,在一个给定的纪元内对一个槽进行验证(意味着每个槽有约12000个验证者)。分叉选择规则 LMD Ghost 随后根据这些证明来确定当前链头。一个新的区块在每个槽之后被添加(12秒),所以总的纪元是 6.4 分钟。一般在两个纪元后,最终结果会以必要的票数实现(所以是每64个槽,尽管它可能需要多达95个)。
总结时刻
所有的道路都通向中心化区块生产、去中心化的无需信任区块验证和抗审查这一终局。以太坊的路线图突出了这一愿景。
以太坊的目标是成为终极的统一化 DA 和结算层——大规模的去中心化和安全性为基础,上面是可扩展的计算。这是将密码学假设浓缩到一个强大的层。一个统一的模块化(或者现在是分散的?)的、包括执行的基础层,同时能捕捉到整个L1设计的最高价值——导致货币溢价和经济安全,正如我最近报道的(现在公开发布)。
我希望你对以太坊的研究是如何交织在一起的有了更清晰的认识。这是非常前沿的,所有的部件都在变化当中,要最终弄清楚这一宏大蓝图并不容易。你需要时刻跟进。
最终,这一切都回到了那个单一的愿景。以太坊为我们提供了一条通往大规模可扩展的令人信服的道路,同时又坚守了我们在这个领域非常关心的那些价值。
特别感谢 Dankrad Feist 的审阅和见解。