注:原文作者是Paradigm基金研究者Georgios Konstantopoulos。
以太坊生态系统所面临的最大挑战之一,是在严格的资源约束(例如CPU、带宽、内存以及磁盘空间)下具有低延迟和高吞吐量。
而一个系统的去中心化程度,取决于网络中最弱节点验证系统规则的能力。我们认为,可以在低资源硬件上运行的高性能协议才是“可扩展”的。
在本文中,我们将深入探讨现代“Layer 2解决方案”的原理,其相应的安全模型以及它们如何解决以太坊的可扩展性问题。
这篇文章的目标读者是有好奇心的个人,他们有兴趣了解更多有关先进的以太坊扩容技术,以及有动机构建和架构此类系统的人群。
区块链资源需求
有三个因素会影响在去中心化网络(例如比特币和以太坊)中运行节点的资源需求:
- 带宽:下载和广播任何区块链相关数据的成本;
- 计算:在脚本或智能合约中运行计算的成本;
- 存储:为索引目的存储交易数据的成本,以及为继续处理新交易区块而存储“状态”的成本。
而性能则是通过两种方式衡量:
- 吞吐量:系统每秒可处理的交易数;
- 延迟:处理交易所需的时间;
比特币和以太坊等新兴加密网络的理想特性是去中心化。但是,是什么让网络变得去中心化呢?
- 低信任:这一属性可以让任何人验证比特币的总量不会2100万BTC,或者也不会有伪造的比特币。运行节点软件的个人,独立计算最新状态并验证流程中是否遵循了所有规则;
- 低成本:如果节点软件的操作成本很高,则个人将依赖受信任的第三方来验证状态。高成本意味着高信任度要求,而这是我们首先要避免的。
另一个需要的特性是就是可扩展性:能够将吞吐量和延迟超线性地扩展到运行系统的成本。这一定义很好,但没有包含“信任”。因此,我们指定了“去中心化可扩展性”:即在不显着增加系统信任假设的情况下,实现可扩展性。
放大来看,以太坊的runtime环境是以太坊虚拟机(EVM)。通过EVM运行的交易以不同的成本执行各种操作(例如,存储操作的成本高于添加操作的成本)。交易中的计算单位称为“gas”,系统参数化为每个区块最多处理1250万 Gas,其中平均每12.5秒生成一个交易区块。因此,以太坊的延迟时间约为12.5秒,吞吐量为每秒100万 gas。
你可能会遇到这样一个问题:每秒100万gas,你能够用来做什么?
- 每秒约47笔简单的转账交易,这些交易每笔花费21000 gas,它们是最简单的交易类型,比如将ETH从地址A转到地址B;
- 每秒约16笔 ERC20代币转账,与ETH交易相比,这些交易涉及更多的存储操作,因此每次会花费大约60000 gas;
- 每秒约 10笔 Uniswap资产交易,该平台代币之间的交易平均要花费102000 gas;
- 以此类推;
请注意,随着交易执行复杂度的增加,系统的吞吐量会降低到非常低的值。还有改进的空间!
解决方案1:使用中介
我们可以利用一个可信赖的第三方来促进我们的所有交易。这样,我们就能够得到非常高的吞吐量以及可能的二级延迟,这太棒了!这不会改变任何系统范围的参数,但我们会选择进入一个由第三方单方面设置的信任模型。他们可能会选择审查我们,甚至扣押我们的资产,而这是不可取的。
解决方案2:让区块变大,缩短区块间隔时间
我们可以通过缩短两个区块之间的时间来减少延迟,并且可以通过增加区块gas限制来增加吞吐量。但这种变化将使节点运营的成本变高,从而阻止个人运行节点(例如EOS、Solana、Ripple等就是使用的这种方法)。
我们可以发现,解决方案1中增加了信任要求,而解决方案2则是增加了成本。这使得这两种方案,都无法成为可扩展性的好选择。
从第一性原理重新认识乐观汇总(Optimistic Rollup)
在这部分内容中,我们假设读者了解了哈希和merkle树的概念。
根据我们目前学到的知识,让我们模拟一些苏格拉底式的对话,目的是发现一个协议,它可以提高以太坊的有效吞吐量,而不会增加用户和节点运营者的负担。
问、所以…我们想在不改变信任和成本假设的情况下扩展以太坊。我们该怎么办?
答: 我们希望降低现有操作对系统成本的要求(请参阅上面的三种资源类型)。为了理解要实现它并不是一件易事,我们首先需要了解以太坊的体系结构:
以太坊中的每个节点,当前都存储并执行用户提交给它的每个事务。在执行期间,交易会通过EVM运行,并且与EVM的状态(例如存储,余额等)进行交互,这是非常昂贵的。常见的智能合约优化技术的重点,是最大程度地减少与状态的交互次数,但是它们仅仅提供了较小的常量因素改进。
问:你是说有一种交易方式可以不影响状态,从而降低资源成本吗?
答:在极限情况下,我们可以将所有执行转移到链外,并在链上保留一些数据。我们可以通过引入一个称为序列器(sequencer)的第三方来做到这一点。它们负责在本地存储和执行用户提交的事务。为了保持系统的活跃性,序列器需要定期提交他们接收事务的merkle根和以太坊上产生的状态根。这是朝着正确方向迈出的一步,因为对于O(N)链外交易,我们只存储O(1)以太坊状态数据。
问:所以我们通过让序列器计算链外的所有内容,并只发布merkle根来实现扩容?
答:是的。
问:好的,一旦你加入其中,序列器会保证你的转账是便宜的,那存款和取款是如何工作的?
答:用户将通过在以太坊上存款进入这个系统,然后序列器将相应的金额记入用户的账户。一个用户通过做一笔交易“我想取款3ETH,我的账户目前有>3 ETH,这就是它的证明”来将资金提回到以太坊主网。即使L1没有实际的用户状态,**用户也可以通过显示引用序列器发布的状态根的merkle证明,来证明自己在当前状态下有足够的资金。
问:我们确定用户需要一个merkle证明才能提取他们的资金,那用户如何获取数据来构造merkle证明呢?
答:他们可以让序列器给他们提供数据!
问:但是如果序列器暂时或者永久不可用呢?
答:序列器可能是恶意的,或者只是因为技术问题而离线,这会导致性能下降(或者更糟的情况是资金被盗!)因此,我们还必须要求序列器在链上提交完整的交易数据,以便存储但不执行。这里的目的是获得数据可用性。假设所有数据都永久存储在以太坊上,即使序列器消失了,新的序列器也可以从以太坊中检索所有与Layer 2相关的数据,重建最新的L2状态,并从先前停止的地方继续。
问:因此,如果序列器在线,但拒绝向我提供merkle 证明数据,我可以通过以太坊下载它?
答:是的,你可以自己同步以太坊节点,也可以连接到很多托管节点服务之一。
问:所以我还是不明白…你怎么能在以太坊上存储一些东西,而不执行它呢?不是每笔交易都要通过EVM吗?
答:假设你提交了10笔将ETH从地址A转移到地址B的交易,执行每笔交易将执行以下操作:增加A的nonce、减少A的余额以及增加B的余额。这是来自世界状态相当多的写入和读取。相反,你可以将所有交易的编码发送到智能合约的publish(bytes\u transactions)public{}函数。请注意,这个函数的主体是空的!这意味着发布的交易数据不会被解释、执行,也不会在任何地方进行状态访问:它只是存储在区块链的历史日志当中(写入成本很低)。
问:我们能相信序列器吗? 如果他们发布了一个无效的状态转换呢?
答:每当序列器发布一批状态转换时,都会有一个“争议期”,在这个时间段内,任何一方都可以发布一个“欺诈证明”(fraud proof),以表明其中一个状态转换是无效的。通过重广播导致链上状态转换的交易,并将结果态根与序列器发布的状态根进行比较来证明。如果状态根不匹配,则欺诈证明成功并取消状态转换。如果在无效的状态转换之后有更多的状态转换,它们也会被取消。而超过争议期的交易将不再有争议,并被视为最终交易。
问:等一下!你之前说过,如果a)增加了成本,或b)引入了新的信任假设,那就没法真正实现可扩展。那在你描述的方案中,我们不是另外假设了总有人在举报欺诈行为吗?
答:是的,我们假设有被称为“验证者”的实体负责监视欺诈行为,如果Layer 1和Layer 2状态不匹配,他们就会发布欺诈证明。我们还假设验证者能够在争议期限内,可靠地获得以太坊中包含的欺诈证明。我们认为验证者的存在,是一个“弱”假设。想象一下,如果有成千上万用户的应用,那你只需要一个人来运行一个验证器。这听起来还是很有可能的,另一方面,更改以太坊的信任模型或增加操作以太坊节点的成本,是我们不想做的“强”假设更改。当我们定义去中心化可扩展性时,这就是“有意改变底层系统的假设”的意思。
问:我同意有人会来运行验证器,因为很多参与者对这种新解决方案成功,是拥有既得利益的。但可以肯定的是,这还取决于实际花费的成本。那运行验证器和序列器的资源需求是什么呢?
答:序列器和验证器必须要运行一个以太坊全节点(不是存档节点),一个完整的L2节点,以产生L2状态。验证器运行的软件负责创建欺诈证明,而序列器运行的软件负责捆绑用户交易,并发布它们。
问:就是这样的吗?
答:是的!恭喜你!你已经重新发现了乐观汇总(Optimistic Rollup)[3],这是2019-2021年最令人期待的扩容方案。它是以太坊社区多年研究过程的最终产物,你在以上简短的对话中能够体验到这一点。
乐观汇总中的激励措施
Layer 2 扩容基于以下事实:我们试图最小化链上执行交易的数量。我们使用欺诈证明来取消可能发生的任何无效状态转换。由于欺诈证明是链上交易,因此我们也希望尽量减少在以太坊上发布的欺诈证明的数量。在理想的情况下,欺诈永远不会发生,因此欺诈证明也就不需要发布。
我们通过引入忠诚保证来消除欺诈行为。为了使用户能够建立序列器,他们必须先在以太坊上发布一份保证金,如果欺诈行为被证实,则这些资金会被没收。为了激励个人寻找欺诈行为,序列器的保证金会被削减,并分发给找到欺诈行为的验证者。
忠诚度保证金和争议期
在设计欺诈证明的激励措施时,需要调整两个参数:
- 忠诚度保证金大小:即建立序列器必须要锁定的资金量,这些资金也是验证者要追求的目标。显然,这个金额越大,成为验证者的动机就越大,而序列器进行欺诈的动机也就越小。
- 争议期限:发布欺诈证明的时间窗口,在此时间窗口之后,L2交易在L1上结算被认为是安全的。长时间的争议期,是为了提供更好的安全保障,以防止审查攻击。而较短的争议期,则可以为用户创造更好的体验,因为他们不需要等待很长时间就可以在L1上重新使用他们的资金。
在我们看来,这两个参数都没有正确的静态值,也许10 ETH保证金和1天的争议期就足够了。也许1 ETH保证金和7天争议期也是可以的。真正的答案是,这取决于作为验证者的动机(取决于运行验证器的成本)以及发布欺诈证明的容易程度(这取决于L1的拥堵程度)。这两项都应该是可调整的,无论是手动还是自动。值得一提的是,EIP1559为以太坊引入了一个新的BASEFEE操作码,可用于估计链上拥堵情况,并因此以编程方式调整争议期的持续时间。
这一惩罚机制的正确实施是至关重要的,否则将在实践过程中被利用。下面就是一个无法正常工作的简单实现示例:
- Alice抵押了1 ETH保证金,这让她建立了一个序列器;
- Alice发布了一个虚假的状态更新;
- Bob注意到了这一点,并对其发起争议挑战,如果挑战成功,这会导致Alice抵押的1 ETH保证金转到Bob的账户,并取消欺诈性状态更新;
- Alice注意到了这个争议挑战,她也发起争议挑战(挑战自己!);
- Alice收到了自己的1 ETH,实际上她并没有支付罚款,即使她试图欺诈了;
Alice可以通过“抢先交易”发起攻击,即广播与Bob相同的交易,但支付更高的gas费用,这导致Alice的交易先于Bob的交易执行。这意味着Alice可始终尝试以最小的成本(仅以太坊交易费)进行欺诈。
解决这个问题的方法是简单的:不将全部保证金授予争议挑战方,而是燃烧掉其中的X%。在上面的例子中,如果我们燃烧掉50%,Alice将收到0.5 ETH的回报,这将是一个足够的抑制措施,导致她不会尝试第二次作弊。当然,这种烧制机制会降低用户运行验证器的动机(因为奖励变少了),因此燃烧后的保证金奖励,应该足够多以吸引到验证者。
关于针对乐观汇总的批评以及我们的回应
现在,我们已经完成了乐观汇总的基础构建块,让我们探讨并解决针对该机制的一些批评问题。
问题1:长时间的退出/争议期对采用及可组合性而言是不利的,这是致命的
上面我们提到,长期的争议期对安全而言是有很大好处的,但这里似乎有一个内在的权衡问题:长时间的争议期不利于采用,因为任何想要从中提取资金的用户都需要等待很长的时间,比如说7天。而较短的争议期,尽管对用户来说可以有更流畅的体验,但这样就需要冒着欺诈发生的风险,没有争议会被及时包含进来。
我们不认为这是一个问题,由于这一潜在的大规模退市延迟,我们预计做市商将介入并提供更快的退市服务。这是可能的,因为验证L2状态的人,可以正确判断取款是否属于欺诈,从而以小折扣购买他们的服务。下面就是一个例子:
参与者:
- Alice在L2上有5 ETH;
- Bob:“做市商”智能合约的L1上有4.95 ETH,并且正在L2上运行验证器;
步骤:
- Alice让Bob知道她想要“快速”提款,并向他提供0.05 ETH的费用;
- Alice向 Bob的“做市商”智能合约发起一笔提款交易;
- 可能会发生两件事:(1)Bob在L2验证器上检查取款是否有效,并批准快速取款。这会立即将4.95 ETH转到Alice的L1地址。在取款期结束后,Bob 可以申领5 ETH,从而获得可观的利润。
(2)Bob的验证器提醒他这笔交易是无效的,Bob对该交易引起的状态转换提出异议,取消了交易并赢得了允许恶意交易发生的序列器保证金。
Alice要么很老实,立即拿出她的资金,要么不老实,然后受到惩罚。如果有这项服务的需求,我们预计向这些做市商支付的费用,会随着时间的推移而压缩,最终使该程序对用户完全不可见。
这个功能最重要的含义是,它可以与L1合约实现组合,而不必等待整个争议期。
请注意,这项技术首先在“简单快速取款”中进行了介绍。
问题2:矿工有可能会被贿赂,以审查取款,破坏OR的安全
在“乐观汇总近乎零成本攻击场景”中,有人会认为,矿工的激励机制如此之大,以至于序列器与以太坊矿工合谋审查任何争议交易都是微不足道的。考虑到对安全性的依赖,这对任何乐观系统来说都是致命的。
我们不同意这个观点,我们认为,诚实的一方将总是愿意贿赂矿工,甚至要比恶意方更多。此外,矿工每次通过帮助恶意一方获胜而背离“诚实”行为,都要付出额外的代价。这种行为会破坏以太坊的价值,这可能会增加矿工参与以太坊的成本。
事实上,学术文献中已经研究过这种情况,证明了“这种反击的威胁导致了一个子博弈完美均衡,在这种均衡中,不会有人先去进行攻击。”
我们要感谢Hasu提供的论文证据。
问题3:验证者的困境,造成了阻碍验证者操作的障碍
Ed Felten为验证者的困境撰写了一些出色的分析和解决方法,我们总结如下:
- 如果这个系统的激励措施按预期运行,则没有人会作弊;
- 如果没有人作弊,那么运行验证器就没有意义了,因为运行验证器赚不到钱;
- 因为没有人运行验证器,所以序列器最终会有机会作弊;
- 序列器作弊,系统不再按预期运行;
听起来这很重要,而且几乎是自相矛盾的!假设奖励的大小是固定的,更多的验证者会减少单个验证者的预期支付。此外,更多的验证者似乎缩小了奖励大小,因为欺诈发生较少,这进一步加剧了问题。在后续的分析中,Felten还提供了一种解决验证者困境的方法。
我想站在相反的立场说这件事,验证者的困境并不像批评者说的那么重要。在实践当中,作为验证者存在着与金钱无关的激励。例如,如果你是一个建立在rollup之上的大型应用商,或者你是代币持有者,如果系统发生故障,那么你的应用将无法工作,或者你的代币价值将会变少。除此之外,快速取款的需求为做市商验证者的存在创造了动力(如上一节所述),而与欺诈行为无关。为了更具体地说明这一点,比特币没有提供存储整个区块链历史记录或将你的本地数据提供给对等节点的激励,但是人们还是会无私地这样做。
即使在真空中运行验证器与激励机制不兼容,它也能保证系统的安全,这对于投资于系统成功的实体来说是最重要的。因此,我们认为没有必要设计机制来解决乐观第二层系统中验证者的困境。
结论
与文章的标题一致,我们分析了以太坊在2021年最重要的技术方案之一:乐观汇总(Optimistic Rollup)。
总结一下这种方案的好处:OR作为一种以太坊扩容方案,它继承了以太坊主网的安全性、可组合性以及开发人员的护城河,同时提高了性能,并且没有对以太坊用户的成本或信任要求产生实质性影响。我们探索了使乐观汇总起作用的激励结构,并对常见批评进行了回应。
作为补充阅读,我们推荐大家阅读Vitalik的《Rollup和信任模型的不完整指南》这篇文章,我们还建议大家研究下OR的近亲ZK Rollup,我们在StarkWare的朋友就是构建的这类方案。最后,还有其他方法可以实现去中心化的可扩展性,例如分片和状态通道,它们也都有各自的优缺点。
我们要感谢Hasu,Patrick McCorry,Liam Horne,Ben Jones,Kobi Gurkan和Dave White为本文提供的宝贵反馈意见。