原文标题:《A comparison of zkEVMs》
原文作者:Daniel Lubarov
原文编译:Kxp,BlockBeats
随着「zkEVM 战争」的升温,公众讨论了许多关于不同 zkEVM 的优点。但也存在一些错误的信息,因此我们想澄清一些关于 Polygon zkEVM 以及它与其他项目的比较的事实。
作为 Polygon 的一名员工,我有偏见,但我会尽力保持比较公正。我主要关注 Polygon 的 zkEVM 和 zkSync Era,因为它们已经投入生产使用,并且我不太了解其他 zkEVM 项目。
zkSync 的 zkEVM 和证明器由 100 k 多行代码组成。我尽力提供准确的摘要,如果有任何不准确之处,请告诉我,我会进行更正。
EVM 兼容性
Polygon zkEVM 直接执行 EVM 字节码。根据 Vitalik 的分类,它是一种类型 3 的 zkEVM。很快它将成为类型 2 ;目前我们缺少四个预编译。Scroll 也在努力向类型 2 zkEVM 发展。
相比之下,zkSync Era 使用不同的字节码格式,通过提供编译器来支持 Solidity。这使它成为一种类型 4 的 zkEVM:它支持 Solidity,但不支持 EVM 字节码本身。例如 Hardhat 这样的工具不能直接使用,尽管可以使用 zkSync 的插件。
zkSync 认为他们的 zkVM 更加具有未来性,即它可以更好地与 Solidity 以外的语言配合使用。但是,他们的 VM 似乎继承了 EVM 的许多性能特征,例如其 256 位字大小。像 Miden 这样的 zkVM 可能更具有未来性,因为它是为通用计算而设计的,而不是专注于 Solidity。
性能
性能一直是 Polygon 的重点,我们的 zkEVM 非常高效。在 CPU 上运行我们的证明器的成本大约为每笔交易 0.000084 美元。
虽然我们没有找到任何关于 zkSync 的 zkEVM 的工作基准,但我们怀疑由于我们非常不同的 ZK 技术选择,存在着很大的性能差距。
域选择
经过研究多个替代方案,我们选择了所谓的 Goldilocks field,一个二阶巨大素数域 2 ^ 64 – 2 ^ 32 + 1 。它的小尺寸和美丽的二进制结构导致了极快的域操作,乘法仅需在现代 CPU 上花费不到两个周期。
zkSync 采用了更传统的方法,使用基于 alt-bn 128 曲线的 SNARK。基础域的大小约为 254 位,域乘法在 CPU 上需要大约 80 个周期。
为了感受到这种巨大差异的影响,我们可以看看 Celer 的 SHA 2 基准测试。在那里,我们的 STARK 证明器比基于椭圆曲线的证明器快了 5-50 倍。
alt-bn 128 的优点在于 EVM 原生支持它,因此向 Ethereum 提交证明更简单。在 Polygon,我们将最终的聚合证明用 alt-bn 128 的 fflonk 证明「包裹」起来。虽然我们的方法需要更多的工作,但我们认为这对于不可思议的性能增益来说是值得的。
算术化
区别不止于此。我们的 zkEVM 基于 STARKs 构建,但具有现代化的变化。我们有一个主 STARK 用于 CPU(每个周期有一行),还有其他用于算术、哈希等的 STARK。这些表格可以连接,就像我们在 RapidUp 中描述的那样。这类似于物理 CPU,它们经常有协处理器来加速渲染、Crypto 或 ML 推断等密集操作。
以 Keccak 为例。由于它在 EVM 应用中被广泛使用,我们设计了一个专门的 STARK 用于它,使用了一些我们在这里记录的新技巧。设计这样的定制算术化需要大量的工作,但它带来了回报,使我们能够每秒证明数百个 Keccak 排列。
zkSync 采用了我称之为更传统的方法。他们使用基于 PLONK 的证明器,尽管它支持自定义门,但他们的 zkEVM 并没有多少使用;大多数计算都是使用一个名为 SelectorOptimizedWidth 4 MainGateWithDNext 的通用门进行的。它似乎比 vanilla PLONK 门稍微强大一些,但仍然局限于像 mul-adds 这样的简单操作。
值得赞扬的是,zkSync 使用了查找参数(像我们一样),这是一种更现代的技术,可以帮助提高像 Keccak 这样的效率。但是,没有自定义算术化, 256 位数学、Keccak 等等的效率都会大打折扣。
安全性
Polygon 非常重视安全性,我们的 zkEVM 经过了两次独立审计:一次是由 Spearbit 进行的,另一次是由 Hexens 进行的。两份报告都可以在这里公开查看。我们还发布了验证部署的说明。
我们不知道 zkSync 的 zkEVM 是否经过任何公开审计。zkSync 的网站列出了桥接合约的审计,但没有 zkEVM 本身的审计。
除了审计外,两个项目都有各种「安全备胎」,以提供备用的安全层,但这是一个很深的话题,我在这里不会详细介绍。
L1 数据
Polygon zkEVM 将所有交易数据发布到 L1。在 Twitter 上存在一些关于此的混淆,有关此的 Gas 费用请参见 Edu 的文章。目前,平均交易大小约为 120 字节,因此每笔交易的 Gas 费用约为 120* 16 = 1920 Gas。
zkSync 则发布状态差异。恶意的序列化器可能会隐瞒交易数据,但 zkSync 认为拥有当前状态的 trie 足以确保安全。这似乎存在争议,因为通常预期交易数据是可用的,并且某些应用程序依赖于此。
查看经过更正的数据后,我们可以发现我们的 zkEVM 和 zkSync 的每笔交易 Gas 费用基本相同。这些数字可能会随着每个链上发生的交易类型的混合而随时间变化,但截至今日,状态差异并没有节省任何 Gas 费用;两个系统都向 L1 发送大约 120 字节的每笔交易数据。
我们计划在这里进行一些优化,但不使用状态差异。交易本身可以进行压缩,降低 Gas 费用,同时仍能保证交易数据的可用性。敬请期待!