本文深入探讨了零知识以太坊虚拟机(ZK-EVM)的各种类型及其优缺点,概述了Vitalik对ZK-EVM的分类,并从开发者角度分析了Taiko、Linea、Polygon zkEVM、Scroll 和 zkSync Era 这些公司构建的 ZK-EVM,同时还介绍了 Kakarot。文章还探讨了这些不同方案的未来发展方向,以及它们对以太坊生态系统的潜在影响。
所有的 ZK-EVM(零知识以太坊虚拟机)都旨在实现同一个目标:使以太坊更具可扩展性,并扩大 web3 的应用。
作为一名开发者,现在你有几种不同的选择来创建和部署智能合约到 ZK-EVM 上,每种选择都有其独特的实现、优点和缺点。
在这篇文章中,我们将介绍 Vitalik 定义的不同类型的 ZK-EVM,每种类型的优缺点,讨论哪些公司正在研究它们,并将智能合约部署到每种类型上。
让我们深入了解一下吧!
如果你正在阅读这篇文章,但还不熟悉零知识证明或 ZK-EVM,我建议你阅读下面链接的两篇我之前的文章。
首先,对 ZK-EVM 有一个基本的了解:
https://blog.jarrodwatts.com/zkevms-and-the-race-to-scale-ethereum
如果你想更深入地了解,我还写了一篇关于零知识证明如何工作的文章,没有任何数学公式:
https://blog.jarrodwatts.com/how-zk-proofs-and-zkevms-work
TLDR:ZK-EVM 是以太坊的 rollup,它将交易批量处理,并将该批次的“有效性证明”发布回以太坊区块链 + 它们是 EVM 兼容的,这意味着你不需要专门的工具来使用它们。
以太坊虚拟机(EVM)是以太坊上智能合约的运行时环境。以太坊不仅存储所有账户和余额,类似于比特币,还额外存储了所谓的“机器状态”。
机器状态存储在 trie 数据结构中,并在执行该区块中包含的交易后,从一个区块到另一个区块发生变化。
EVM 是确定性的,这意味着在任何给定状态下执行的一组指令每次都会产生相同的新状态。一个简单的类比是想象一场国际象棋比赛。
棋盘(以太坊)具有游戏可以处于的大量(在以太坊中,无限)状态。游戏有关于可以执行哪些移动(交易)的规则,以及关于谁可以执行哪些操作的限制(使用账户、签名等)。
就像以太坊一样,玩家进行移动(提交交易),游戏(以太坊)决定允许哪些规则,并执行它们,从而在每次移动(区块)后产生一个新的棋盘(世界)状态。
以太坊文档将其描述为一个数学函数:
给定一个输入,它会产生一个确定性的输出。因此,将以太坊更正式地描述为具有状态转换函数非常有帮助:
Y(S, T)= S'2
给定一个旧的有效状态
(S)
和一组新的有效交易(T)
,以太坊状态转换函数Y(S, T)
产生一个新的有效输出状态S'
作为以太坊上的开发者,或者任何其他 EVM 兼容的区块链,你通常使用 Solidity 编写智能合约(尽管存在其他语言,如 Vyper 和 Yul)。
与所有其他 高级语言 一样,它们旨在对人类来说易于阅读,因此我们不必担心像 寄存器、内存地址和调用堆栈 这样的难题,而是专注于可用性。
然而,机器不理解这种 Solidity 无稽之谈; 包括 EVM。EVM 理解 字节码,它是二进制的; 机器可读的代码。
字节码表示一系列 EVM 操作码(opcodes),每个操作码在 EVM 中执行一个特定的操作; 有时这些操作码与堆栈操作有关,如 PUSH
(添加到堆栈)或 POP
(从堆栈中删除),但也处理特定于区块链的操作,如 ADDRESS
和 BALANCE
。
每个项目是一个 256 位的字,选择它是为了便于使用 256 位密码学(如 Keccak-256 哈希或 secp256k1 签名)。
作为开发者,这意味着我们需要一种方法将我们的智能合约代码从 Solidity → Opcodes → Bytecode 转换,以便 EVM 可以执行它。
幸运的是,我们有 编译器 为我们做这件事。
让我们看一个例子。我有一个用 Solidity 编写的非常基本的智能合约:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.11;
contract Greeter {
// Internal state to the contract
string private greeting;
// Constructor - run when contract is deployed
constructor(string memory _greeting) {
greeting = _greeting;
}
// Read function (can be called without a transaction)
function greet() public view returns (string memory) {
return greeting;
}
// Write function (requires a transaction to be called)
function setGreeting(string memory _greeting) public {
greeting = _greeting;
emit GreetingChanged(_greeting);
}
event GreetingChanged(string newGreeting);
}
但是,我有一个问题。EVM 无法理解这个 Solidity!它需要字节码...... 所以,我将使用一个编译器来帮助我; 更具体地说,例如,我可以使用 Remix IDE 中的内置编译器来帮助我。
在我编译它之后,我可以检查被编译的操作码,反映我的智能合约的内容。
Opcode:
我还可以检查从这些操作码编译的字节码。
Bytecode:
60806040523480156200001157600080fd5b5060405162000c2938038062000c298339818101604052810190620000379190620001e3565b80600090816200004891906200047f565b505062000566565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000b9826200006e565b810181811067ffffffffffffffff82111715620000db57620000da6200007f565b5b80604052505050565b6000620000f062000050565b9050620000fe8282620000ae565b919050565b600067ffffffffffffffff8211156200012157620001206200007f565b5b6200012c826200006e565b9050602081019050919050565b60005b83811015620001595780820151818401526020810190506200013c565b60008484015250505050565b60006200017c620001768462000103565b620000e4565b9050828152602081018484840111156200019b576200019a62000069565b5b620001a884828562000139565b509392505050565b600082601f830112620001c857620001c762000064565b5b8151620001da84826020860162000165565b91505092915050565b600060208284031215620001fc57620001fb6200005a565b5b600082015167ffffffffffffffff8111156200021d576200021c6200005f565b5b6200022b84828501620001b0565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200028757607f821691505b6020821081036200029d576200029c6200023f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003077fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002c8565b620003138683620002c8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003606200035a62000354846200032b565b62000335565b6200032b565b9050919050565b6000819050919050565b6200037c836200033f565b620003946200038b8262000367565b848454620002d5565b825550505050565b600090565b620003ab6200039c565b620003b881848462000371565b505050565b5b81811015620003e057620003d4600082620003a1565b600181019050620003be565b5050565b601f8211156200042f57620003f981620002a3565b6200040484620002b8565b8101602085101562000414578190505b6200042c6200042385620002b8565b830182620003bd565b50505b505050565b600082821c905092915050565b6000620004546000198460080262000434565b1980831691505092915050565b60006200046f838362000441565b9150826002028217905092915050565b6200048a8262000234565b67ffffffffffffffff811115620004a657620004a56200007f565b5b620004b282546200026e565b620004bf828285620003e4565b600060209050601f831160018114620004f75760008415620004e2578287015190505b620004ee858262000461565b8655506200055e565b601f1984166200050786620002a3565b60005b8281101562000531578489015182556001820191506020850194506020810190506200050a565b868310156200055157848901516200054d601f89168262000441565b8355505b6001600288020188555050505b505050505050565b6106b380620005766000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063a41368621461003b578063cfae321714610057575b600080fd5b610055600480360381019061005091906102ab565b610075565b005b61005f6100bf565b60405161006c9190610373565b60405180910390f35b806000908161008491906105ab565b507f58c1144814f1df01a80f7347f945437a37cd818e027f87b0ade6db623ec41b57816040516100b49190610373565b60405180910390a150565b6060600080546100ce906103c4565b80601f01602080910402602001604051908101604052809291908181526020018280546100fa906103c4565b80156101475780601f1061011c57610100808354040283529160200191610147565b820191906000526020600020905b81548152906001019060200180831161012a57829003601f168201915b5050505050905090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6101b88261016f565b810181811067ffffffffffffffff821117156101d7576101d6610180565b5b80604052505050565b60006101ea610151565b90506101f682826101af565b919050565b600067ffffffffffffffff82111561021657610215610180565b5b61021f8261016f565b9050602081019050919050565b82818337600083830152505050565b600061024e610249846101fb565b6101e0565b90508281526020810184848401111561026a5761026961016a565b5b61027584828561022c565b509392505050565b600082601f83011261029257610291610165565b5b81356102a284826020860161023b565b91505092915050565b6000602082840312156102c1576102c061015b565b5b600082013567ffffffffffffffff8111156102df576102de610160565b5b6102eb8482850161027d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561032e578082015181840152602081019050610313565b60008484015250505050565b6000610345826102f4565b61034f81856102ff565b935061035f818560208601610310565b6103688161016f565b840191505092915050565b6000602082019050818103600083015261038d818461033a565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806103dc57607f821691505b6020821081036103ef576103ee610395565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261041a565b610461868361041a565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006104a86104a361049e84610479565b610483565b610479565b9050919050565b6000819050919050565b6104c28361048d565b6104d66104ce826104af565b848454610427565b825550505050565b600090565b6104eb6104de565b6104f68184846104b9565b505050565b5b8181101561051a5761050f6000826104e3565b6001810190506104fc565b5050565b601f82111561055f57610530816103f5565b6105398461040a565b81016020851015610548578190505b61055c6105548561040a565b8301826104fb565b50505b505050565b600082821c905092915050565b600061058260001984600802610564565b1980831691505092915050565b600061059b8383610571565b9150826002028217905092915050565b6105b4826102f4565b67ffffffffffffffff8111156105cd576105cc610180565b5b6105d782546103c4565b6105e282828561051e565b600060209050601f8311600181146106155760008415610603578287015190505b61060d858261058f565b865550610675565b601f198416610623866103f5565b60005b8281101561064b57848901518255600182019150602085019450602081019050610626565b868310156106685784890151610664601f891682610571565b8355505b6001600288020188555050505b50505050505056fea2646970667358221220a1f816fe7c07bf6a147b15ff4e1b591d0b43aca9fc57c8ddaecce27d5fe6f5fa64736f6c63430008120033
你看到的最终字节码是 EVM 可以理解的内容。所以你可以想象为什么开发者希望使用高级语言而不是自己编写字节码。
我们现在可以做的是,将字节码中发生的事情与操作码完全匹配起来。让我们来看看前三个操作码,PUSH 80
,PUSH 40
和 MSTORE
。
我已经将字节码的前 10 个十六进制值与我们看到的第一个 3 个操作码匹配起来:
PUSH 80
/ 6080
: 将值 80(十六进制)推送到堆栈上。
PUSH 40
/ 6040
: 将值 40(十六进制)推送到堆栈上。
MSTORE
/ 52: 将第二个堆栈项(40)存储在由第一个堆栈项(80)指定的内存位置。
我们可以进行这个匹配过程,因为以太坊 记录了与字节码值对应的每个操作码:
构建 EVM 兼容的 rollup 的挑战在于 [以太坊最初不是围绕 ZK 友好性设计的,所以以太坊协议的_许多_部分需要大量的计算来证明 ZK](https://vitalik.ca/general/2022/08/04/zkevm.html#:~:text=Ethereum%20Linea 在表示链的状态的方式上也偏离了以太坊。例如,以太坊使用的哈希函数 keccak 已被更改为更 ZK 友好的替代方案。尽管存在这种内部差异,但你部署到 Linea 的智能合约字节码与你使用以太坊时部署的字节码相同。
一旦我获得了一些 Goerli 测试网 ETH (这是一个小小的任务),我就前往 Linea 桥 将 ETH 桥接到 Linea 测试网。
一旦我成功地将资金桥接过来,开发过程就与以太坊相同。我的 Greeter 智能合约的一切都如预期般工作:
我可以轻松部署 NFT 合集 并铸造我的第一个 Linea NFT:
Linea 的桥 UI 目前不可用,但你可以直接调用他们 桥智能合约 上的 sendMessage
函数。根据 Linea 文档,将 ETH 从 L2 桥接回 L1 大约需要 15 分钟,但在我的测试过程中花费了几个小时。
以下是我与 Linea 交互的总结:
合约交互 | Gas 费 (以 ETH 为单位) | Gas 费 (美元) |
---|---|---|
部署 Greeter Solidity 智能合约 | 0.000466914075602163 | $0.87 |
运行 "setGreeting" 函数 | 0.000053601071759034 | $0.10 |
部署 NFT 合集 (通过代理) | 0.001233567189763232 | $2.31 |
铸造 NFT | 0.000096778500451633 | $0.61 |
将资金桥接回 ETH L1 | 0.000096778500451633 | $0.18 |
这些价格与 Taiko 非常相似;但同样,这些是测试网的数值!
免责声明:在撰写本文时,我目前在 Polygon Labs 工作。因此可能存在一些无意识的偏见。
Polygon zkEVM 目前是 type 3 ZK-EVM,在转换为 type 2 ZK-EVM 之前,需要进行少量更改。你可以查看 Polygon zkEVM 在文档中透明列出的与 EVM 行为不同的 操作码、预编译合约 和 其他细微差异。
通过对 EVM 行为的等效性进行权衡,Polygon zkEVM 能够在短短几分钟内生成和发布 ZK 证明;允许你在与 zkEVM 交互后大约 ~30 分钟 内将资金桥接回以太坊 L1。
使用 Polygon zkEVM,你部署的字节码与以太坊相同,但是,此字节码的解释过程略有不同。
EVM 字节码使用 零知识汇编语言 (zkASM) 进行解释,该语言由 Polygon zkEVM 团队专门开发。在 Vitalik 的博客文章中,他提到了这一点:
Polygon 有一个独特的设计,他们正在 ZK 验证他们自己的内部语言,称为 zkASM,并且他们使用 zkASM 实现来解释 ZK-EVM 代码。尽管存在这种实现细节,但我仍然将其称为真正的 Type 3 ZK-EVM;它仍然可以验证 EVM 代码,只是使用了一些不同的内部逻辑来完成。
polygon 工程团队还表示,他们将完成剩余的预编译,以成为 type 2,此外还将很快改进证明生成和提款时间。
Polygon zkEVM 主网测试版于 2023 年 3 月启动,因此我将使用主网资金进行此过程。首先,我使用 Polygon 桥 将我的资金发送到 zkEVM。此过程的 gas 费约为 5 美元,资金到达 L2 大约需要 5 分钟。
就像前两条链一样,它是无缝的,并且表现得如我期望的以太坊一样。我可以轻松部署我的 Greeter 智能合约 并调用其上的函数,以及部署 NFT 合集 并铸造 NFT:
桥接回以太坊 L1 大约需要 60 分钟,另外还需要 5 美元才能将我的资金取回到以太坊主网。
如果你希望在 Polygon zkEVM 上进行构建,请考虑查看我的以下指南,该指南将在不到 10 分钟的时间内带你完成整个过程:
https://blog.jarrodwatts.com/the-ultimate-guide-to-building-on-polygon-zkevm
注意:Scroll 目前处于测试网阶段。
与 Polygon zkEVM 类似,Scroll 目前是 type 3 ZK-EVM,正在努力成为 type 2,并在其文档中定义了与以太坊的 操作码、预编译 和 其他差异 上的透明文档。Scroll 文档概述:
对于普通的 Solidity 开发人员来说,这些细节不会影响你的开发体验。
在 Scroll 博客上,他们还列出了发布其主网所需的剩余确切工作 - 请参见 Scroll zkEVM 的后续步骤。
就像到目前为止我们探索过的先前链一样,Scroll 能够执行你将部署到以太坊的相同本地字节码,这意味着开发过程没有变化。
我可以轻松地通过他们的 桥 UI 将资金桥接到 Scroll 测试网:
估计将资金桥接到 L2 的时间在 8-14 分钟 之间,我花了 10 分钟才能在 L2 上使用它们。
一切都以我期望的以太坊的方式运行,我可以轻松地再次部署我的 Greeter 智能合约 和我的 NFT 合集:
根据 Scroll 文档,将资金桥接回以太坊 L1 估计需要 10 分钟到几个小时 (不幸的是,我错过了我所花费的确切时间)。
以下是我在 Scroll 测试网上进行的交易的摘要。在我的测试过程中,gas 费似乎比我们之前探索过的链便宜得多,但我不知道为什么会这样:
合约交互 | Gas 费 (以 ETH 为单位) | Gas 费 (美元) |
---|---|---|
部署 Greeter Solidity 智能合约 | 0.000000275329 | $0.00051 |
运行 "setGreeting" 函数 | 0.000000031618 | $0.000059 |
部署 NFT 合集 (通过代理) | 0.000000749896 | $0.0014 |
铸造 NFT | 0.00000020381 | $0.00038 |
将资金桥接回 ETH L1 | 0.000000261872 | $0.00049 |
zkSync Era 是 type 4 ZK-EVM,并且体验与我们到目前为止探索过的其他产品完全不同。
Era 接受了这样一个事实,即为其 zkEVM 部署的智能合约字节码与以太坊不同;这种巨大的差异使其产品能够提供独特的产品,例如 原生帐户抽象。
https://learnblockchain.cn/article/19887
这些功能上的基本变化带来了开发者体验上的差异,但正如 Vitalik 所定义的;仍然允许你使用相同的高级语言,例如 Solidity。
Era 附带了一套 最佳实践和注意事项,用于在与以太坊交互时可能会遇到不同行为的地方,并且需要在你的开发设置中进行一些细微的调整。
例如,我需要安装一个额外的 Hardhat 扩展,并在我的 Hardhat 配置中添加一个额外的标志,以编译链所需的字节码:
在编译过程中,为你生成的用于与 zkSync 交互的字节码与默认生成的字节码不同:
现有的部署工具,如 thirdweb deploy (在 EVM Kit 中使用),通过向 deploy
命令提供 --zksync
标志来支持此字节码。
总的来说,只需要对使用 Solidity 和我的标准开发环境与 zkSync 协作进行少量更改。
使用 zkSync 的 桥,估计大约需要 15 分钟资金才能到达 L2。
在此之后,流程是相同的!我可以部署我的 Greeter 智能合约,以及我常用的 NFT 合集,其中铸造了一个 NFT:
目前,从 zkSync Era 桥接资金回以太坊 L1 有 24 小时的延迟:
为了确保协议最初几天的安全性,从 zkSync Era (L2) 到以太坊 (L1) 的提款有 24 小时的延迟。有关更多详细信息,请参见我们的 博客文章。
这是我在 zkSync Era 上的交互总结:
Gas 费 (以 ETH 为单位) | Gas 费 (美元) | |
---|---|---|
部署 Greeter Solidity 智能合约 | 0.001839549 | $3.47 |
运行 "setGreeting" 函数 | 0.00007822825 | $0.15 |
部署 NFT 合集 (通过代理) | 0.0007640925 | $1.44 |
铸造 NFT | 0.0002108245 | $0.40 |
将资金桥接回 ETH L1 | 0.000140764 | $0.27 |
就在上个月,一个新的用 Cairo 编写的 zkEVM 被称为 Kakarot,旨在 将 EVM 兼容性带到 Starknet,作为 type 2.5 ZK-EVM,但目前被认为是 type 3。
虽然它确实有一个非常酷的名字和着陆页,但它也收到了 Vitalik 本人以及包括 Starkware 在内的其他人的资助。
测试网尚未发布,但计划在 2023 年晚些时候发布,他们的开发团队提供了 以下更新:
Kakarot 团队 (在 Starknet 基金会的支持和 40 多位独特贡献者的共同努力下) 实现了令人印象深刻的里程碑,仅在六个月内以不到 5,000 行代码实现了 100% 的 EVM 操作码和 9 分之 8 的 EVM 预编译!
与其说这是一场关于哪条链是最好的争论,不如说它总体上有利于以太坊和 web3 的改进,因为正在探索如此多的不同方法;每种方法都有其自身的优点和缺点。
Vitalik 还解释了他的 "多证明者理论",其中汇总可能会潜在地合作以增强整个生态系统的安全性,以及 ZK-EVM 未来的其他替代方案。
https://www.youtube.com/watch?v=6hfVzCWT6YI
这就是今天 ZK-EVM 的格局,至少据我所知!
你可以在下面找到在该领域工作的公司的摘要,以及他们各自产品的当前 ZK-EVM 类型:
如果你希望在 ZK-EVM 上构建,请考虑查看我在下面创建 Polygon zkEVM 上全栈应用程序的指南: https://learnblockchain.cn/article/19722
- 原文链接: blog.jarrodwatts.com/the...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!