数据可用性或:汇聚如何学会不再担忧并爱上以太坊

本文深入探讨了数据可用性在以太坊的二层扩展(L2)技术中的重要性,尤其是针对 rollups 的安全性和去中心化的影响。文章清晰地阐释了数据可用性的问题及其解决方案,比较了以太坊自身作为数据可用性层与其他定制化数据可用性层的优缺点,并指出了不同数据存储方式对区块链应用的影响。

数据可用性是关于区块链扩展的关键部分:Layer2(L2)汇总是当前以太坊首选的扩展解决方案,因为L2状态的可用性由L1网络强制执行。即便如此,数据可用性仍然理解得很不够——特别是在汇总和其他离链扩展的上下文中。

随着L2夏季的到来(在经历了多次假启动之后),模块化数据可用性层正从概念验证阶段转向生产阶段,教育社区关于汇总在数据可用性方面对安全性和去中心化的影响变得尤为重要。用户需要特别了解,交易数据存储的位置差异如何决定一个汇总是否“由以太坊保障”。

本文是对此努力的贡献;正如标题所示,我将特别关注以太坊汇总中数据可用性的如何和为什么。数据可用性是一个复杂的话题,因此文章涵盖了很多内容——但如果你能耐心阅读我(有时过于学术化的)解释,你肯定会从阅读中获得很多价值。

让我们深入探讨!

ELI5:什么是数据可用性?

“数据可用性”是保证新提议的区块背后的数据(这是验证区块正确性所必需的)对区块链网络中的其他参与者可用的承诺。为了理解数据可用性为何重要,我们必须先了解区块链今天是如何运作的——以下是一个高层次的概述:

  1. 用户将交易发送到一个全节点,该节点存储区块链的本地副本——这可以是一个验证者、矿工或排序器,具体取决于网络的设计。全节点处理这些交易,创建一个新块,并在整个网络中广播它。
  2. 在从对等节点接收新块后,各节点下载该块,并重新执行交易,以确认该块根据网络规则是有效的。如果新提议的块是有效的,每个节点都会将其添加到自己存储的区块链副本中;否则,它将被丢弃。

注意,每个块由一个主体(存储一组确认的交易)和一个概述块自身信息的头部组成——包括时间戳、Merkle根(对交易列表的加密承诺)、块号和随机数。通过检查块头,轻客户端(无法下载完整块的客户端)可以执行诸如验证特定交易的包含性或检查一个块是否属于标准链的操作。

数据可用性问题是什么?

数据可用性问题简单地询问:“我们如何确保重建当前区块链状态所需的数据是可用的?”我们所称的“状态”指的是存储在链上的信息集,比如账户余额、智能合约的存储值,以及区块链的交易历史。

我们需要这些数据的原因有很多——一个理由是,如果没有它,没人能验证一个或多个交易是否正确执行。如果发生这种情况,恶意的区块提议者可以欺骗网络交易的有效性——尤其是那些不重新执行块的轻客户端。

像以太坊这样的“单体”区块链通过要求全节点下载每个块(并在某部分数据不可用时丢弃该块)来解决数据可用性问题。这就是区块链中“不要相信,验证”的实际运作方式:如果根据新块,Alice的余额增加了1 ETH,我们不会盲目接受这一事实。相反,我们独立地通过使用本地链状态副本重新执行块并检查新状态是否与块提议者的状态匹配来进行验证。

但要求所有节点下载每个块并重新执行交易使得区块链扩展吞吐量变得更难。如果Alice在一个块中向Bob发送1 ETH,那么网络的大多数必须确认该块,交易才能最终确定。网络越大,处理交易的延迟就越长——这就是为什么今天的以太坊非常缓慢的原因。

对于分阶段的模块化区块链(例如汇总),数据可用性问题则显得不同。以太坊的汇总在Layer2(L2)上处理交易,但将交易摘要发布到基础层(Layer1)进行最终确认。

为了澄清,一旦一笔交易不可逆转,就认为该交易是“最终确定”的。以太坊的汇总中,交易实现最终性是当包含该交易的L1块已最终确认(经过三分之二的验证者批准并且不可重组),且网络拥有交易有效性的证明。

我之前已经解释了如何在以太坊主链上验证交易:节点重新执行每个块以确认其有效性。但我们不想让以太坊在最终确定L2交易之前下载和重新执行汇总块;那样只会侵蚀使用L2(离线)扩展的好处。同时,我们不希望汇总的安全性依赖于其排序者和验证者将诚实行为的假设。

因此,汇总(和其他离链扩展协议)面临的数据可用性问题是证明基础层(L1)所需的重建L2状态的数据是可用的,而不要求L1节点下载块并存储数据副本。数据可用性对于保证汇总的安全性是必要的——也就是,确保“不会发生坏事”(例如最终确认无效的L2交易)的特性。

这对于不提供确认L2交易有效性的证明而将交易批提交给L1的“乐观”汇总设计尤其重要。乐观 Rollup具有一个1-of-N(即诚实少数)安全模型,要求至少一个诚实节点重新执行汇总块,并在发现无效状态转变时在L1链上发布一个故障/欺诈证明

但检查特定块及通过执行块所派生的状态是否有效,需要访问该块的数据(即块中包含的交易集)。如果没有交易数据,我们友好的邻居观察者无法重建状态变更并产生故障证明,证明特定块对汇总的父链是无效的。

零知识汇总为交易批生成有效性证明,从而自动保证免于无效执行的问题,并且没有类似的问题;即使排序者(或验证者)拒绝释放交易数据,也不会导致汇总的L1合约接受一个无效块的承诺(状态根)。然而,有效性证明无法保证zk-rollup的活性(即“最终会发生好事”)的特性,正如我在关于zkevm的旧文章中所阐明的那样。

  • 活性确保任何人都可以读取区块链来推导其内容——例如,检查或证明特定地址的余额。这在某些情况下很重要,例如在尝试从汇总的桥合约提取资产时。
  • 活性同样也确保任何人可以向区块链写入新数据,通过处理交易和生成块,尤其是如果汇总的排序者没有响应时。

汇总在解决数据可用性问题时走了不同的路线,各种设计决策对使用L2时的安全性和用户体验都有影响。在接下来的部分中,我们将探讨以太坊汇总采用的数据可用性策略的细节——也就是说,完全依赖于以太坊来获取安全性的汇总——然后看看它与其他替代方案的比较。

以太坊汇总如何解决数据可用性问题?

如今,绝大多数以太坊上的汇总都由一个“排序者”操作。排序者是一个全节点,接受Layer2(L2)上的用户交易,处理这些交易(使用汇总的虚拟机),并生成更新汇总状态的L2块。

在我们进一步讨论之前,了解汇总如何与基础层或“父链”协作是非常重要的。为了使以太坊能够监控和强制执行汇总的状态转换,一个特殊的“共识”合约存储一个state root——这是对汇总的标准状态的加密承诺(类似于L1链上的块头),是在处理新一批交易后的生成。

(source)

尽管对乐观 Rollup而言,新的状态根的提交是由一个验证者处理(验证者需发布一个可以被削减的担保以防提交通常不正确的状态根),在zk-rollup中,新的状态根通常由排序者负责提交。排序者将一批交易的执行痕迹(除了旧状态根和新状态根)作为zkEVM的证明程序的输入,并生成一个证明该批次是有效的。该证明与新状态(状态根)的承诺一起提交给L1验证者合约。

一旦SNARK/STARK证明被接受,L1共识合约存储了新的状态根,包含在相应批次中的交易被最终确认。此时,你可以请求从汇总中提取资金(如果批次包括你的提取请求交易),因为该证明使桥合约确信你的交易的最终执行。

为了在L1更新有效汇总的状态,只需发送一个有效的证明——而无需提供交易或新状态更新效应的信息。虽然有效性证明确保汇总始终是安全的,但它并不能保证汇总始终是活跃的(这一区别我以前已阐明)。这就是为什 ضدzk-rollups理想上会将所有输入交易相关的数据上链,并允许任何人通过下载存储在以太坊块中的数据来无信任地重建L2的状态。

以下是该流程的简要概述(适用于乐观和有效汇总):

  • 排序者定期将交易整理成一批——批次可能跨越多个L2块,排序者可能会压缩交易数据以降低L1费用
  • 排序者通过调用存储汇总批的L1合约,在以太坊L1上发布批次,并将压缩的数据作为blobs(或calldata)传递给批提交函数(参见批提交交易的示例

这一策略与其他(非以太坊或部分)汇总在现实中所采用的不断建议不同。例如,“主权”汇总可能使用一个定制的数据可用性层来存储交易批,而不是将交易数据(输入或输出)发布到以太坊。它也可以将有效性证明或故障证明发布到外部数据可用性层,而不是在以太坊上发布,并让其全节点下载和验证这些证明来结算交易。

在以太坊上发布交易数据是一项以太坊L2(即“完整汇总”)所做的设计决策,因为它提供了显著的好处,并且符合以太坊的去中心化和无信任的精神。但接下来的政策辩论应该不应显得单方面——这就是为什么下一部分试图将这一数据可用性策略与其他汇总项目的策略进行比较。

以太坊汇总上链数据可用性的案例

将数据发布到以太坊与使用定制的数据可用性层

上述文章标题反映了以太坊汇总数据可用性政策中的一个关键方面:将交易数据提交到以太坊,而不是使用替代的数据可用性层。虽然确实存在其他数据可用性层,但以太坊汇总通常将以太坊作为数据可用性,主要是出于其高程度(经济)安全性(以及其他原因)。

随着模块化区块链理论日益流行,新的汇总正在设计为将数据可用性作为即插即用组件——像模块化区块链栈的其他组件一样,随时可以更换。在这种情况下,汇总可以选择使用其中一个专注于为汇总提供数据可用性的最新区块链。

这些数据可用性区块链类似于数据可用性委员会,但它们是无权限的(任何人都可以存储数据),并且具有更强的安全保证(执行数据保留攻击的节点可以被削减)。以下是一些常被引用的使用非以太坊区块链进行数据可用性的好处:

  • 较低的成本:专门用于数据可用性的区块链可以优化数据存储的成本。而以太坊则结合了执行、结算和数据可用性,这意味着以太坊汇总必须与其他L1交易竞争有限的区块空间(在此过程中增加存储成本)。
  • 扩展性:数据可用性区块链可以通过数据可用性取样这种原语进行水平扩展,使执行层可以安全增加块大小;相反,以太坊汇总必须将L2块大小限制为可以适应以太坊块的大小。
  • 主权性:通过从数据可用性层下载交易数据和证明,主权汇总的节点可以验证状态更新并独立确定标准链。而以太坊汇总只能通过在L1上升级其智能合约来分叉(以太坊网络决定标准链是什么)。

插曲:理解数据可用性与共识的关系

在比较使用替代数据可用性层的成本和收益之前,了解数据可用性与共识之间的关系是非常重要的。以下是简要的解释方式:

  • 数据可用性层负责就定义汇总链的交易排序达成共识
  • 一旦一组交易被排序并提交到基础层,这些交易便成为标准 Rollup链的一部分,且无法被撤回(即,已最终确定)。

数据可用性与共识之间的这种关系是保证汇总其他安全属性所必要的,例如:

  • 审查抗性:没有人应该阻止用户在区块链上执行交易,只要这些交易是有效的并且支付了要求的网络费用。
  • 重组抗性:没有人应该能够任意“重组”汇总的块(有效地重写区块链的历史)以执行双重支出或时间强盗攻击

使我抵抗审查的能力需要一种强制包含某些交易的机制。例如,如果汇总的排序者进行审查,用户可以直接向数据可用性层提交交易,而该汇总将有一个规则,防止全节点创建有效块,除非他们包含这些交易。

重组抗性要求数据可用性区块链足够安全,以防止基础层上块被撤回并重写汇总的交易历史。特别地,安全性依赖于攻击者无法控制接近51%67%的网络的确定。

抵抗审查和重组攻击是可能的,如果数据可用性层的安全性足够,以至于不诚实的多数节点无法控制链——而这种安全性体现为经济安全性。攻击者可以(理论上)发现一个将协议置于风险中的漏洞——但这样的例子很少。在设计新的区块链时,更迫切关注的是攻击成本,尤其是针对破坏其共识的攻击。

这就是我们讨论数据可用性层中经济安全性的原因。

为什么数据可用性层需要经济安全?

一个区块链会被视为经济安全的,如果攻击它的成本大大超过实施攻击的利润。这就是为什么比特币和以太坊被认为极其安全;想要贿赂矿工/验证者或创建西比尔身份——足以控制网络多数的攻击者——在这个过程中必须花费大量金钱(并可能指望会造成损失)。

比特币和以太坊之所以具备这种特性,是因为它们的原生代币的价值,尽管比特币价格与其安全性之间的关系不如以太坊那样明确。扩展这个想法,攻击比特币的成本是垄断网络的哈希率所需的计算能力,而攻击以太坊的共识的成本则等于攻击者需要控制的(存入的)ETH的数量,以便控制大多数信标链验证者。随着一单元以太币(ETH)价值超过3000美元,潜在攻击者从经济角度来看很难控制流通中的大量ETH供应。

考虑到这种解释,可以通过提出以下问题来分析数据可用性、经济安全和汇总安全之间的关系:

  • 一个攻击者在数据可用性层逆转块的成本是多少,以防止(诚实的)观察节点访问验证状态更新和创建故障证明所需的交易数据?(乐观 Rollup)
  • 一个攻击者在数据可用性层迫使节点拒绝服务汇总数据请求的成本是多少——例如,从需要交易批数据以构造Merkle证明以证明对桥合约的退出交易的包含性或需要状态数据以生成新块的汇总节点? (有效汇总和乐观 Rollup)

在这种情况下,使用以太坊进行数据可用性并从L1共识中衍生安全性特性——如重组抗性和安全失败——给以太坊汇总带来了很多好处。一个专门的数据可用性层能否保证汇总的同等安全水平?这还有待观察,但经验表明,为区块链启动有意义的经济安全性是困难的,尤其是当网络的原生代币并未获得显著的市场价值时。

“但如果一个数据可用性区块链的代币积累了足够的价值,以至于它变得比以太坊更具经济安全?”

这种想法的问题在于未能意识到(或认可)区块链网络中效用、价值和经济安全之间的紧密关系。正如Jon Charbonneau所指出的还有其他人),以太币今天之所以有价值,是因为它作为资产的适用性随时间增长;随着ETH价值的增加,以太坊的经济安全也随之增加。

对于新的数据可用性区块链,情况通常是相反的:原生代币通常是在网络创世时发行的,以便允许验证者参与权益证明(PoS)共识。这里的预期是,代币的估值会随着时间的推移而增长,从而提高对共识层的攻击成本,即使目前该代币的用途仅限于支付数据存储费用或质押。如果出于某种原因,这一计算没有生效——在加密世界里更奇怪的事情时有发生——那么使用那个数据可用性层的汇总将继承零安全保证。

请注意,这并不是对模块化数据可用性层的看跌看法——正如其他聪明人所解释的,并非所有区块链应用需要完整以太坊汇总所提供的高水平安全性——而是试图澄清汇总在存储交易数据方面的方法所带来的与安全相关的影响。这也是试图澄清:——我在下一部分中扩展的——如果一个汇总将状态数据存储在链外,则它不能声称是“100%由以太坊保障的”。

“但如果一个汇总在以太坊上结算交易,但将交易数据发布到其他地方?”

通过在以太坊验证证明(有效性证明或欺诈证明),非以太坊汇总获得了比其他条件下更高的安全性。例如,L2节点或数据可用性层都难以审查携带证明的交易,尤其是来自诚实节点的交易。

不过,这并不解决与将状态数据存储在故障数据可用性层相关的其他问题。为了说明这一点,假设一个汇总在以太坊上部署了一个智能合约,该合约接受新的状态根,并且只有在从数据可用性层获得证明(声称重建汇总状态和验证状态转换所需的数据是可用的)后,才最终确认由排序者或验证者提交的块头。

在这种情况下,针对数据可用性层的51%或67%攻击仍然会使汇总网络处于危险之中。这是因为以太坊中的智能合约仅验证数据可用性网络中的节点声称他存储了一汇总的交易数据——在无法提供该数据请求的情况下承担被削减的风险——通过将其连接到外部数据可用性层的模块。汇总的共识合约并未验证数据是否真正可用,如数据可用性证明所声称的。

这为奇异情况打开了大门,例如在汇总节点缺乏重建L2状态和生成新块的数据时发生的活性失败,即便是在以太坊上仍有交易得到确认。这强化了这一理念:使用特定区块链存储数据必然使汇总无法从单独区块链获取特定的安全性保证。

数据可用性委员会(DAC)是外部数据可用性层的一个子类,但我将单独讨论DAC,因为它们与数据可用性网络本质上不同并且操作在不同的信任假设下。像数据可用性网络一样,DAC的核心任务是存储离链数据的副本并根据请求提供给感兴趣的一方。

DAC成员(通常约为3/4)的法定人数需要签署证明,以确认一组更新网络状态的交易的数据的可用性。如果相应网络是有效链(类似于有效汇总的结构,具有离链资料可用性),该证明可通过证明电路提交,或在接受由排序者提交的状态根的有效性证明之前由L1共识合约(单独)检查。

在一个“乐观型”(即类似于乐观 Rollup的结构,具有离链数据可用性)的环境中,数据可用性证明在提交新的状态根之前被提交给共识合约。通常乐观 Rollup的流程涉及由验证者提供汇总的收件箱合约的内容的哈希,该收件箱存储交易批次(稍后会详细讨论),但在乐观型中,L1共识合约只是通过验证数据可用性证明来确认DAC是否保留了数据。

DAC与数据可用性网络之间的主要区别在于去中心化:

  • DAC是有权限的,仅限预先指定的成员;而数据可用性网络通常是无权限的,允许任何操作员——只要他们在网络上抵押——存储数据。 (出于这个原因,你可以将数据可用性视为“无权限的DAC”)。
  • 虽然数据可用性网络依赖于削减激励机制以保证加密经济安全,但DAC成员通常不要求在负责数据存储之前抵押任何担保品;相反,安全性依赖于DAC节点(通常可以公开识别)将诚实工作以保护其信誉的假设(即社会问责制)。

DAC在某种程度上解决了数据可用性问题——你有大约7-12个承诺提供交易数据的节点(如果他们未能履行职责,其信誉就会置于危险中)。然而,这种方法并未达到将数据上链的汇总所实现的相同无信任性和审查抗性水平。

在乐观型中,恶意DAC节点可以与验证者和排序者(具体取决于谁可以提交状态根)串通,以通过执行数据保留攻击来最终确认无效状态更新(例如,将资金转出一个桥接合约的交易)。

有效链在面临具有不诚实多数的DAC时能抵御安全攻击,但用户并非完全安全。例如,恶意DAC(无论是否与排序者串通)都可能冻结用户的资金并审查L2 → L1提款。由于用户依赖Merkle证明(使用交易批中获取的数据计算)来向Rollup桥合约证明对资金的所有权,DAC成员的数据保留将延缓任何提款从而在Rollup桥上存入的资金的尝试。

附录:关于模块化数据可用性层的安全特性

尽管我之前已有免责声明,仍有一些人可能会感到冲动问:“你是在说模块化数据可用性层不安全吗?”简而言之,“不”;长一点的答案是“这很复杂”。以下是一个简短的轶事和背景解释:

最近,我和Andrew(他实际上是一个高水平研究者)交谈,讨论成了关于新数据可用性服务在加密世界中出现的问题。Andrew的观点是:数据可用性是一个困难的问题,特别是在像区块链这样对抗性的环境中。例如,他(适时地)指出,一个节点可以假装没有收到客户端对数据块请求的反馈,从而执行数据保留攻击。

给出一些背景:许多数据可用性服务依赖于经过充分研究的密码学原语来保证安全性(附注:以太坊对汇总数据可用性的长期解决方案——Danksharding——依赖于一组类似的原语,并且具有类似的安全假设)。以下是一些这样的原语的(非详尽)列表:

  • 保管证明可回收性证明——允许客户端验证一个不受信任的节点是否以承诺的数据进行合法存储。
  • 数据可用性取样(即之前提到的)确保轻客户端能够可靠地侦测到不可用的块,而无需下载块的内容。将DAS方案与擦除代码结合使用,可以使分块数据存储,并使客户端能够通过多对等方均匀地请求数据的部分,而不必依赖单个节点来请求数据,从而降低审查和数据保留攻击的风险。

但是回到Andrew关于审查数据块请求的观点。你可能会想:“当然,数据可用性协议会有某种机制惩罚因未向客户提供数据而失败的节点?”这方面确实是正确的,但实现这一机制并不是特别直观。具体来说,正如Andrew所说:“你不能基于客户的指控惩罚一个节点,理由是它没有提供数据块。”

“无信任的DAC(去中心化数据可用性服务的另一名称)被视为区块链社区理想中的数据可用性解决方案。然而,去中心化的DAC面临一个根本性问题未能解决:渔夫问题。在数据可用性文献中,渔夫问题用来说明请求数据的客户端与存储数据的节点之间,交互过程中出现的问题。以下是渔夫问题的简要描述:设想一个请求数据的客户端发现,块的某些部分不可用并向网络上的其他对等方发出警报。然而该节点在随后的时间内提供了数据,以至于其他节点在检查之后得出块的数据实际上是可用的。这就产生了一个困境:节点是故意地保留数据,还是客户端发出虚假警报?”

如上图所示,数据不可用的问题并不是一个唯一应归责的过失;换句话说,这意味着另一个节点(或协议)不能客观地确定某个节点是否确实拒绝提供数据,或者恶意客户端试图利用系统赚取虚假挑战的奖励。我鼓励大家阅读之前链接的文章,以获取渔夫问题的背景;更形式化的保证数据可用性服务的经济安全问题的描述可在Ertem Nusret Tas等人的论文中找到。

并且,如果让加密经济安全的复杂问题得到解决还不够,数据可用性取样——“去中心化的数据可用性服务”可能声称是其安全保证的基石——仍然是研究人员的研究难题。设计模块化数据可用性方案的复杂性就是为什么Danksharding预计需要几年才能实施,而Proto-Danksharding要求所有节点存储完整的EIP-4844数据块(而不是存储一小部分并允许客户端下载通过随机采样重建数据块)。

在L1上发布汇总数据并通过强制节点冗余存储数据副本来保证持久性和可用性并不是最优雅的解决方案。然而,当有数十亿价值的资产的安全性依赖于汇总的安全性(这与汇总的数据可用性策略紧密相关)时,保持简单——直到我们知道如何 安全地 实施更好的解决方案——是个不错的主意。

发布原始交易数据与发布状态差异

到目前为止,我所说的一切都暗示着在以太坊上发布交易数据是以太坊汇总的金标准。但以太坊的一个汇总可能会采取不同的方法,将状态数据存储在链上。这些差异是微妙的,甚至可以视为次要的实施细节;但是,区块链是“细节之魔鬼”这一陈腐说法最真实的地方之一。

zk-rollup可能选择在发布到以太坊L1的批中发布交易输出,而不是发布原始交易输入,因为有效性证明证明批的正确执行(乐观 Rollup默认情况必须发布原始交易数据)。这些输出代表了汇总在批次之间的旧状态和新状态之间的差异(“diffs”的简写),并通常包含有关交易期间合同存储值的变化、新的合同部署和相关账户余额更新的信息。

这使之zk-rollup的排序器可以选择从每个状态更新发布交易输入,或仅在更新L1对汇总状态的视图时发布块之间旧状态和新状态的差异。“状态差异”的方法显而易见地更受欢迎,因为它减少了汇总的上链占用空间(每个批提交交易消耗的blob更少),并减少了排序器的运营成本——这反过来又降低用户的费用。

发布状态差异进一步支持多种摊薄交易成本的方法,因为其占用的每 L1 数据存储没由 blobs 如此费用主导。 例如,状态差异可以省略签名,并且如果批次/块中的多个交易更改相同的存储插槽,则在链上发布的批次将仅包含对存储插槽的最终更新,并省略有关中间交易的信息。

在大多数情况下,在L1上发布的状态差异通常足以重建汇总的状态并验证由汇总的排序器提交的块(尽管后者并不是严格必要的)。但是,发布原始交易数据在某些情况下具有一些重要优点,可以限制链上的数据为状态输出:

审查抗性

通过在L1发送交易强迫将交易包括到汇总中,是防止用户遭受不当排序者审查的标准方法。在排序者信任(或半信)且只保留处理汇总交易的专有权利的情况下,这一点尤其重要。

对于在链上发布完整交易数据的批次,强迫包含L1 → L2消息的机制更容易实施。为了提供背景,汇总的批次通常提交给一个在L1的“收件箱”合约,该合约决定L2交易的标准顺序,从而定义汇总的状态。在通常情况下,只有序列器被允许向 rollup 的收件箱提交交易批次——这自然会引入一定程度的中心化,但如果用户希望信任来自 rollup 的序列器的确认,这是必要的。为了保证用户不受审查序列器的影响,理想情况下,rollup 应该允许用户将交易发送到收件箱合约——前提是这些交易在“超时参数”(非序列器地址提交到 rollup 收件箱的交易所施加的延迟)超过之前不会被纳入收件箱。

然而,一旦交易进入 rollup 的收件箱,它便成为规范的 rollup 链的一部分。这迫使序列器必须将其包含在下一个批次中,否则无法生成有效的批次;例如,一个有效性证明将同时引用由序列器在链外生成的序列批次和由用户在链上强制提交的批次。通过使用强制纳入机制,Ethereum rollups 使用户能够在不依赖序列器诚实性的情况下自动处理交易。

如果 zk-rollup 在链上发布状态差异,则强制执行 L1 → L2 交易更为困难。在这样的 rollup 中,交易——具体来说,是交易的输出——在执行后(主要由序列器处理)发布到 L1。这意味着用户无法自动包含交易,必须依赖序列器的合作来执行与 rollup 的桥接合约互动的交易。

需要澄清的是,这个解释并不意味着所有采用这种方式的 zk-rollups 都容易受到审查的影响。某些 zkEVM 实现具备某些机制,允许用户在 L2 上受到审查时在 L1 上发布消息。如果该交易在预设延迟后没有被处理,链将进入“紧急模式”。这通常会执行以下一种(或两种)操作:

  • 禁止来自受信序列器的更多状态更新(同时允许用户使用所有权的 Merkle 证明从 rollup 的桥接中提取资产)
  • 允许任何人(包括用户)成为操作员并处理 rollup 交易

虽然这两种机制提供了一定的反审查保护,但与强制序列器执行延迟交易的默认方法相比,它们显得相当不理想;例如,第一个技术(禁用来自审查序列器的状态更新)影响了 rollup 的生存性,并且没有帮助强制执行非提取操作。

此外,并不是每个用户都有资源为 zk-rollup 中的交易生成有效性证明。这就是为什么如果受信序列器离线或进行审查,那么允许任何人成为 rollup 操作员的机制应该是最后一道防线,而不是抵御 L2 上审查的第一道防线。

快速最终性

生成证明的成本对 zkEVM rollups 来说是显著的,这并不是秘密——至少在并行化或 硬件加速 等创新降低证明者成本之前。在链上验证证明也会产生高昂的固定成本(根据实现方式,在 500K gas 和 3M gas 之间)。

这迫使 zk-rollups 在决定交易批次在主网发布和最终化的频率时进行权衡。以一个例子说明,rollup 可以频繁地发布带有有效性证明的交易批次,这种证明证明了批次交易的有效性(为用户提供交易的快速最终性),但以快速的速度生成和验证证明的成本是昂贵的。

另一个选择是在生成证明并在 L1 发布新状态更新之前,先积累许多交易。有效性证明的好处是,随着被证明的数据线性增长,它们的大小大致保持不变;因此,生成和验证较大批次的证明(以较长的时间间隔发布)会降低单个交易的成本。

但是,这是一个缺点:等待交易积累在 longer time-to-finality 对 rollup 用户来说是长的。发布状态差异进一步加剧了这个问题:用户无法知道交易是否被处理,直到状态更新被发布(通常在发送交易后几个小时)。

如果 rollup 使用中心化的序列器并享有优先访问链的权利,用户可以选择信任来自操作员的“软确认”(承诺将交易包括在批次中)。然而,一个去中心化的序列器集合——特别是随机选择领导者的序列器集合——将使从软确认中获得最终性保障变得困难。这也会降低终端用户对区块探索工具的可靠性。

相比之下,在链上发布交易输入可以改善 L2 用户的最终性保障。一旦新批次发布到 L1,任何运行 rollup 全节点的人都可以通过执行批次来验证一个或多个交易是否成功。这仍然是“软最终性”,因为该批次的有效性证明尚未得到验证,但通常对大多数高效用户来说已经足够。

注意:L2Beat 提供了一个信息丰富的仪表板,展示有效性 rollups 的证明提交率和最终性时间

Dapps 和基础设施提供商的交易历史

发布状态差异的一个不那么明显的结果是,使用来自 L1 的数据重建 rollup 的历史变得更为困难。作为背景,有效性证明仅确认 rollup 的新状态是有效的——但它并没有泄露有关状态的内容或哪些交易导致了新状态。

虽然这个话题很少被讨论,但许多应用程序需要访问实时和历史区块链数据,以改善整体用户体验。例如,考虑以下场景(引用自 Arbitrum 团队的这个精彩文章):

“假设 Alice 提交一笔交易支付 Bob 1 ETH,而 Bob 在紧接着又提交一笔交易支付 Charlie 1 ETH。之后,你验证出一个证明,确认 Alice 的余额减少了 1 ETH,而 Bob 的余额没有变化,而 Charlie 的余额增加了 1 ETH。但发生了什么?Alice 是不是支付了 Bob?Bob 是不是支付了 Charlie?也许 Alice 直接支付了 Charlie。也许 Alice 材毁了一 ETH,而 Charlie 是由其他人支付的。也许 Diana 是中介,而不是 Bob。Bob 寻找区块链的证据,但对于一些不提供链可见性的 ZK-rollups,他无法分辨。”

在这里,Bob 不能分清 1 ETH 在账户之间转移了多少次,因为该批次包含了最终状态差异(Alice 的余额减少了 1 ETH 和 Charlie 的余额增加了 1 ETH)并且不包含中介交易(Alice 向 Bob 发送 1 ETH)。而 Bob 的余额没有变化是因为 rollup 批次隐藏了有关状态中间过渡的信息。

Bob 的困境也强化了一个关键观点:许多加密应用程序需要完整的交易历史,而不仅仅是偶尔的状态快照。更具体地说,他们需要知道在 rollup 从以前的状态转换到当前状态之前发生了什么(和何时发生)。

这些应用程序和服务包括:

  • 去中心化交易所 (DEXs):像 Uniswap 或 SushiSwap 等 DEX 通常需要完整的交易历史,以跟踪流动性池的状态并根据交易量和流动性准确计算代币价格。
  • DeFi 协议:像 Aave 或 Compound 这样的金融协议需要完整的历史记录,用于计算利率、贷款还款、抵押比例和其他财务指标。同时,他们可能需要审计和追踪交易,以确保遵守监管要求。
  • NFT 市场:这些平台可能需要了解完整的交易历史,以验证 NFT 的真实性和来源。知道一个 NFT 拥有者是谁以及何时拥有可以极大影响其感知价值。
  • 区块链取证:区块链取证服务(例如 Chainalysis)提供透明度、反洗钱 (AML) 和了解你的客户 (KYC) 合规性分析工具。他们利用交易历史分析模式、检测可疑活动和追踪资金。
  • 预测市场:像 Augur 等平台可能需要交易历史来解决市场预测并公正、准确地分配奖金。
  • 去中心化自治组织 (DAOs):DAOs 可能需要交易历史用于治理目的,例如跟踪对提议的投票。
  • 抵押协议:这些协议需要完整的交易历史,以便计算抵押参与者的奖励。
  • 跨链桥:这些工具需要完整的交易历史,以确保在不同区块链之间安全和准确地转移资产。

针对 rollups 是否存在理想的数据可用性策略?

本文主要专注于使用 Ethereum 进行数据可用性的 rollups 的好处,但这并不意味着没有涉及的缺点。实际上,我将首先承认,rollups 目前为数据可用性付出了很高的成本—而且由于 rollups 并非非营利性组织,这一成本自然会转嫁给用户。

尽管如此,在链上放置(完整)交易数据提供了许多优势——其中很多在这篇文章中进行了分析。这些是一个实用链应该提供的好处,每个 rollup 的数据可用性策略都应该根据其为用户保证这些优势的效果进行评估。

在真实世界条件下构建有效的事物需要做出妥协,但当协议避免交流支撑用户拥有的资产安全的各种信任假设时,就会出现问题——更糟糕的是在“权衡”的幌子下走捷径(这已成为某些加密市场团队的艺术)。

此外,在存储 rollup 数据于 Ethereum 时,或许有可能“吃蛋糕又保留蛋糕”——以下是一些相关的细节:

  • 几个有效 (ZK) rollup 已开始努力省略交易数据中的签名,这将减少整体链上的足迹,并带来与发布状态差异相当的成本节约。
  • EIP-4844 (Proto-Danksharding) 通过引入数据块,短期内降低了在 Ethereum 上存储 L2 数据的成本,并允许在 Ethereum rollups 上进行适度的吞吐量扩展(估算在当前能力之间 10X 到 20X 的范围内)。此外,包括 EIP-7691 (Blob throughput increase) 在内的进一步改进将扩展 rollups 的块数量,并且 EIP-7623 (Increase calldata cost) 将使块(或任何与 Ethereum 数据可用性部分交互的操作)成为在 Ethereum 上存储数据的标准方法。
  • 全面的 Danksharding 将进一步降低数据可用性成本,并通过提高 Ethereum 的数据带宽来改善 rollups 的可扩展性。

通过这些设计改进,我们可以实现一个理想的世界,在这个世界中,L2 交易成本低于几美分,并且 rollups 可以支持高吞吐量应用而不降低去中心化或安全性。这意味着,当前链上的数据可用性可能对 rollups 来说效率较低(与替代方案相比),但它最终将成为数据可用性的最有效解决方案。

随着 EIP-4844 的推出,一种新的交易类型被引入为承载块的交易。我们已经介绍了 Ethereum 交易的类型:正常交易和与数据可用性部分交互的交易。承载块的交易是一种具有数据可用性交互的交易,我们称之为此交易所携带的数据为块。

块通常很大,而且大多数时间它们比 calldata 便宜。然而,在某些情况下,块在块空间的竞争中可能需要更多的 gas。尽管如此,块在可扩展性方面仍然优于现有交易。

如今,块空间可能不足以满足 Ethereum L1 上的 Rollups。块可以通过其他数据可用性交易共享,这意味着块可以通过 Rollups 共享。此外,随着 Pectra 升级,还有一些 EIP 使块更有效。EIP-7691 计划增加块的吞吐量,EIP-7623 计划增加 calldata 成本,以便与数据可用性部分交互的交易使用块空间,以及 EIP-7840 计划列出每个分叉每个区块的目标和最大块计数。

像往常一样,如果你认为这篇文章有用,请分享它。我期待在 Twitter/XLinkedIn 连接——即便只是说“来了是因为内容,留下是因为memes。”而且不要忘记订阅 Ethereum 2077,以获得关于 Ethereum 研发的更多深入分析。

  • 原文链接: research.2077.xyz/data-a...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Emmanuel Awosika
Emmanuel Awosika
江湖只有他的大名,没有他的介绍。