{"content":{"title":"Layer2 开发教程 # 2 zkSync 基础","body":"> 记录一下个人学习笔记，参考网上资料，本文主要是我个人学习笔记，内容出处均在文末注明。部分内容源自 ChatGPT，如文中有错误还请不吝赐教。【文本】标识的内容文本为作者个人观点，仅供参考。\r\n\r\nzkSync 是一种基于以太坊的二层扩容解决方案，它利用了零知识证明技术来提高交易吞吐量和降低交易成本。zkSync 属于目前以太坊比较流行的扩容方案 ZK-Rollup 的一种，通过将大量交易批量处理并将结果提交到以太坊主链来实现高性能和低成本的交易。ZK-Rollup 是基于零知识证明的 Layer2 扩容方案，采用有效性验证方法(VP)，默认所有交易都是不诚实的，只有通过有效性验证才会被接受。ZK-Rollup 在链下进行复杂的计算和证明的生成，链上进行证明的校验并存储部分数据保证数据可用性。\r\n![image.png](https://img.learnblockchain.cn/attachments/2024/05/6DmUYHtC6644916686ba9.png)\r\n\r\nzkSync 背后公司: [MatterLabs](https://matter-labs.io/)\r\n* zkSync 1.0 ( `zkSync Lite` )：于 2020 年 6 月在以太坊主网上启动，zkSync1.0 是 zkSync 的轻量级版本，它提供了简化的支付和资产转移场景。但是它并不兼容以太坊虚拟机（EVM）。\r\n* zkSync 2.0 ( `zkSync Era` )：于 2023 年 3 月启动，zkSync 2.0 对比 1.0 最大的特点就是兼容 EVM，可以执行 Solidity 或以太坊开发中使用的其他高级语言编写的智能合约，极大的降低了开发成本。\r\n\r\n1.0 和 2.0 的主要区别如下：\r\n* 智能合约\r\n\r\n  * zkSync 1.0 提供了简化的支付和资产转移场景，并不支持以太坊虚拟机兼容的智能合约。【我的理解是这个版本的 ZK 算法没有实现对 EVM 代码提供 proof，所以这个版本的 zkSync 不能部署合约，类似 BTC，只能运行一些支付和转账逻辑，并对这种逻辑提供 zk proof】\r\n  * zkSync 2.0 提供了对 EVM 兼容智能合约的完全支持，开发者可以在 zkSync 2.0 上轻松地部署以太坊智能合约。【这个版本的 zk 算法可以支持 evm 的所有指令集】\r\n\r\n* 账户抽象\r\n  * zkSync 2.0 提供了账户抽象的新功能，允许用户使用任何签名方案与智能合约进行交互，简化了用户和智能合约之间的交互，从而提高了用户体验。【因为1.0不支持合约，所以自然不支持账户抽象】\r\n\r\n* 可组合性\r\n  * zkSync 1.0 仅支持有限的跨合约交互。【不是特别理解，可能和他们的算法有关吧】\r\n  * zkSync 2.0 通过保留关键 EVM 功能（如智能合约可组合性）提高了协议间互操作性，这使得 zkSync 2.0 更适合构建复杂的去中心化金融（DeFi）应用程序。\r\n\r\n* 开发工具\r\n  * zkSync 2.0 配备了包括 CLI（命令行界面）和 SDK（软件开发工具包）等开发者工具，使开发者能够更轻松地构建和部署基于 zkSync 的应用程序。\r\n\r\n* 预编译\r\n  * zkSync 2.0 支持包括 ecrecover 和 sha256（加上 keccak256）以及 lambdaclass 正在开发的预编译，即 ecAdd、ecMul 和 modexp（加上 ecPairing）在内的上海协议版本的预编译合约。\r\n\r\nzkSync 的优势\r\n- 安全性：zkSync 使用零知识证明技术，确保了交易的安全性。zkSync 的安全模型不依赖于欺诈证明或博弈论，而是建立在独特的安全机制之上。这种模型达到以太坊主网级别的安全，为用户提供高度可信的交易环境。\r\n- 兼容 EVM：zkSync Era 可以处理几乎所有基于以太坊虚拟机（EVM）的智能合约。在保证高安全的前提下，极大的降低了开发和维护成本。\r\n- 账户抽象：zkSync Era 是第一个实现原生账户抽象的 EVM 兼容链。其账户可以发起交易，如 EOA，但也可以在其中实现任意逻辑，如智能合约。并且通过引入智能帐户和 Paymaster 的概念，从根本上改变了帐户的操作方式。智能帐户是完全可编程的，允许进行各种自定义，例如签名方案、本机多重签名功能、支出限制和特定于应用程序的限制。Paymaster 可以为用户赞助交易，使用户能够用 ERC20 代币支付交易费用。这种创新的账户管理方法显着增强了用户体验、安全性和灵活性，为更广泛采用区块链技术铺平了道路。【这部分内容是账户抽象的内容，和 Layer2 关系不大，我会在之后的另一篇文章里详细介绍账户抽象技术】\r\n\r\n\r\n```\r\nzkSync 主网\r\n* Network Name: `zkSync Era Mainnet`\r\n* RPC URL: `https://mainnet.era.zksync.io`\r\n* Chain ID: `324`\r\n* Currency Symbol: `ETH`\r\n* Block Explorer URL: `https://explorer.zksync.io/`\r\n\r\nzkSync Sepolia 测试网\r\n* Network Name: `zkSync Era Sepolia Testnet`\r\n* RPC URL: `https://sepolia.era.zksync.dev`\r\n* Chain ID: `300`\r\n* Currency Symbol: `ETH`\r\n* Block Explorer URL: `https://sepolia.explorer.zksync.io/`\r\n```\r\n\r\nzkSync 官方跨链桥：https://portal.zksync.io/bridge/\r\n- 从以太坊主网存款到 zkSync 大约需要 15 分钟，而从 zkSync 提款到以太坊则最多需要 24 小时。\r\n\r\n如果要开发自己的跨链桥可以参考：[zkSync - Bridging Assets\r\n](https://docs.zksync.io/build/developer-reference/bridging-asset.html)\r\n\r\n区块浏览器：\r\n- https://explorer.zksync.io/\r\n- https://era.zksync.network/\r\n\r\n**交易状态**\r\nzkSync 的 rollup 操作指由 L2 上的 rollup 账户在 rollup 内部发起的交易。所有 rollup 交易都需要操作员（operator）的处理，操作员将所有交易打包，计算正确状态转换的零知识证明，并通过与 L1 的 Rollup 合约交互进行最终的状态转换。\r\n\r\nzkSync rollup 操作生命周期如下：\r\n1. 用户在 L2 上创建交易，例如在钱包确认了一笔交易。\r\n2. 操作员处理此请求后，创建一个 rollup 交易并将其添加到块中。\r\n3. 一旦区块完成，运营商将其作为区块承诺提交给 zkSync 智能合约，利用智能合约检查 rollup 操作的部分逻辑。\r\n4. 区块的证明将被提交给 zkSync 智能合约作为区块验证。如果验证成功，新状态会被视为最终状态。\r\n\r\n【原文的描述太简略了，说实话有些地方没看明白是在L2上合约操作还是L1上，所以下面根据GPT补充了一下细节，如果细节有问题欢迎评论区告诉我，感谢🙏】\r\n\r\n\r\n在 zksync 上开发 dapp：\r\n\r\n开发者可以在 zkSync 上利用 Solidity 或 Vyper 开发智能合约，大部分合约可以无缝从主网迁移到 zkSync 上。并且，zkSync 提供了定制化的 Hardhat 和 Foundry 帮助开发者编写智能合约。但是由于 zkSync 是第 4 类 zkEVM，因此并不完全兼容 L1 的智能合约。\r\n\r\n举几个例子：\r\n* 转账时使用 `call` 而不是 `transfer` 或 `send`：`transfer` 和 `send` 函数限制了发送 ETH 时的 gas 消耗，上限为 `2300 gas`。而 zkSync 的账户都是智能合约，转账时消耗可能因为超出 `2300`，导致交易失败。因此，智能合约应使用没有 gas 消耗上限的 `call`。\r\n\r\n\r\n## zkSync Rollup 操作生命周期详细介绍\r\n- 内容来自 GPT，如有错误欢迎指出\r\n\r\n具体流程⬇️\r\n1.用户在 L2 上创建交易。\r\n2.操作员处理交易并创建区块。\r\n3.操作员提交区块承诺给 zkSync 智能合约【部署在eth上】。\r\n4.操作员生成 zk-SNARK 证明（这一步需要计算时间）。\r\n5.操作员提交 zk-SNARK 证明给 zkSync 智能合约。\r\n6.智能合约验证 zk-SNARK 证明。\r\n7.验证成功后，更新 L1 上的状态，新状态视为最终状态。\r\n\r\n1.交易创建\r\n- 用户在 L2 上创建交易：用户在 zkSync 上进行交易，例如转账或执行智能合约。这一过程通常通过钱包或其他接口完成，并由用户确认。\r\n\r\n2.操作员处理\r\n- 操作员处理请求：操作员（operator）收到用户的交易请求后，将其转换为 rollup 交易。操作员负责将多个用户交易打包成一个区块。【我理解这里还是在L2上的区块打包】\r\n\r\n3.区块创建和提交\r\n- 创建 rollup 交易并添加到块中：操作员将交易打包成一个区块，称为 rollup 块。这些交易在 L2 上执行，操作员确保所有交易的顺序和状态转换是正确的。【L2 出块】\r\n- 区块提交：一旦区块完成，操作员将区块的承诺（commitment）提交给 zkSync 智能合约。这个承诺包含区块的摘要信息，用于在 L1 上进行记录和验证。【ZK计算的输入之一，这里L2和L1的同步是先同步承诺，再延迟同步proof，因为zk proof计算时间更长，这样设计我猜是为了安全性】\r\n\r\n4.状态验证\r\n- 提交证明：操作员利用零知识证明（zk-SNARK）生成区块的证明，并将其提交给 zkSync 智能合约。零知识证明确保区块内的所有交易和状态转换都是正确的，而无需公开交易的具体内容。\r\n- 验证成功：如果证明验证成功，zkSync 智能合约会更新 L1 上的状态，并将新的状态视为最终状态。\r\n\r\n\r\n**承诺和证明的提交时间间隔问题**\r\n- 区块承诺的提交和 zk-SNARK 证明的提交不是同时发生的。通常，操作员会先提交区块承诺，然后在稍后的时间提交 zk-SNARK 证明。这是因为生成 zk-SNARK 证明需要时间和计算资源。\r\n\r\n\r\n## 原生抽象账户\r\nzkSync Era 是第一个实现**原生**账户抽象（Account Abstraction）的 EVM 兼容链。\r\n【首先得了解eth的账户抽象时什么，ETH的账户抽象ERC4337协议还是需要EOA address的参与，所以这个方案并不好，原生的意思就是不需要EOA了，address 本身就支持智能账户控制】\r\n\r\n在传统的以太坊生态中，账户分为外部拥有账户（Externally Owned Accounts, EOAs）和合约账户。EOAs 由私钥控制，而合约账户则由部署在其中的代码控制。这种设计虽然简单有效，但在某些情况下限制了可操作性和灵活性。\r\n\r\nzkSync 的原生账户抽象允许每个账户都能像智能合约一样拥有自己的逻辑。这意味着用户可以直接在他们的账户内部实现自定义逻辑，比如自动化的支付、权限管理、多重签名等，而无需通过外部合约或服务。\r\n\r\n原生账户抽象有许多优势：\r\n\r\n* **更高的安全性与灵活性**: 通过在账户级别直接实现自定义逻辑，用户可以创建更安全、更符合需求的账户模型。\r\n* **简化用户体验**: 账户抽象简化了用户与区块链互动的复杂度。用户不再需要管理多个合约地址或理解智能合约的复杂性，就可以直接从他们的账户进行高级操作。\r\n* **促进创新**: 原生账户抽象开辟了一片新的可能性空间，开发者可以利用这一特性创造前所未有的 DApps 和数字资产管理策略。\r\n\r\nzkSync 提供了一系列模版和工具帮助开发者基于账户抽象进行开发，在之后的文章详细介绍。\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n# Reference\r\n1. [WTF zkSync 极简入门: 2. zkSync 基础](https://www.wtf.academy/docs/zksync-101/zkSync/)"},"author":{"user":"https://learnblockchain.cn/people/17075","address":"0xfd8D7EA8C9e424840890888AaebD9a8020aAFD45"},"history":null,"timestamp":1715796238,"version":1}