深入了解zkSync 2.0架构、核心基础设施
原文标题:《zkSync 2.0:你好 以太坊 !》
原文作者:水多多|zkSync
我可以把你比作夏日吗?
你的可扩展性和安全性更高。
狂风确实震撼了五月亲爱的心灵,
夏天的租约日期太短了。
——中本聪莎士比亚,2021
介绍
面对最大的技术挑战,我们开始在与 EVM 兼容的环境中部署智能合约。测试网的第一个版本已经上线:您已经可以使用区块浏览器查看 zkSync 2.0 上的活动。在这篇文章中,我们将深入解释每个关键组件、提供进度更新以及下一个版本的计划。
主要成就
在密码学方面,zk EVM 的指令集已经完成,两种实现都完成了:在电路中和在执行环境中。
在编译器方面,用 Solidity 和 Zinc 编写的智能合约现在可以编译成 zkEVM 字节码。
在核心基础设施方面,全节点集成已完成,能够成功部署和执行已编译的智能合约。
虽然 zk EVM 和核心 2.0 基础设施已准备好公开,但编译器需要做更多工作才能正确覆盖所有边缘情况。为了提供更全面的开发者体验,我们决定在编译器 100% 可靠后立即开放对 zkEVM、编译器和核心 SDK 的访问。
zkSync 2.0 与以太坊的比较
大多数东西看起来和感觉都是一样的。以下是一些重要的区别:
Solidity 智能合约
支持以太坊中的大多数操作码!但是,也有一些例外:
此版本不支持 ADDMOD、SMOD、MULMOD、EXP 和 CREATE2 操作码,但将来会支持。
我们暂时不支持 KECCAK256 操作码,而是自动将其所有调用替换为调用另一个抗冲突哈希函数。KECCAK256 稍后将作为预编译器引入。
我们决定不包含 SELFDESTRUCT 操作码,因为以太坊计划将其删除。
我们可能会删除对完整 256 位 XOR/AND/OR 操作码的支持,因为这些操作码仅存在于已编译的用于位掩码的可靠代码中。这可以由编译器使用其他操作码来完成。
gas
在 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 种方式授权(除了优先队列机制):
用户可以通过签署 EIP712 消息,使用他们的普通以太坊钱包(例如 Metamask 或任何 WalletConnect 钱包)签署交易。
任何帐户都可以设置一个公钥来创建我们的内部 Schnorr 签名来签署交易。这允许基于智能合约的钱包与 zkSync 2.0 进行交互,而无需发送 L1 消息的额外费用。
存储效率提升
每个块仅应用一次存储槽覆盖。这意味着如果多个用户与单个 AMM 合约交互,则 AMM 合约的存储槽将仅被覆盖一次。这允许定序器在以后向用户退还单次写入的共享成本。
预编译
「预编译」机制已计划好,但稍后会发布。我们计划首先支持 keccak256、sha256 哈希和 ECDSA 恢复原语。可以根据需求和复杂性考虑包含其他预编译,例如 Blake2f 轮函数(在当前形式的以太坊中几乎无法使用)。
进一步的限制
zkSync 2.0 的第一次迭代可能会对每笔交易施加 32 次智能合约调用的额外限制,直到实施适当的记账机制为止。
执行跟踪将有一个硬限制,但它将与以太坊块大小的当前限制相当,并且不应影响大多数协议。
可能会有更多限制,但我们的目标是在最终版本中将它们减少到绝对最低限度。
深入了解 zkSync 2.0 架构
你可能听说过区块链三难困境,但在扩展以太坊时,还有第四个因素:可编程性。当前所有的扩展解决方案都存在于牺牲一些安全性、分散性和可编程性以实现可扩展性的范围内。zkSync 2.0 的设计结合了以下 2 项技术突破,最大限度地发挥了所有 4 项功能:
zk EVM:为我们与 EVM 兼容的 zkRollup 提供动力的引擎,这是唯一支持 L1 安全性和可靠智能合约的解决方案。
zkPorter:一个链下数据可用性系统,可扩展性比 rollups 高 2 个数量级。
由于 zkEVM 和 zkPorter 是可互操作和可组合的,zkSync 2.0 能够显着优于所有其他扩展解决方案。
目前的共识是Eth2 数据分片将在 2022 年底到来,以在不牺牲去中心化的情况下提供指数级更大的数据可用性层。zkSync 的 zkRollup 技术与 Eth2 数据分片相结合是最终目标,在不牺牲任何 4 个因素的情况下达到 100,000+ TPS。
状态树
zkSync 2.0 状态树覆盖了以太坊的全部 160 位地址空间。每个帐户将驻留在状态的 zkRollup 部分或 zkPorter 部分。zkRollup 和 zkPorter 账户完全一样,除了一个组件:保证数据可用性。zkRollup 交易数据通过 calldata 发布到以太坊,zkPorter 交易数据发布到 zkSync Guardian 网络,zkSync Token持有者参与权益证明。
发布数据的地方是成本和安全性之间的权衡。zkPorter 交易比汇总交易便宜得多,但它有可能冻结您的资金。然而,zkRollup 和 zkPorter 账户的有效性都是通过零知识证明和以太坊来保证的。也就是说,zkPorter 中的资金只能被冻结,不能被盗。
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 如何工作的更多信息,请观看此视频说明。
编译器
我们正在同时开发两个针对 zkEVM 的编译器前端:Yul 和 Zinc。Yul是一种中间 Solidity 表示,可以编译为不同后端的字节码。Zinc是我们用于智能合约和通用零知识证明电路的基于 Rust 的语言。
因为编译器是使用LLVM框架构建的,所以可以认为它具有前端 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 的集成测试贯穿整个智能合约生命周期:从解析源代码到合约部署和在 zkSync 上执行交易。
3、从 Solidity 存储库集成的广泛测试套件,并适用于我们的集成测试工具。
每个套件已经包含数千个测试,我们将把这个数字至少增加一个数量级。
我们的 2 个编译器已经成功部署并执行了两种语言的简单智能合约。但是还有更多的优化需要完成,一些复杂的 LLVM IR 语句需要翻译成 zkEVM 字节码。因此,我们决定在编译器处于更强大的状态之前不发布它。
编译器完成后,我们将专注于让Zinc更具表现力和功能丰富,然后构建 Rust 编译器前端以允许使用原生 Rust 编写智能合约。
核心基础设施
zkSync 2.0 核心由几个关键角色组成:
全节点
通过虚拟机实现 zkEVM 字节码的预电路执行器环境
状态在交易发送后几秒钟内可用
过滤掉可能使区块膨胀的明显不正确的交易(例如,交易资金不足)
在内存池中执行交易并生成块
证明者
接收区块的见证人并生成零知识证明
用于并行证明生成的证明者接口
自定义证明者自动缩放器,可按需创建和终止证明者机器
交互者
用于观看和与以太坊 L1 交互的工具,
根据 Token价格、ZKP 生成成本和 L1 gas 价格计算交易费用
偏执狂监视器
Prometheus、elastic、sentry、uptime、几个独立的事件通知系统和自定义健康检查服务。
这个核心基础设施功能齐全,已经集成了 zkEVM 执行器!
让我们谈谈
编译器完成后,我们将一起共享对所有组件的访问权限!开发人员将能够部署 Solidity/Zinc 智能合约并通过 Web3 API 进行交互。