# zkSync 2.0：你好以太坊！

By [白开水](https://paragraph.com/@baikaishui) · 2022-05-20

---

zkEVM 测试网的 Alpha 版本已经上线。
------------------------

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

_我可以把你比作夏日吗？_

_你的可扩展性和安全性更高。_

_狂风确实震撼了五月亲爱的心灵，_

_夏天的租约日期太短了。_

_——中本聪莎士比亚，2021_

介绍
--

面对最大的技术挑战，我们开始在与 EVM 兼容的环境中部署智能合约。测试网的第一个版本已经上线：您已经可以使用区块浏览器查看 zkSync 2.0 上的活动。在这篇文章中，我们将深入解释每个关键组件、提供进度更新以及下一个版本的计划。

[**\>> ZKSYNC 2.0 测试网探索者 <<**](https://zksync2-alpha.zkscan.io/)

主要成就
====

**在密码学方面**，zk EVM 的指令集已经完成，两种实现都完成了：在电路中和在执行环境中。

**在编译器方面**，用 Solidity 和 Zinc 编写的智能合约现在可以编译成 zkEVM 字节码。

**在核心基础设施方面**，全节点集成已完成，能够成功部署和执行已编译的智能合约。

虽然 zk EVM 和核心 2.0 基础设施已准备好公开，但编译器需要做更多工作才能正确覆盖所有边缘情况。为了提供更全面的开发者体验，我们决定在编译器 100% 可靠后立即开放对 zkEVM、编译器和核心 SDK 的访问。

zkSync 2.0 与以太坊的比较
==================

大多数东西看起来和感觉都是一样的。以下是一些重要的区别：

Solidity 智能合约
-------------

支持以太坊中的大多数操作码！但是，也有一些例外：

1.  此版本不支持 ADDMOD、SMOD、MULMOD、EXP 和 CREATE2 操作码，但将来会支持。
    
2.  我们暂时不支持 KECCAK256 操作码，而是通过调用另一个抗冲突哈希函数来自动替换其所有调用。KECCAK256 稍后将作为预编译器引入。
    
3.  我们决定不包含 SELFDESTRUCT 操作码，因为以太坊[计划将其删除](https://hackmd.io/@vbuterin/selfdestruct)。
    
4.  我们可能会取消对完整 256 位 XOR/AND/OR 操作码的支持，因为这些操作码仅存在于已编译的用于位掩码的 Solidity 代码中。这可以由编译器使用其他操作码来完成。
    

气体
--

在 zkSync 2.0 中，有一个不同的 gas 概念。交易价格将根据当前的 L1 gas 价格（由于发布调用数据）和 ZKP 生成成本而波动。智能合约调用将具有最大数量的 zk EVM 步骤和存储写入参数。

Web3 API
--------

下一个版本将包括我们的 Web3 API 实现，它将与以太坊文档定义的 Web3 标准兼容。事件将开箱即用，所有服务都可以轻松集成。

zkSync 包括 L1 没有的功能，例如提交和最终块的概念。因此，将会有额外的方法让开发人员更精确地控制数据。Web3 客户端代码将接收与您在以太坊上相同的数据，但可以使用“zksync\_”命名空间请求专门的信息。

因为 zkSync 有多种交易类型，并且使用 EIP712 签名，所以 \`eth\_sendRawTransaction\` 数据的格式会与 L1 不同。但是，编码对应于以太坊 ABI，所以支持它并不困难。

签署交易
----

zkSync 2.0 中的交易可以通过 2 种方式授权（除了优先队列机制）：

1.  用户可以通过签署 EIP712 消息，使用他们的普通以太坊钱包（例如 Metamask 或任何 WalletConnect 钱包）签署交易。
    
2.  任何帐户都可以设置公钥来创建我们的内部 Schnorr 签名来签署交易。这允许基于智能合约的钱包与 zkSync 2.0 进行交互，而无需发送 L1 消息的额外费用。
    

存储效率提升
------

每个块仅应用一次存储槽覆盖。这意味着如果多个用户与单个 AMM 合约交互，则 AMM 合约的存储槽只会被覆盖一次。这允许定序器在以后向用户退还单次写入的共享成本。

预编译
---

“预编译”机制已计划好，但稍后会发布。我们计划首先支持 keccak256、sha256 哈希和 ECDSA 恢复原语。根据需求和复杂性，可以考虑包含其他预编译，例如 Blake2f 轮函数（在当前形式的以太坊中实际上无法使用）。

进一步的限制
------

zkSync 2.0 的第一次迭代可能会对每笔交易施加 32 次智能合约调用的额外限制，直到实施适当的记账机制。

执行跟踪将有一个硬限制，但它与以太坊块大小的当前限制相当，不应影响大多数协议。

可能会有更多限制，但我们的目标是在最终版本中将它们减少到绝对最低限度。

深入了解 zkSync 2.0 架构
==================

您可能听说过区块链三难困境，但在扩展以太坊时，还有第四个因素：可编程性。所有当前的扩展解决方案都存在于牺牲一些安全性、分散性和可编程性以实现可扩展性的范围内。zkSync 2.0 的设计_结合_了以下 2 项技术突破，最大限度地发挥了所有 4 项功能：

1.  zk EVM：为我们与 EVM 兼容的 zkRollup 提供动力的引擎，这是唯一具有 L1 安全性和可靠智能合约支持的解决方案。
    
2.  zkPorter：一个链下数据可用性系统，可扩展性比 rollups 高 2 个数量级。
    

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

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

由于 zkEVM 和 zkPorter 是可互操作和可组合的，zkSync 2.0 能够显着优于所有其他扩展解决方案。

目前的共识是[Eth2 数据分片将](https://vitalik.ca/general/2021/04/07/sharding.html)[在 2022 年底](https://ethereum.org/en/eth2/shard-chains/)到来，以在不牺牲去中心化的情况下提供指数级更大的数据可用性层。**zkSync 的 zkRollup 技术与 Eth2 数据分片相结合是最终目标，在不牺牲任何 4 个因素的情况下达到 100,000+ TPS。**

状态树
---

zkSync 2.0 状态树覆盖了以太坊的全部 160 位地址空间。每个帐户将驻留在状态的 zkRollup 部分或 zkPorter 部分。zkRollup 和 zkPorter 账户完全一样，除了一个组件：保证[数据可用性](https://github.com/ethereum/research/wiki/A-note-on-data-availability-and-erasure-coding)。zkRollup 交易数据通过 calldata 发布到以太坊，zkPorter 交易数据发布到 zkSync Guardian 网络，zkSync 代币持有者参与权益证明。

发布数据的地方是成本和安全性之间的权衡。zkPorter 交易比汇总交易便宜得多，但它有可能会冻结您的资金。然而，zkRollup 和 zkPorter 账户的有效性都是通过零知识证明和以太坊来保证的。也就是说，[zkPorter 中的资金只能被冻结，不能被盗](https://medium.com/matter-labs/zkporter-a-breakthrough-in-l2-scaling-ed5e48842fbf)。

zkRollup 和 zkPorter 账户的互操作性和可组合性让每个用户都有机会成为 zkSync 中的一等公民。部署在 zkRollup 端的 Uniswap 可以通过 zkPorter 账户访问以换取最低费用。zkSync 2.0 是一个系统，专为整个金融领域的用户而设计。

密码学
---

我们的 VM，通常称为 zkEVM，不是 EVM 1:1 副本，而是旨在能够运行 99% 用 Solidity 编写的合约并保持其相同的行为，例如在恢复和异常期间。同时，编写 zk EVM 以在电路中高效地产生零知识证明。

这是在我们的证明系统没有任何重大变化的情况下完成的；我们继续将 PLONK 与自定义门和查找表（通常称为 UltraPLONK）和以太坊的 BN-254 曲线一起使用。**这是有利的，因为自 2020 年 6 月以来，该证明系统已在 zkSync 1.0 以及使用相同证明系统的其他项目中进行了实战测试。**

经过数月的努力，我们再次激动地宣布：**zkEVM 的指令集已经完成并在电路和执行环境中实现。**

这里有一个重要的区别：电路和执行环境中的实现是分开的，用于不同的目的。生成执行跟踪的证明并提供见证是电路的工作，但这非常慢。另一方面，执行环境是 rust 中 zk EVM 的直接实现，高效且快速。如果我们要依靠电路来生成和执行证明，那么交易的最终确定性将需要数小时。证明生成和简单执行的分离使 zkSync 上的交易能够即时结算。

接下来，我们专注于将 zkEVM 和编译器结合在一起，并将递归结合在一起：块_之间_的递归，它允许我们为 N 个块发布一个证明，块_内的_递归，它聚合块的不同逻辑部分的子证明. 这是简单的部分！自 2020 年 6 月以来，zkSync 1.0 的主网上已经使用了块之间的递归聚合证明。有关块内递归以及我们的 zk EVM 如何工作的更多信息，请观看此[视频说明](https://www.youtube.com/watch?v=6wLSkpIHXM8&t=735s)。

编译器
---

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

我们正在同时开发两个针对 zkEVM 的编译器前端：Yul 和 Zinc。[Yul](https://docs.soliditylang.org/en/v0.8.4/yul.html)是一种中间 Solidity 表示，可以编译为不同后端的字节码。[Zinc](https://zinc.zksync.io/)是我们用于智能合约和通用零知识证明电路的基于 Rust 的语言。

因为编译器是使用[LLVM](https://llvm.org/)框架构建的，所以可以认为它具有前端 Yul → LLVM IR 和后端 LLVM IR → zkEVM 字节码。采用 LLVM 带来了几个主要优势：

1.  LLVM 优化框架无与伦比：它从 LLVM IR 生成最高效的 zkEVM 字节码。
    
2.  使用较新版本的 Solidity 或 Zinc，编译器前端将处理所有更改，而 LLVM 将使我们脱离对编译器后端的更改。
    
3.  将来，如果开发人员想用原生 Rust 或 Javascript 编写智能合约，只需构建该语言的编译器前端，智能合约就可以在 zkSync 中开箱即用。
    

编译器的安全性对我们来说至关重要，并且已经通过了多套测试：

1.  Zinc 和 Yul 编译器中的词法、语法和语义测试。
    
2.  我们自己的 Zinc 和 Solidity[集成测试](https://github.com/matter-labs/compiler-tests/tree/main/solidity/simple)，贯穿整个智能合约生命周期：从解析源代码到合约部署和在 zkSync 上执行交易。
    
3.  从 Solidity 存储库集成并适用于我们的集成测试工具的[广泛测试套件](https://github.com/ethereum/solidity/tree/develop/test/libsolidity/semanticTests)。
    

每个套件已经包含数千个测试，我们将把这个数字至少增加一个数量级。

**我们的 2 个编译器已经成功部署并执行了两种语言的简单智能合约**。但是还有更多的优化需要完成，一些复杂的 LLVM IR 语句需要翻译成 zkEVM 字节码。因此，我们决定在编译器处于更强大的状态之前不发布它。

编译器完成后，我们将专注于使[Zinc](https://zinc.zksync.io/)更具表现力和功能丰富，然后构建 Rust 编译器前端以允许使用原生 Rust 编写智能合约。

核心基础设施
------

zkSync 2.0 核心由几个关键角色组成：

**全节点**

1.  通过虚拟机实现 zkEVM 字节码的预电路执行器环境
    
2.  状态在交易发送后几秒钟内可用，
    
3.  过滤掉可能导致区块膨胀的明显不正确的交易（例如，交易资金不足），
    
4.  在内存池中执行交易并生成块。
    

**证明者**

1.  接收区块的见证人并生成零知识证明，
    
2.  用于并行证明生成的证明者接口，
    
3.  定制证明者自动缩放器，可按需创建和终止证明者机器。
    

**交互者**

1.  用于观看和与以太坊 L1 交互的工具，
    
2.  根据代币价格、ZKP 生成成本和 L1 gas 价格计算交易费用。
    

**偏执狂监视器**

Prometheus、elastic、sentry、uptime、几个独立的事件通知系统和自定义健康检查服务。

这个核心基础设施功能齐全，已经集成了 zkEVM 执行器！

和我们一起聊聊
=======

编译器完成后，我们将共享对所有组件的访问权限！开发人员将能够部署 Solidity/Zinc 智能合约并通过 Web3 API 进行交互。

[在Twitter 上](https://twitter.com/zksync)关注我们以获取更新！并加入我们的[discord](https://discord.gg/4yZNn9GJVA)、[telegram](https://t.me/zksync_community)和[gitter](https://gitter.im/matter-labs/zksync)中的对话。

如果您有兴趣与我们一起帮助构建第一个与 EVM 兼容的 zkRollup，我们正在[招聘](https://matter-labs.io/#jobs)所有职位！

---

*Originally published on [白开水](https://paragraph.com/@baikaishui/zksync-2-0-2)*
