干货

Optimistic Rollup vs. ZK Rollup:一探究竟

曾汨   |     |   562 次阅读

Default featured image huge

1

-插图:擎天柱(Optimus Prime)vs. 飞翼高达零式(Wing Zero)-

声明:本文的作者自 ZK-Rollup 的概念形成以来就一直在开发 ZK-Rollup,因此不可避免会带有一些偏见。不过,我的经验也让我很适合从技术的角度深入分析和比较这两种解决方案。

摘要

Optimistic Rollup 是一种近期提出的、旨在扩展以太坊上智能合约通用性吞吐量的技术。如果开发相对较快的话,它就可以为迁移现有的 dApp 和服务提供一种简单的方案,而且为此付出的 安全性/可扩展性 牺牲也不会太大。它能帮助 Eth1.0 适应不断增长的需求。

而 ZK Rollup 是一种更复杂的技术。今时今日它可以用于代币转移和定制化的应用。不过,真要用它来实现通用性智能合约,就需要更长时间,甚至需要更多研究工作来把 EVM 高效封装进零知识证明。不过好事情是,一旦 ZK Rollup 开发完成,现在所有的以太坊 dApp 和服务都可以平滑迁移到 ZK Rollup 上,无需花太多力气。

ZK Rollup 可以解决 Optimistic Rollup 上的几个根本问题:

  • 消除了令人厌恶的尾部风险:通过复杂但可行的攻击方法从 OR 中盗取资金
  • 将提取资金的时间从 1-2 周缩减到几分钟
  • 支持快速的交易确认和退出,而且体量几无上限
  • 默认保护隐私

对 ZK Rollup 来说,Optimistic Rollup 的出现是个好消息。迁移到 Layer-2 扩展方案上需要对钱包、预言机、dApp 和用户习惯的巨大变更。Optimistic Rollup 可以帮助整个生态为这样的迁移作好准备,并为那些当前还没有办法构建到 ZK Rollup 之上的应用提供了扩展途径。这就给了 ZK Rollup 时间来成长、使 ZK Rollup 的普及可以尽可能顺利,同时保持以太坊的增长势头。

Rollup 101

什么是 Rollup?

Rollup 是一种类似于 Plasma 的 Layer-2 扩展方案:用主链上的单个合约来保管所有的资金,并保存一条指向 “侧链” 状态的简洁密码学承诺(通常来说就是一棵由账户、账户余额等状态组成的默克尔树)。侧链的状态是由用户以及链下运营者来维护的,不会占用 Layer-1 的存储空间(这种对存储空间的节约才是可扩展性优势的最大来源)。

Rollup 与 Plasma 有所不同的是,Plasma 会面临交易数据可用性的问题(也是 Plasma 最大的问题)。而 Rollup 则通过在 Layer-1 网络上为每一笔交易公开一些数据解决了这个问题(具体而言,在以太坊上是通过 CALLDATA 交易来实现这个目标的)。因此,几千笔交易可以被打包(roll up)到一个 Rollup 区块中。虽然这种方法的开销是 O(n),也就是说它的开销会随着交易数量的增加而严格线性增长,但它也提供了实用的 100 倍吞吐量提升,因为 CALLDATA 的开销要比 Layer-1 的存储和计算便宜很多。

Rollup 也一再被 Vitalik Buterin 认可为他最喜欢的 Layer-2 扩展方案

根据状态转换有效性的保证方式不同,可区分出来两种 Rollup 方案:ZK Rollup 以及 Optimistic Rollup。两种方案的简史在 此文 中有清晰的阐释。

什么是 ZK-Rollup(ZKR)?

在一个 ZK-Rollup 系统中,运营者(们)必须为每一次状态转换提供一个简洁的零知识证明(SNARK);该证明将由主链上的 Rollup 合约来验证。这样的一个 SNARK 证明了存在一些交易,这些交易是由发起人正确签名过的,并且正确地更新了相关账户的余额,并使旧的默克尔根值变为代表新状态的新值。这就杜绝了运营者提交无效状态或篡改状态的可能。

可以在 EthResearch 论坛Matt Labs 博文 处找到更多技术细节。你也可以尝试一下 Matter Labs 用于 ERC-20 代币转账的 ZK Rollup 在线 demo

什么是 Optimistic Rollup?

在一个 Optimistic Rollup 系统中,运营者发布新的状态根时无需每次都接受 Rollup 智能合约的检验。相反,每个人都假设状态转换是正确的。不过。如果有人发布了一次不正确的状态转换,其它运营者或者用户都可以指出不合法的交易并回滚不正确的区块、惩罚恶意验证者(不过,要想做到这件事,就必须时时观察 Layer-1 Rollup 合约并在每一次有人发布状态转换时亲自执行)。

OR 的理念是由 John Adler 首先构想出来的。读者可以在这篇 Optimistic Rollup AMA 中发现更多细节。向 Plasma Group 的伟大成果致敬!

开始比较吧!

灵活性:通用性计算

Optimistic Rollup

虽然 OR 可以用于专用性计算,Plasma Group 最重要的创举其实是 OVM:Optimistic 虚拟机。OVM 可以支持任意智能合约逻辑的实现。几乎所有在以太坊上可以执行的计算都可以在 OVM 上执行,包括智能合约的可组合性。它也可以给予 EVM、EWASM 或 任何其它虚拟机。

OVM 的一大长处是,如果与 EVM 搭配使用,大家就可以用 Solidity 来写码。因此,大部分现有的代码库都可以轻松移植到 OR 上。

如果 OVM 能直接重用现有的 EVM 字节码的话是最理想的,但可能没有那么简单。一个合适的实现应该要改变交易数据(CALLDATA)格式,还需要一个类似于 Truebit/Plasma Leap 的复杂 挑战/响应 协议来接收错误性证明,这就很有可能导致与 EVM 的区别,否则便不能处理极端情况。这也意味着,要让现有的合约能适应 OVM,还有一些工作要做。

另一个实现上的难点来源于一个事实:对大型区块的错误性证明所要求的 Gas 可能会大于 Layer-1 区块的 Gas 上限。那么这些错误性证明就必须被打散为多条 ETH 交易。

ZK Rollup

迄今为止,所有 ZK-Rollup 现有的实现(就包括您自己写的 : ) )都只支持专用性操作比如代币转移或者原子化互换。这里面有几个原因。

第一,现在还没有技术能够高效地实现不同零知识证明方案的简洁递归证明合成(succinct recursive proof composition),但是想在一个区块内对不同智能合约做聚合执行又必然需要这样的技术。我们现在最好的方案就是椭圆曲线循环运算(cycles) 加上 Groth16(Coda 也是用的这种方案),它需要对长字段(long field)进行运算,在用于大型计算时是完全没有效率的。

第二,即便我们有了更短的字段,Groth16 也需要一个受信任初始设置流程,而且每个智能合约、每个新版本都需要独立的一个!显然,这绝对是不现实的。

我们现在只有一种不需要受信任初始设置的高效零知识证明方案,就是基于 FRI 的 STARKs,但是其中验证者仅对一小部分问题类型(可表示为简洁的算术电路的问题)才是简洁的。一个 STARK 验证者必须执行被证明的计算语句的所有约束至少一次,这就意味着我们不能对一组异构的智能合约进行迭代运算。

不过所有这一切都会在 SNORKs 到来之后改变,这是一种新一代的零知识证明方案,它背后的密码学原语与前辈们的稍有不同——最值得注意的是多项式承诺方案(polynomial commitment schemes)。这一技术是由 Sean Bowe 提出的,一开始命名为 Sonic;2019 年夏天,代号为 PLONKMarlin 的技术继承了这条路线。这几种技术都有一个共同特点:虽然整个方案仍然需要受信任初始设置,但这时候的初始设置是普遍性的(universal)且可升级的(updateable),只要做一次,就可以被任意数量的不同项目随时重用。

不过,这些证明系统所用的 Kate 多项式承诺方案,仍然需要高效的椭圆曲线循环运算来进行递归,这个高效运算现在还不能实现。这就是为什么我们对一些最新的、完全简洁且透明(没有受信任初始设置)的证明系统,,例如 Halo、SuperSonic、Fractal 以及一些 Matter Labs 团队正在开发的新东西,感到非常兴奋的原因。

长话短说:在 ZKP 上构建通用性智能合约系统的障碍在最近已被消除。ZK Rollup 完全可以支持像 EVM 一样的编程模式(包括无摩擦的可组合性和互操作性)。第一批合约可能会要求定制化的 DSL,虽然对于 Solidity 开发者来说,学习时间不会超过 1 天。最终来看,如果 ZKP 证明者技术维持当前的进步速率,我们可以预期所有现有的以太坊合约(甚至是 EWASM 合约)都可以轻松、高效地迁移。

可扩展性 & 交易费用

Optimistic Rollup

  • 根据 John Adler 的说法,当前的估计是在 EIP2028/伊斯坦布尔升级 激活之后,可以达到每笔交易只需 4k gas(译者注:当前以太坊原生交易方案是每笔交易 21k gas)
  • 换算一下,TPS 可上升到约 100
  • 有了 BLS 签名聚合技术之后,TPS 可以上升到约 500(为了不破坏 EVM 的兼容性,这个数字可能会保持很长一段时间)
  • 如果愿意打破 EVM 的兼容性,理论上的吞吐量可以直逼 ZKR 的上限

现实的吞吐量估计(以代币转移交易计):500 TPS

对现在来说可能也蛮够用了。

ZK Rollup

  • 当前,在 Matter 测试网上,每笔转账交易的公开数据成本是 16 字节;在 EIP2028/伊斯坦布尔升级 激活之后,每笔交易要消耗 272 gas
  • 此外,还有一个需要平摊的证明成本,当前的估计是 300k gas
  • 即便我们估计最坏的情况,需要付出 100 万 gas 的证明成本,预计天花板也是 2140 TPS
  • 在一些讨论中,我听到有人提出 ZKP 包括了大量的计算开销,因此是非常昂贵的。实际上,相比起 Gas 的生产费用,计算开销是微不足道的;因为 Gas 的生产要兼顾抗审查性、去中心化,它的数量才是真正的瓶颈。我们也预计,这个负面因素的影响会大幅减弱。

现实的吞吐量估计(以代币转移交易计):超过 2000 TPS —— 就快赶上 Visa 了

不过,对于大部分应用场景来说,ZK Rollup 都能提供更大的开销节约力度,因为可以(将较大的数据块移到零知识电路见证中从而)免去在公开数据中存储较大的数据块,只要这些数据不是重建状态转换 delta 所必需的就好。这里的核心观念是这样的:虽然 OR 总是需要用户发布完整的交易输入,在 ZK 中我们可以有所选择:1)发布交易输入,删去不影响状态转换的见证数据;或者 2)只发布交易输出。这样的选择可以相当优雅地实现,无需引入多少复杂性。

重要例子:

  • 在多签名钱包、类似 Argent 的账户抽象型钱包或者去中心化交易所中,用户需要提交签名,以供合约验证。这些签名对状态更新也没有用,所以也可以从公开数据中省去。
  • 像 Gnosis 的 Dfusion dutch 去中心化交易所这样的合约需要大量的数据集输入,这些数据集不会直接影响存储,只用来验证计算结果。

ETH2.0 实现以后

因为 Rollup 都会驻留在单个分片中,所以 CALLDATA 的成本(以及相应的 Rollup 交易成本)应该不会有太大改变。除非带宽整体变得更加便宜。

元交易(Meta-transaction)

两种 Rollup 方案都一样适合支持元交易和账户抽象。

安全性

Optimistic Rollup

不像支付通道,Rollup 中的所有资金都是由单个智能合约来保管的。恕我直言,Rollup 是最靠谱的扩展方向,只要成功,我们就能看到大批用户迁移到 Rollup 系统中、大量资金汇入单个合约里。一旦保管着价值百万(甚至是数十亿)美元的资产,这样的 Rollup 合约就会变成一个季度有人的蜜罐,为黑客攻击带来可观的甜头。在这种条件下,无论攻击需要多么复杂的技术,攻击者绝对不会错过任何机会。

OR 的安全模型基于两个假设:

  1. N 个参与者中至少会有 1 个诚实的参与者,会执行所有 OR 交易并在无效状态转换发布时主动提交错误性证明;
  2. 底层的 Layer-1 网络有强健的抗审查性。

诚实参与者:首先,可以合理地假设,只有 Rollup 的运营者们会真的一五一十监测和执行交易。普通用户既没有激励这么做,也没有技术手段负载得起那么高的交易吞吐量(要是有的话,还要扩展方案干嘛呢?)。不过比较好的一点是,运营者会自然被激励去检查其他运营者的区块正确性,因为要是跟在一个无效块后面继续出块也会被惩罚。

只要有足够多的可辨识参与者,1/n 诚实运营者假设就是一个合理的假设。不过。因为活跃运营者的数量也是有上限的(可能是几百个?),所以还是有可能会出现一些复杂的攻击:爆破所有运营者的基础设施(非常难,但不是不可能)、贿赂/勒索 开发工程师要求秘密加入恶意代码、攻击 rollup 软件的升级分发渠道,等等,当然还包括这几种攻击的组合拳。这些攻击都比较难,而且大家也会主动防范,但是,比起(比如说)用同样的方式来攻击以太坊矿工,这些攻击还是更有可能出现——因为对 OR 的一次成功攻击在完成、揭晓之前是悄无声息的。

Layer-1 的强健抗审查性:第二个假设更微妙一点。实际上,以太坊的设计为防止一般的审查提供了非常高效的经济机制。不过,这些机制遇到 ”逆向机制“ 时就不起作用了。攻击者可以创造一个完全自动化的贿赂机制来协调矿工的 51% 攻击,这样就能防止诚实矿工将错误性证明打包进区块。有趣的是,参与这种攻击的矿工所需付出的直接成本是零,但是有可能要付出社会成本,因为如果审查发动者被揪出来了,社区会将一腔怒火发泄出来。另一个让这一假设显得棘手的原因是,原本的机制也为攻击参与者提供了貌似合理的借口:”因为攻击者是多数一方,已经作出了可信承诺,如果我不参与的话,我的块就会被抛弃掉,所以我这么干可不是贪心,只是想避免损失呀“。

建议读者可以看看这个视频里对这种攻击的讨论,以及最近 Vitalik Buterin 对 51% 审查攻击做的分析。下面我会分享一些有趣的洞见。

这种类型的攻击,在 PoW 下是很有可能出现的,因为无法惩罚那些匿名的参与者矿工。但等转型到 PoS 之后,社区就可以通过罚没保证金来惩罚审查者矿工,如果光大社区达成了这样的共识的话。毕竟,像这样的攻击可以被认为是对整个网络的侵犯(虽然有人会认为矿工只是诚实地跟随协议在行动,而且他们也没有义务做违反自己经济利益的事)。不过,在 DAO 分叉之后的这个时代,这些举措会引起非常激烈的争论,至少会让结果不可预测。在 Vitalik 做的最近一次社区民意调查显示,63% 的受调查者都极力反对为了挽救用户而人为干预区块链的不可变更性,无论攻击的程度有多广泛。连罚没单个验证者的保证金都是困难重重,更不用说是罚没大部分人的钱了。

快速动员社区执行一场 UASF(用户激活型软分叉)、督促矿工打包特定交易,是抵御此类攻击的一个更为现实的办法。无论从工程角度还是从社会协作角度来看,这种情况都是比较复杂的,而且无疑需要相对更长的时间来证明其差 —— 少则需要一周,最好是有两周。同样地,如果多数 DeFi 运营者能够在实质上决定分叉的结果,那么最符合他们利益的做法是避免上演吵吵闹闹的崩溃事件、沉默地顺从攻击者(这样就能让以太坊依然保持在最长链上,并产生一个更少争议的结果(相对比软分叉))。

总结一下:错误性证明被审查的风险是相对较小的,但也不能否认其可能性。安排 1~2 周的挑战期、不放太多钱在里面,OR 可以是蛮不错的一个方案:运营者/矿工 犯不上要冒这样的风险串谋搞事。不过,随着 Rollup 合约中的资金越来越多,潜伏的黑天鹅也会变得越来越令人担忧,至少多疑如你肯定会发愁 : ) 。

ZK Rollup

在一条 ZK Rollup 侧链中,每一次状态转换都要先由 Rollup 智能合约验证过才能生效。所以运营者想伪造状态是不可能的。ZKR 的安全性无需依赖于 Layer-1 的审查抗性,仅在活性(liveness)上才依赖 Layer-1 审查抗性(译者注:意思是,Layer-1 上的审查攻击也不能篡改 ZKR 的状态,但有可能让 ZKR 无法响应)。所以大家不需要监控 ZKR:只要一个区块经过了验证,即使运营者拒绝合作,用户的资金也能得到足够的保障。

因此,ZKR 充分体现了 crypto 的基本理念:使用密码学和基于博弈理论的激励机制、替代了系统中的受信任第三方,实现了可靠性。

不过,为完整起见,我必须指出多个 ZKR 独有的潜在风险。

受信任第三方:如果在某个 ZK Rollup 方案中用到的零知识证明技术需要一个普遍性的受信任初始设置,那么我就必须引入 1/N 诚实参与者假设。也不好一口咬定这种风险能不能被接受,因为该假设显示与否取决于参与者的数量和质量。不过,安全无小事,这就是为什么我对高效免信任型 SNARK 技术的近期进展感到非常兴奋,尤其是我们 Matter Labs 正在开发的 这种方案

密码学:最新一代的 SNARK 技术用的是多种可靠且经过实战检验的密码学原语,而不是 Groth16。前面提到的 Matther Labs 的工作是基于 FRI 的,因此可以提供近似的后量子安全。不过,还需要两种措施来进一步完善其安全性:

  • 在实验环境下所用的安全组件的强度会远低于实际生产环境的版本,类似于 RSA challenge。一旦出现了一种可行的攻击模式,challenge 就会先于生产环境代码而被攻破,那么研究人员在实际使用的代码被攻破很久以前就可以发现这一点了。
  • 所有的状态转换都只能由 ZKR 的运营者来发送,该运营者会变成一个双因子保护层。

时延(达成可验证确定性的时间)

Optimistic Rollup

因为上面提到的安全问题,Optimistic Rollup 只有使用 1~2 周的错误性证明挑战期才足够安全。在挑战期过去以前,没有交易能被认为是确定的,无论是 Rolup 内部的交易还是退出交易。

更糟糕的是,一个终端用户是没法提前检验出交易确定与否的,除非 TA 自己把最新一个挑战期里的所有交易完整执行一遍。需要指出的是,用户不能完全放心地靠博弈机制来保证区块会被敲定,因为单个运营者节点中出了 bug(或者被黑)都有可能导致回滚。

(PoW 下)确认时间:2 周

(PoS 下)确认时间:1周

ZK Rollup

当前的 ZKP 是高度计算密集型的。如果一个区块中有 1000 笔交易,在普通的服务器上我们需要 20 分钟才能构造出一个证明。

不过(由 Matter LabsCoda 开发的)进展中的 GPU 证明器实现可以提速至少 10 倍。在不远的将来,定制化的硬件可能会实现更高的运算能力。最终,我们估计区块确认时间可以降到 1 分钟以下。

(当前)确认时间:20 分钟

(未来)确认时间:1 分钟以内

Rollup 内部交易的快速确认机制

在两种 Rollup 方案中,验证者都可以通过一些机制来实现即时交易确认,比如锁住特定数目的安全保证金,如果某个交易没有被打包到合适的区块中,这笔钱就会被罚没。这是通过经济保证来提供确定性

不过这种方法也有一些局限性。在转移同质代币(fungible token)时这种方法比较好用,但要转移非同质代币(NFT)时就会比较难(因为代币的市场价格可能很不清晰,又或者资产所有者不想立即把它 ”卖“ 掉),也不易于发起通用性的智能合约调用(因为也很难估价一笔交易如果回滚会造成多大的经济损失;一个简单的例子是:当你想接收一个预言机传来的稳定币价格的时候,运营者该押多少钱才合适呢?)。

快速取款机制

快速取款机制也类似于 Rollup 内部交易快速确认机制。运营者可以与流动性供应商合作,即时向用户兑付同质代币的流动性,使得用户无需等待退出交易在 Rollup 系统中得到确认。

这一机制会要求与确认时间成比例的大量抵押品。假设未来 OR 的交易确认时间是 1 周而 ZRK 的确认时间是 5 分钟,OR 将需要 ZKR 抵押品的 2000 倍,来实现同等的退出资金体量(以每周计)。

隐私性

Optimistic Rollup

OR 可以支持所有能在 Layer-2 上使用的所有隐私方案(混币器,等等)。因为 OR 本身是 Layer-2,所有实现出来的隐私解决方案看起来就会像 Layer-3。这样可能会导致隐私服务更加碎片化,这样反过来会导致参与匿名集合的人更少,也会让隐私保护措施的效果非常微弱(正如我们在 zcash 网络里看到的情况那样,zacsh 不是默认保护交易隐私的,所以使用隐蔽地址的人非常少)。

ZK Rollup

为了实现真正的隐私性,系统必须默认保护用户的隐私。从技术角度来看,ZKR 可以在某种程度上轻松支持在协议层默认实现代币转移的机密交易,还可以区分公开的智能合约和私密的智能合约(ZK-ZK-Rollup)。

与此同时,构建完全匿名的、像 zcash 那样的(即不仅隐去了交易数额,还隐去了交易双方)交易,则需要改变 ZK Rollup 的存储模式,从账户模式转到 UTXO 模式,这样会带来很多问题,所以不太可能这么做。

结论

Optimistic Rollup 现在在 PoC(概念验证)阶段。我们希望不久就能看到产品级的实现出来。如果证明了现有代码可以相对容易地迁移到 OR 上,众多项目都会开始接受它并构建新的基础设施:对 Layer-2 的支持会出现在钱包里,预言机也会开始将信息广播到 OR 里,等等。

ZK Rollup 对于专门的应用(比如 ERC-20 代币转账)已经比较成熟,但要实现完全通用的智能合约系统就必须采取更为迂回的道路。最终,可能可以将任意基于 EVM 和 WASM 的智能合约都装载到 ZK Rollup 上——以目前的技术发展速度,这个阶段看来不会太遥远。

两种 Rollup 都要求钱包、预言机和其它智能合约组件上的基础设施变更。这需要很大的工作量,但会因为越来越多项目对 Layer-2 扩展技术感兴趣而逐渐加速。因为 OR 比起 ZK-Rollup 更早承诺要实现基于 EVM 的通用智能合约系统,这会给社区一个很大的动力去接受 Layer-2 方案。

对于用户和 dApp 来说,从一个 Rollup 系统转移到另一个 Rollup系统会比一开始从以太坊 Layer-1 迁移到 Layer-2 上要容易。链桥会让整个过程更加平滑。因为这种切换的编辑性,我个人认为,有最好用户体验的方案在长期可能成为通吃的唯一赢家。

无论结果如何,这都是一场非常重大且激动人心的烟花,值得一观。不论鹿死谁手,以太坊社区都是最终的赢家。

(完)


原文链接: https://medium.com/matter-labs/optimistic-vs-zk-rollup-deep-dive-ea141e71e075
作者: Alex Gluchowski
翻译: 阿剑


你可能还会喜欢:

引介 | Layer 2 方案概览:从状态通道到 Roll Up
科普 | ZK Rollup & Optimistic Rollup
干货 | 理解以太坊的第 2 层扩展方案

 
0 人喜欢