干货 | 技术比较:Optimistic Rollup vs. ZK Rollup(Part-1)

2019-11-08 评论

作者: Alex Gluchowski

翻译: 阿剑

编者注:原标题为《干货 | Optimistic Rollup vs. ZK Rollup:一探究竟,Part-1》

 

声明:本文的作者自 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 年夏天,代号为 PLONK 和 Marlin 的技术继承了这条路线。这几种技术都有一个共同特点:虽然整个方案仍然需要受信任初始设置,但这时候的初始设置是普遍性的(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 交易成本)应该不会有太大改变。除非带宽整体变得更加便宜。

(未完)