# 粉碎指南：zkEVM、EVM 兼容性 & Rollups

By [W3.Hitchhiker](https://paragraph.com/@w3hitchhiker) · 2022-08-18

---

**_原文：_**

[

Ground Up Guide: zkEVM, EVM Compatibility & Rollups
---------------------------------------------------

Ground Up Guide: zkEVM, EVM Compatibility & Rollups ZK-rollups have long been regarded as the endgame of Ethereum scaling. However, despite their importance to the Ethereum scaling roadmap, there is ...

https://immutableblog.medium.com

![](https://storage.googleapis.com/papyrus_images/42cec886d96420c198c911d09f9dbe644a21ae2a0d62763121a0d5d0902bee60.png)

](https://immutablex.medium.com/ground-up-guide-zkevm-evm-compatibility-rollups-787b6e88108e)

**_译者：Hakeen_**

**_修订：Evelyn_**

ZK-rollup长期以来被视为以太坊拓展性的终局。然而，尽管他们对以太坊拓展路线很重要，但在几个关键点上仍有几点不确定性：

1.  到底什么是zk-rollup？
    
2.  针对应用优化的rollups和通用rollups的区别是什么？
    
3.  什么是zk-EVM rollup？像EVM等效行和EVM兼容性等术语究竟是何意义，并且其如何适用于rollups的？
    
4.  Zk-rollup生态系统的现状如何，这对我的项目又意味着什么？
    

如果你是一个希望了解以太坊扩展的下一阶段的开发者，那希望这篇文章能对你有所帮助。

什么是zk-rollup？
-------------

Zk-rollup的主要实现是：证明系统如[STARKs/sSNARKs](https://consensys.net/blog/blockchain-explained/zero-knowledge-proofs-starks-vs-snarks/)，使用亚线性的处理流程来验证线性的语句数量（例如，1000个语句 → 10个验证人确认，而10000个语句只需要11个验证人去确认），这个特性就能让我们处理大量的区块链交易流程：

1.  用户抵押其资产在L1的zk-rollup 智能合约上
    
2.  用户提交包括这些资产的交易给L2的sequencer，sequencer把交易集合到有序的批次中，并且生成有效性证明，例如stark/snark，最后更新状态。
    
3.  这个状态更新和证明被提交给我们的L1 zk-rollup智能合约，并由其验证，用于更新我们的L1状态
    
4.  用户可以使用这个L1状态（取决于[不同的数据可用性机制](https://medium.com/starkware/volition-and-the-emerging-data-availability-spectrum-87e8bfa09bb)）来检索他们的资产，从而实现完全的自我托管和 "以太坊安全性"
    

![（Simplified ZK-Rollup Architecture）](https://storage.googleapis.com/papyrus_images/85f03fcf1b22f29d6f7e1398ed14ae921c63430fe148d6aea432e42956e1d78d.png)

（Simplified ZK-Rollup Architecture）

在这里，只要我们核实验证的gas成本与交易规模呈现亚线性的关系，那么就可以验证更大规模的交易。要想更详细地了解这个过程，我推荐Vitalik的[Incomplete Guide to Rollups](https://vitalik.ca/general/2021/01/05/rollup.html)或Delphi新发布的 [Complete Guide to Rollups](https://members.delphidigital.io/reports/the-complete-guide-to-rollups/)。

针对应用优化的rollups和通用rollups的区别是什么？
-------------------------------

在特定于应用的rollups中，rollup支持由rollup运算符定义的固定数量的状态更改。这可以优化某些应用，如：

*   [Loopring](https://loopring.org/#/) — Payments & Swaps
    
*   [Immutable](https://immutable.com/) — NFT Minting & Trading, Games
    
*   [dydx](https://dydx.exchange/) — Perpetuals Trading
    

特定于应用程序的汇总非常适合扩展特定的、易于理解的问题。如果您作为项目的需求可以通过特定于应用程序的汇总来满足，那么您可能会为您的用例获得更好的性能、更好的用户体验和更好的定价，因为它们缺乏泛化性是一个巨大的优势。例如，在 Immutable，我们能够通过补贴免费的 NFT 铸币厂和对 NFT 交易收取费用的转账来[消除 gas 费用](https://immutablex.medium.com/fees-on-immutable-x-79d3e7207b12)——这种权衡只有在 rollup 状态转换的可预测性质下才有可能。

但是，许多项目希望能够创建自己的自定义逻辑和智能合约，独立于汇总运算符，这在特定于应用程序的汇总中是不可能的。此外，许多 DeFi 项目需要“可组合性”，或与其他项目进行原子交互的能力（例如，许多 DeFi 项目使用 Uniswap 作为价格预言机）。只有当您的汇总不仅支持自定义代码，而且支持任何用户可以部署的本机智能合约时，组合性才是可能的。为了实现这一点，我们需要修改 zk-rollup 的架构以概括我们的每个组件。

![](https://storage.googleapis.com/papyrus_images/ba821eea1815711077b576e58c2b08c7898d81155db81ba0b201e283662d4fee.png)

这种增加的灵活性有几个权衡：性能大大降低，汇总参数的可定制性降低以及费用更高。然而，最大的权衡是根本没有通用 zk-rollups 的实现，当然也没有能够生产量的实现。但这开始改变：

*   [StarkNet](https://starkware.co/starknet/) 目前在主网上运行（尽管处于有限的 Alpha 阶段）
    
*   3 个独立的项目 ([zkSync](https://twitter.com/zksync/status/1549757888641437696), [Polygon Hermez/zkEVM](https://twitter.com/0xPolygon/status/1549716947847479302) 和 [Scroll](https://twitter.com/Scroll_ZKP/status/1549268276152500225))都在 ETH CC 2022 上宣布它们将成为第一个进入主网的“zkEVM”
    

这些最后的公告值得深入研究，因为这些团队不仅宣布了通用汇总，他们还宣布了“zkEVM”。随之而来的是许多围绕“EVM 兼容性”、“EVM 等效性”、“真正的 zkEVM”以及哪种方法更好而展开的大量[推特争论](https://twitter.com/gluk64/status/1550375525016895488)。

什么是zk-EVM？EVM等效行和EVM兼容性术语的意义，并且其如何与rollup相结合？
---------------------------------------------

理解虚拟机
-----

以太坊虚拟机是执行以太坊交易的运行时环境，最初在[以太坊黄皮书](https://ethereum.github.io/yellowpaper/paper.pdf)中定义，后来被一系列[以太坊改进提案](https://eips.ethereum.org/)（EIP）修改。它由以下部分组成：

*   用于执行程序的标准“机器”，每个事务具有易失性“内存”，事务可以写入的持久“存储”和操作“堆栈”
    
*   在这台机器中执行状态转换的约 140 个“操作码”
    

![（Diagram from https://takenobu-hs.github.io/downloads/ethereum_evm_illustrated.pdf）](https://storage.googleapis.com/papyrus_images/67a862471857536b5698b7638bcb7d6e6941e744357cbc1bf09ed26a81cc756d.png)

（Diagram from https://takenobu-hs.github.io/downloads/ethereum\_evm\_illustrated.pdf）

我们的虚拟机的一些示例操作码：

*   堆栈操作 —— PUSH1（向堆栈添加一些内容）
    
*   算术运算 —— ADD（加数字），SUBTRACT
    
*   状态操作——SSTORE（存储数据），SLOAD（加载数据）
    
*   事务操作——CALLDATA、BLOCKNUMBER（返回有关当前执行事务的信息）
    

EVM 程序只是一系列这些操作码和参数。当这些程序被表示为一个连续的代码块时，我们将结果称为“字节码”（通常表示为一个长的十六进制字符串）。

![](https://storage.googleapis.com/papyrus_images/c869eebbe83592a6bf0d8225f1495abd125dd98594d2c2f883dd4018217668be.png)

通过将大量这些操作码组合成一个执行序列，我们可以创建任意程序。以太坊使用自定义虚拟机，而不是调整现有的 VM，因为它有独特的需求：

*   每一个操作都必须有“成本”来防止滥用（因为所有节点都运行所有的交易）
    
*   每一个操作必须确定（因为所有节点都将同意更改后的状态）
    
*   我们需要专门针对区块链的概念（如智能合约，交易）
    
*   一些复杂操作需要成为原语（如密码学）
    
*   交易必须是沙盒的，没有I/O或者外部状态访问
    

EVM 是第一个图灵完备的（也有准图灵完备的说法）区块链虚拟机，于 2015 年发布。它有一些设计限制，但其巨大的先发优势和随后的广泛采用为以太坊创造了巨大的差异化优势——它是迄今为止整个空间中最经得起考验的智能合约基础设施。

由于以太坊的主导地位，很多后来的区块链都直接采用了这种运行时环境。例如，Polygon 和 BNBChain 是以太坊的直接分支，因此使用 EVM 作为它们的运行时间。值得注意的是，EVM 并非一成不变，并且在 EIP1559 等升级中经常被修改。由于其他区块链需要时间进行更新，或者在多个地方与以太坊有所不同，它们通常运行着稍微过时的 EVM 版本，并且难以跟上变化的步伐——这一事实可能会[让以太坊的核心开发人员感到沮丧](https://twitter.com/peter_szilagyi/status/1550045859093499904)。

以太坊的兼容性
-------

然而，人们所说的“EVM 链”通常不仅仅只是镜像这个运行时环境。有几个主要规范始于以太坊并已成为事实上的全球标准：

*   [Solidity](https://soliditylang.org/)（一种编译成 EVM 字节码的高级语言）
    
*   [以太坊的 JSON-RPC 客户端 API](https://ethereum.github.io/execution-apis/api-documentation/)（与以太坊节点交互的规范）
    
*   ERC20/ERC721（以太坊代币标准）
    
*   [ethers.js](https://github.com/ethers-io/ethers.js/)（一个与以太坊接口的网络库）
    
*   以太坊的密码学（例如 keccak256 作为散列函数，ECDSA 签名在 [secp256k1](https://en.bitcoin.it/wiki/Secp256k1) 上）
    

从技术上讲，您的链可能有一个 EVM 运行时而不支持上述部分或全部。然而，遵守这些标准使得在你的新链上使用以太坊工具变得更加容易。一个很好的例子是 Polygon，它除了使用上述所有工具外，还能够运行 Etherscan ([Polygonscan](https://polygonscan.com/)) 的分叉版本，使用 [Hardhat](https://hardhat.org/) 等以太坊开发工具，并在 Metamask 等钱包中被支持为不同的以太坊“网络”。像 [Nansen](https://www.nansen.ai/) 和 [Dune](https://dune.com/home) 等工具最初都针对以太坊，因此添加对新 EVM 区块链的支持很简单。新钱包，新 NFT 市场——如果以太坊界面和你的链界面之间的唯一区别是链 ID，那么你可能是第一个也是最容易添加的。话虽如此，这些工具是为以太坊构建的——一旦你开始修改你的区块链（例如更大的块，更快的块时间），你就有破坏它们的风险。没有完美的兼容性。

尽管如此，针对以太坊规范的工具和应用程序的数量为新的区块链创造了巨大的动力，使其仅仅反映以太坊标准。任何不支持上述规范的区块链在涉及开发者工具时都会自动落后，并有可能随着EVM生态系统的发展而进一步落后。

我的认知是，“EVM 兼容”一词实际上不足以描述这里描述的网络效应——我们实际描述的是“以太坊兼容性”，并且远远超出了智能合约执行环境，延伸到了整个以太坊生态系统和工具集。

为了解决这个问题，像 Solana 这样的非 EVM 区块链必须创建完全平行的生态系统，这会降低它们的速度，并且更难吸引现有的开发人员。但是，不需要遵守这些标准确实使非 EVM 区块链能够对以太坊工具集进行更根本的更改，从而更积极地与以太坊区分开来。创建 EVM 区块链非常简单——但为什么有人会使用你的区块链而不是[其他数百个](https://chainlist.org/) "快速EVM区块链 "中的一个。如果能克服建立一个成功的平行链和围绕其生态系统的困难，Solana 已经证明：a）你可以吸引出色的原生应用程序（例如 MagicEden、Phantom）和 b）如果商业激励就足够了（例如 Opensea [添加 Solana 支持](https://decrypt.co/96334/opensea-solana-nfts-april)）。

![（Why does Medium not support tables?）](https://storage.googleapis.com/papyrus_images/cf14e258c467f6b1e5c42d30b90e72f5f4d34a7310da13607ac17322d19eb89b.png)

（Why does Medium not support tables?）

ZK-EVM
------

通用rollups都有一个共同目标：让开发人员和用户尽快生成网络效应。这需要结合创造最高性能的rollup技术、拥有最好的 BD 团队以及进行最早或最有效的营销。但是，所有rullup团队（出于上述原因）都非常关注：

*   将现有的以太坊合约（和开发人员）迁移到他们的rollup中
    
*   受到现有 EVM 工具（例如库、钱包、市场等）的支持
    

实现这两个目标的最简单方法是创建一个“zkEVM”：一个通用汇总，将 EVM 作为其智能合约引擎运行，并保持与以太坊生态系统通用接口的兼容性，如上所述。

然而，这并不像分叉 Geth 那样容易，就像我们从头开始创建新的 L1 区块链时那样容易。我们的目标是运行 EVM 字节码——但 ZK 证明需要将它们证明的所有计算语句转换为一种非常特定的格式——一种“代数电路”，然后可以将其编译成 STARK 或 SNARK。为了快速了解“电路”，这里有一个[例子](https://crypto.stackexchange.com/questions/87371/how-to-construct-a-circuit-in-zksnark)（使用更直观的[布尔电路](https://en.wikipedia.org/wiki/Boolean_circuit)作为[算术电路](https://en.wikipedia.org/wiki/Arithmetic_circuit_complexity)的特例）。在基于这个简单电路的 zkSNARK 系统中，我们的证明者希望让验证者相信他们知道输入（𝑥1 = 1，𝑥2 = 1，𝑥3= 0），这些输入会产生真实的输出。这是一个非常简单的电路，具有有限数量的[逻辑门](https://www.electronics-tutorials.ws/boolean/bool_7.html)——我相信你可以想象需要多少门来编码一个证明复杂智能合约交互的电路，尤其是那些涉及密码学的！

![](https://storage.googleapis.com/papyrus_images/b7667b83f660ea2193caeb4a8ed3d6892851eaa535aa3ff01a37e1c73dcd068d.png)

为了理解这个编译过程的每一步，我推荐 Vitalik 的[SNARKs 从零到英雄指南](https://medium.com/@VitalikButerin/quadratic-arithmetic-programs-from-zero-to-hero-f6d558cea649)，以及 Eli Ben-Sasson[对不同证明系统的讨论](https://medium.com/starkware/the-cambrian-explosion-of-crypto-proofs-7ac080ac9aed)。然而，对于我们的目的来说，这种更深入的理解并不是必需的——请记住，为了支持 EVM 计算，我们必须将所有 EVM 程序转换为这些电路，以便以后可以证明它们。

从广义上讲，有几种方法可以做到这一点（归根结底是底层电路和evm本身的兼容性问题如何解决）：

1.  通过将其转换为可验证的电路来直接证明 EVM 执行轨迹
    
2.  创建一个自定义 VM，将 EVM 操作码映射到该 VM 的操作码，然后证明该自定义环境中跟踪的正确性
    
3.  创建自定义 VM，将 Solidity 转换为自定义 VM 的字节码（直接或通过自定义高级语言），并在自定义环境中进行验证
    

对以太坊的兼容性是从上至下的。

选择一： 证明EVM执行轨迹
--------------

### Scroll

让我们从最直观的开始：证明EVM执行轨迹本身，这种方法目前正在由[Scroll](https://scroll.io/)团队（与以太坊基金会的[隐私扩展小组](https://twitter.com/PrivacyScaling)一起）研究。为了使其发挥作用，[我们需要](https://scroll.io/blog/zkEVM)：

1.  为一些加密累积器设计一个电路（允许我们验证我们正在准确地读取存储和加载正确的字节码）。
    
2.  设计一个电路来以正确的执行路线连接字节码
    
3.  为每一个opcode设计一个电路（允许我们证明读写计算都是正确的）
    

以电路的方式直接实现每一个evm opcode是具有挑战性的，但是因为这个方式是对EVM的直接镜像，这对于维护行，稳定性和工具支持具有潜在益处。下图显示，Scroll和Ethereum之间唯一的理论区别是实际运行环境。然而，值得注意的是，Scroll目前并没有通过这种机制支持所有的EVM操作码，尽管他们打算随着时间的推移达到平价。

![](https://storage.googleapis.com/papyrus_images/e0b20eeb4457b6ef74f005f602612b671bcee251d827db37e36b1080d7f678ee.png)

[Optimism 团队](https://medium.com/ethereum-optimism/introducing-evm-equivalence-5c2021deb306)对此进行了精彩的讨论，尽管是在optimistic rollups的背景下进行的。 Optimism 最初创建了一个自定义的 Optimistic 虚拟机(OVM) 作为其rollup的执行环境。 OVM 是“与以太坊兼容的”，这意味着它可以运行修改后的 Solidity 代码，但几个低级不匹配的领域意味着经常需要重写以太坊工具和复杂代码。因此，Optimism 转而使用“EVM 等效”，直接使用确切的 EVM 规范，并正在开发[第一个等效于 EVM 的欺诈证明系统](https://github.com/geohot/cannon)。然而，optimistic rollup不需要担心电路或证明者的效率——Optimism的正确选择可能不是我们rollup的正确选择。

不幸的是，EVM的核心基础设施并适合于zk-rollups。衡量rollup性能的一个核心指标是我们需要将某个计算编码到电路中的 "约束 "的数量。在许多案列中，直接镜像EVM会导致许多的过载。例如，EVM使用256bit的整数，然而zk证明很自然的在[素数有限域](https://github.com/starkware-industries/stark101#finite-fields)下工作。引入范围检查来对抗不匹配的域的算术，每个EVM步骤增加了约100个约束。以太坊的存储布局严重依赖keccak256，它的电路形式比STARK友好的哈希函数（如[Poseidon](https://eprint.iacr.org/2019/458.pdf)，[Pedersen](https://iden3-docs.readthedocs.io/en/latest/iden3_repos/research/publications/zkproof-standards-workshop-2/pedersen-hash/pedersen.html)）大1000倍 —— 但替换keccak将对现有的以太坊基础设施造成巨大的兼容性问题。另外，与 SNARK/STARK 友好的椭圆曲线相比，标准以太坊椭圆曲线上的签名的证明和验证非常昂贵。（这些难以编码电路主要在于以太坊标准加密算法对于zk难以实现）简单来说，直接证明EVM会导致承载大量的计算负荷。然而这里有许多好处，（eg 多项式承诺，递归证明，验证加速）证明 EVM 执行路径总是比在定制设计的 VM 中证明效率低得多，至少在 EVM 本身做出更改以变得对 SNARK 更友好之前（可能需要几年时间）。

选择二： 自定义的VM + Opcode Support
----------------------------

这种认识促使团队采用上述“与 EVM 兼容”的方法：创建具有优化性能的自定义 VM，然后将 EVM 字节码直接转换为 VM 的字节码。

### Polygon

一个专注于这种方法的团队是 Polygon Hermez（最近更名为 Polygon zkEVM）。Polygon构建zkEVM的方法是 "[操作码级等效](https://www.youtube.com/watch?v=17d5DG6L2nw&t=621s)"，这听起来与Scroll采取的方法最初相似。然而，与 Scroll 不同的是，Polygon 的备用运行时（“zkExecutor”）运行[定制的“zkASM”操作码](https://github.com/0xPolygonHermez/zkevm-rom/blob/main/main/opcodes.zkasm)，而不是 EVM 操作码来优化 EVM 解释（即减少约束的数量与直接证明 EVM）。 Hermez 团队将此描述为“基于操作码的方法”，因为核心挑战是在他们的自定义 VM 中重新创建每个 EVM 操作码（您可以[在此](https://github.com/0xPolygonHermez/zkevm-rom)处查看代码），以便他们可以快速从 EVM 字节码转换为可验证的格式。

![](https://storage.googleapis.com/papyrus_images/3488877ec6b3b8004a5cfc0a06b6cb41d8899117003db50c5f7c4c7727e87537.png)

这些中间步骤为维护和潜在的错误创造了更大的表面积，但对于实现高性能的证明是必要的。最终，重要的是要清楚，你的程序不是在反映电路中的EVM的zkEVM中运行，而是在替代的 "zkExecutor "运行时中运行，它与EVM本身相似但不同。令人困惑的是，该团队将其称为 "zkEVM "和 "EVM等效"——然而，由于这个自定义的zkASM解释器，根据上述Optimism定义，这个rollup程序实际上是 "EVM兼容"。

![](https://storage.googleapis.com/papyrus_images/841b040ce541ce1172824d80df87acee2f06958d4b0544f12350695489c5015d.png)

因此，尽管大多数 Solidity 代码可能能够按原样运行，但可能与在该系统上运行的现有 L1 应用程序和工具存在一些不兼容。Polygon 已声明“[与~ 100% 的现有以太坊工具](https://twitter.com/sandeepnailwal/status/1550176579489251328)”兼容，并致力于 JSON-RPC 合规性，他们在[文档](https://docs.hermez.io/#zknode-architecture)中引用并[在此](https://github.com/0xPolygonHermez/zkevm-node/blob/c501b3e8467dc663bf56ad0d984ce7a3f0c24ec3/jsonrpc/eth.go)处提供了实现。在实践中，这种说法可能是有抱负的，并且依赖于以太坊本身的东西变得对 SNARK 更加友好。

Polygon 的方法产生了比 Scroll 更高性能的汇总（肯定是在短期内），但具有：

*   大量自定义代码，因为我们需要创建 zkASM
    
*   开发人员可能需要修改其 L1 代码或工具框架
    
*   随着时间的推移，以太坊的漂移可能会增加
    

选项3: 自定义VM+转译器
--------------

上述解决方案在“使 EVM 为 zk-rollups 工作”方面投入了大量的开发时间，将兼容性优先于长期性能和可扩展性。还有另一种选择：创建一个全新的、专门构建的 VM，然后添加对以太坊工具的支持作为顶部的附加层。

### Starnet

这是 StarkWare 对 StarkNet 采用的方法，这是目前最先进的通用rollup。StarkNet 使用自己的低级语言 (Cairo) 运行自定义智能合约 VM (Cairo VM)，两者都是为智能合约rollups而构建的。这意味着 StarkNet 没有开箱即用的以太坊兼容性——正如我们之前看到的，即使是操作码级别的 VM 级别兼容性也是rollup性能的潜在手刹。

![](https://storage.googleapis.com/papyrus_images/30f7f4470deebaeb4dfdf11a91a3b1d6b5b759eb272f408954461499af0ee25c.png)

然而，Nethermind 团队（与 StarkWare 合作）创建了[Warp 转换器](https://nethermind.io/warp/)，它能够将任意 Solidity 代码转换为 Cairo VM 字节码。Warp 的目标是使常见的 Solidity 合约可移植到 StarkNet——实现许多以太坊开发人员在“EVM 兼容性”方面的主要目标。在实践中，有一些Solidity的功能不被Warp所支持，包括低级别的调用（完整的列表可以在[这里](https://github.com/NethermindEth/warp)找到）。

这种构建智能合约rollup的方法是保持“Solidity-compatibility”：你不是在 EVM 内执行程序，也不是保持与任何其他以太坊接口的兼容性，但 Solidity 开发人员将能够编写可用于你的rollup。因此，您可以保持与以太坊类似的开发人员体验，而不必损害rollup的基本层——拥有蛋糕并吃掉它。

然而，这种方法还有几个额外的权衡。首先是构建自己的 VM 具有挑战性——以太坊团队已经有超过五年的时间来解决 EVM 的问题，并且仍然经常进行升级和修复。更加自定义的rollup将带来更好的性能，但您将失去所有其他链和rollup对 EVM 所做的集体改进的好处。

接下来，通过转译器支持 Solidity 可能会导致可组合性的损失——如果开发人员同时在 CAIRO 和 Solidity 中编写合约，那么支持两者之间接口的工具很可能会很变得脆弱。到目前为止，绝大多数 StarkNet 项目都直接使用了 CAIRO，它们可能不容易与未来的 Solidity 项目组合。最后，可能也是最重要的一点，StarkNet 团队目前的目标不是与其他以太坊组件兼容——他们正在推出自己的客户端 API、javascript 库和钱包系统，这将迫使与以太坊兼容的工具手动添加对 StarkNet 的支持。这是极具挑战性的，但并非不可能——如上所述，Solana 已经足够成功，其自定义标准得到了一些以太坊工具的尊重。

但是，如果他们能够成功地做到这一点，StarkWare 团队将寻求复制 EVM 的先发优势，并使用第一个针对 zk-rollups 优化的智能合约 VM。

### Zksync

另一个采用这种策略的团队是zkSync。zkSync 创建了他们自己的 VM (SyncVM)，它是基于寄存器的，并定义了自己的代数中间表示 (AIR)。然后他们构建了一个[专门的编译器](https://github.com/matter-labs/compiler-solidity)来将[Yul](https://docs.soliditylang.org/en/v0.8.15/yul.html)（一种中间语言，可以编译为不同 EVM 版本的字节码，认为是较低级别的 Solidity）编译成 LLVM-IR，然后他们将其编译成自定义 VM 的指令。这类似于 StarkWare 采用的方法，但理论上提供了围绕基础语言的更大灵活性（尽管目前仅支持 Solidity 0.8.x）。zkSync 团队最初创建了自己的类 CAIRO 语言（[Zinc](https://github.com/matter-labs/zinc))，但他们将大部分精力集中在 Solidity 编译器上，以便为 L1 开发人员提供更简单的迁移。一般来说，他们的策略是重用以太坊工具集而不是 StarkNet ——我希望他们的客户端 API 等也更加“与以太坊兼容”。

![](https://storage.googleapis.com/papyrus_images/abaea13f16b3819934365ac23a0745c7a96a4f2f60a461f2c7f809af1e4ed192.png)

zkSync 利用这个自定义 VM 来提供非 EVM 兼容的功能，例如[Account Abstraction](https://v2-docs.zksync.io/dev/zksync-v2/aa.html#introduction)，这[一直是核心以太坊协议的目标](https://eips.ethereum.org/EIPS/eip-2938)。这是自定义 VM 提供的好处的一个很好的例子——你不必等待以太坊构建新功能！

![](https://storage.googleapis.com/papyrus_images/7d7301e0cc90fb9770ef49056b87d9017a1bfa554da61c42d1301ec43fba2c71.png)

将所有内容放在一起，您可以清楚地看到每个团队遵循的不同策略：

![](https://storage.googleapis.com/papyrus_images/5c3514cc0e966526ae43ce6f24ac2a73b3c3eda51112366966bc9b429afbab5f.png)

Vitalik 的zkEVM类型
----------------

Vitalik Buterin[关于 zkEVM 的博客](https://vitalik.eth.limo/general/2022/08/04/zkevm.html)强调了 Rollup 团队当前面临的基本困境：EVM 不是为“可验证”程序构建的。事实上，正如我们通过上面的分析所表明的那样，你寻求与以太坊的兼容性越强，你的“可验证格式”程序的性能就会越差。Vitalik 根据与现有 EVM 基础设施的兼容性程度确定了通用rollup的几大类：

![](https://storage.googleapis.com/papyrus_images/df7657539b60983306b614b2dec903a34895caa69dc4a9d67a818e78b1a8b4e9.png)

我要对他的论文做的唯一扩展是指出，即使在每个“类型”中也存在很大程度的可变性——我们正在处理一个范围，而不是完全细分的类别。从开发人员体验的角度来看，对应用程序层进行单一、小的更改的 Type 2.5 rollup 比 Type 3 rollup 更常见，后者对应用程序层进行了大规模更改，但在技术上没有引入新的 VM并成为Type 4。

智能合约rollup的现状
-------------

鉴于理解上述内容所需的细节，难怪我们围绕以太坊兼容性发明了一堆令人困惑的语言。事实上，没有 zk-rollup 在所有情况下都完美地反映了 EVM 的行为——这只是程度问题，每个团队做出的详细选择最终将最重要的是可维护性和性能，而不是仅兼容性。我的观点是以下定义是最清晰和最一致的：

![](https://storage.googleapis.com/papyrus_images/e1c9bee2272802d9a1b45f3f65947365f4a3aa4bc64bb1865abb6548b9d7fc88.png)

重要的是要理解，上述方法都不是天生优越的——它是一种分类，而不是等级。它们都做出了不同的权衡：更容易构建、维护和升级，更高效，更容易与现有工具兼容。最终，领先的rollup也将取决于更好的分销和营销，而不是纯粹的技术能力。话虽如此，做出正确的基本技术决策无疑具有重大优势。Scroll 对 EVM 规范的热心承诺是否会使他们能够轻松响应任何 EVM 升级？另一个团队更务实的方法会帮助他们更快地进入市场吗？StarkWare 的定制 VM + 转译器方法会为长期规模提供更坚实的基础吗？另一支球队最终会从这个领域的先行者无疑会犯的错误中吸取教训并击败他们吗？最终，以太坊开发当前时刻的美妙之处在于，我们有不同的团队以截然不同的方法朝着一个共同的目标前进。

但在我们得意忘形之前，对当前智能合约rollup的准备情况保持清醒也是适当的。每个团队都有强烈的动机将自己推销为“即将接管世界”的团队 —— 但最早要到 2022 年底，以太坊上才会有“生产级”智能合约rollup，其中许多团队将直到 2023 年才准备好。根据 StarkNet 的发展历程，我们应该预计从 rollup 到达 testnet开始至少需要一年的迭代，然后才能在该 rollup 准备好支持主网上一致的生产级数量之前。

![](https://storage.googleapis.com/papyrus_images/329cb03f6a5d72d4f74c118768f5cbcca64f69e3b89b914d24a17b4fa6cb2585.png)

由于这种不成熟的状态，对于需要在不影响以太坊安全性的情况下进行扩展的开发人员来说，特定于应用程序的rollups仍然是最强大的选择。事实上，即使通用rollups可用并且得到更广泛的集成，我预计在可预见的未来，特定应用rollups的性能、定制和可靠性对于某些用例（例如交易所、NFT 铸造/交易）仍将保持优势。

其他汇总因素
------

尽管本文的主要关注点，但这并不是关于以太坊生态系统兼容性与性能的全部内容！还有许多其他因素会影响您是否应该在特定的通用rollup上进行构建。我将建议几个主要的附加标准：

*   费用：这些rollups是否会以原生代币、ETH 或两者的某种复杂组合收取费用？费用结构[对用户和开发人员体验有巨大影响](https://immutablex.medium.com/fees-on-immutable-x-79d3e7207b12)，因为rollups通常需要拥有费用代币来支付计算费用。
    
*   证明和排序：所有rollups都需要一个实体，该实体负责对交易进行排序和生成证明。今天大多数特定于应用程序的rollups都是“单序列器”，它以弹性为代价产生更高的吞吐量。大多数通用rollups最初是作为单个排序器rollups开始的，但他们通常计划随着时间的推移分散这个排序器。
    
*   自托管： zk-rollups 的核心承诺是能够在保持以太坊安全的同时解锁性能。但是，许多通用rollups目前没有明确的机制来在保证发生恶意或不可用的排序器时恢复用户资产。
    
*   数据可用性：如介绍中所述，自托管保证取决于故障情况下状态数据的可用性。然而，完整的数据可用性为用户带来了额外的成本，从而导致了一系列数据可用性模式。这已经在特定于应用程序的rollup世界（例如 Validiums、Volitions）中广泛使用，但是每个通用rollup都需要单独添加此功能。
    

![](https://storage.googleapis.com/papyrus_images/487cc08d185ba579b070556a9d16d5db184c45fe9a34db384afaa206f59f9dd0.png)

总结
--

智能合约rollups是以太坊扩展路线图中令人难以置信的部分。这些rollups在与现有以太坊工具集的关系中做出的不同权衡是对以太坊开发者生态系统多样性的惊人证明。

然而，目前关于 EVM 兼容性的讨论通常没有抓住重点。从开发人员的角度来看，所有这些rollups都将支持 Solidity 代码。真正的以太坊兼容性是一个更大的挑战，但实际上需要权衡取舍，开发人员在进行rollup之前应该意识到这一点。目前，大多数rollup项目都是大规模的“远期销售”——销售其能力的 3 年以上愿景，而不是今天（甚至 12 个月内）可能实现的目标，这可能会使情况变得非常混乱。

为了透明起见，我希望每个主要的rollup团队都能对以下问题提供更清晰的答案：

*   L1 和 L2 在运行时的确切差异是什么？L2 将修改哪些操作码？与 L1 相比，其他任何 VM 特征（例如费用结构）是否会有所不同？
    
*   您的自定义 VM 的正式规范在哪里，它在哪里比其他选项性能更高/性能更低？
    
*   此rollup将对其他以太坊接口（例如客户端 API、库）进行多少更改，这将破坏以太坊工具？
    
*   此rollup何时在测试网上上线？在主网上？能够支持 1000+ 定制合同 tps 的持续生产吞吐量吗？
    
*   您预计何时支持对用户资产的完全自我托管，在通用rollup的背景下会是什么样子？
    

一旦这些roolups在测试网上发布，这些问题应该更容易回答。在那之前，我希望看到团队继续发布更多关于他们的解决方案将做出的确切权衡的技术细节，以及这将如何影响智能合约和工具开发人员等。

随着合并指日可待，经过实战考验的特定应用程序rollups在生产中，以及通用rollups在明年进入主网，以太坊扩展的未来就是现在。

---

*Originally published on [W3.Hitchhiker](https://paragraph.com/@w3hitchhiker/zkevm-evm-rollups)*
