9 月 1 日凌晨,以太坊扩容网络 Arbitrum 宣布主网公测版本正式上线,与此同时Optimism则早已经向部分白名单应用开放,这标志着以太坊 L2 扩容方案的一支——Optimistic Rollup 正式登上了舞台。
我们再将目光转向 L2 扩容方案的另一支,ZK Rollup:
zkSync 于 8 月 31 日宣布推迟上线其 2.0 版本,基于 zkEVM,zkSync 2.0 有望成为首个兼容 EVM 的 ZK Rollup;
8 月 13 日,Polygon 宣布以 2.5 亿美元收购以太坊二层扩容方案 Hermez,Hermez 的核心技术正是其 zkEVM 方案;
同样是 8 月 13 日,以太坊基金会在定期公布其支持的团队研究与开发进度的文章中表示,过去几个月已经资助组建了一个团队以进行 zkEVM 的研发。
我们知道,Vitalik 在比较两种扩容方案时表示,短期 Optimistic Rollups 很可能在通用的 EVM 计算中胜出,但最终从中长期来看,随着 ZK-SNARK 技术的改进,ZK Rollups 将在所有场景中胜出。其中所谓「ZK-SNARK 技术的改进」,主要就是指 zkEVM 的成功。
可见,zkEVM 已经成为以太坊扩容方案皇冠上的明珠。笔者希望通过本文,可以让读者了解 zkEVM 的基本原理与发展现状。
zkEVM 的作用
要弄清楚 zkEVM 的作用,我们还需要一些前置知识。
我们先从以太坊讲起,从本质上来讲,以太坊是一个基于交易的状态机。
从以太坊的创世纪状态(Genesis State)开始,通过一个区块又一个区块的交易,转变成最终状态,也即以太坊当前的状态,状态中包含了所有的账户地址和其映射的账户状态。
source:https://ethfans.org/posts/how-does-ethereum-work-anyway
其中具体负责处理交易的就是 EVM,即 The Ethereum Virtual Machine (以太坊虚拟机)。EVM 作为一个堆栈机运行,程序员用高级语言例如 Solidity 来编写代码,随后代码被编译成 EVM 可以理解的 EVM 字节码,作为各种 EVM 指令执行标准的堆栈操作,最终产生一个新的状态。
现在的问题来了,我们知道 ZK Rollup 方案需要对二层上的交易生成零知识证明,再传回一层进行验证,而要生成零知识证明,需要交易的处理过程符合 zk 电路证明的规范。而在 EVM 设计之初,显然没考虑过要支持零知识证明(毕竟那是 6,7 年前,零知识证明没进入大多数人的视野),这就是 zkEVM 的意义:一种运行在 ZK Rollup 网络上,兼容 EVM 同时又对零知识证明友好的虚拟机。
两种实现策略
对于 zkEVM,目前主要有两种实现策略:
- 直接支持 EVM 现有的指令集,完全兼容 solidity 指令集。使用这种方案的包括 Hermez 和以太坊基金会 zkEVM。
- 重新设计一种虚拟机,该虚拟机对零知识证明友好,同时对 EVM 开发工具进行适配,来保持对 solidity 的兼容,使用这种方案的主要是 zkSync;
对于第一种策略,由于完全支持了 EVM 现有的指令集,其使用的是和 EVM 一样的编译器,因此天然就对现有的生态系统和开发工具完全兼容,同时还更好的继承了以太坊的安全模型。
而对于第二种策略,由于不受原有 EVM 指令集的约束,可以更灵活的将代码编译成对零知识证明更友好的指令集,同时也摆脱了兼容所有 EVM 原有指令集所需要的艰巨而繁重的工作。
总的来说,第一种策略兼容性更好,安全性更高,但是工作量更大;第二种策略更灵活,工作量更小,但需要花费额外精力在适配上。
主要方案对比
Hermez zkEVM
Hermez 采用的是第一种策略,其将所有 EVM 指令集全部翻译为中间指令(micro opcode)。
众所周知,EVM 有一些变长的指令,比如 CALL,EXP,CREATE 等,这些指令天生对 zk 电路证明不友好,利用中间指令可以更友好地表达这些指令的逻辑。中间指令在 uVM 中执行,uVM 中使用了大量的密码学工具,来实现 zk 完备,并且使用了 Plookup 算法来提升证明及验证效率。
Hermez zkEVM 在实现上的另外一个亮点,是其同时使用了两套证明系统,具体来说即生成一个 STARK 证明,然后再用 PLONK 或 Groth16 对这个 STARK 证明生成一个证明并在一层进行验证,这一过程就像是对证明的证明。之所以这么做,是因为 STARK 虽然很优秀,但是证明规模却很大,在链上进行验证时开销也很大,而 Groth16 或 PLONK 却拥有更小的证明规模和更快的验证速度。这种两相结合,各取所长的做法,很容易让人想到非对称加密算法和对称加密算法结合使用的场景。
AppliedZKP zkEVM
AppliedZKP zkEVM 和 Hermez 一样,采用的是第一种策略。
AppliedZKP 采用数据总线(Bus Mapping)的思路,将存储和计算分开。在 Bus Mapping 抽取了正确的存储数据的基础上,由 State proof 证明数据的一致性,EVM proof 证明计算逻辑的正确性。
具体的过程如下:
- EVM 通过 Bus Mapping 读取需要的相关状态,状态由 Storage,Memory,Stack 三部分组成;
- EVM 执行 opcode;
- EVM 再通过 Bus Mapping 写回新的状态;
- 过程中 State proof 负责 Bus Mapping 读写信息的一致性和正确性,EVM proof 负责 EVM 对 opcode 执行的正确性。
zkSync EVM
与 Hermez 和 AppliedZKP 不同,zkSync 选取了第二种策略。zkSync 的 zkEVM 并非 EVM 的复刻品,而是为了能够运行 99% 的 Solidity 合约并确保其能够在各种情况下(包括回滚和异常情况)正常工作而全新设计。与此同时,zkEVM 可以用来高效的在电路中生成零知识证明。
zkSync EVM 使用 TinyRAM 来实现普通指令集,而对 Gas 消耗巨大的指令如 SHA256/keccak 则特殊实现其电路,最后使用递归聚合技术,将所有的证明聚合成一个,以提升效率。
soruce:https://medium.com/matter-labs/zksync-2-0-hello-ethereum-ca48588de179
zkSync 同时开发了两套针对 zkEVM 的编译器前端: Yul 和 Zinc。 Yul 是可以针对不同后端编译成字节码的中间 Solidity 表示;Zinc 则是基于 Rust 为智能合约和通用零知识证明电路开发的语言。这给予了开发者更大的选择空间。
同时,在构建自己的编译器时,zkSync 选择了 LLVM,这一生产工业级产品最先进的编译器框架,以确保编译器足够完备和拥有所有经典优化。
写到最后
zkEVM 技术在多个优秀团队的持续努力下,已经日渐成熟,相信在半年左右的时间内就会相继落地,届时兼容 EVM 的 ZK Rollup 扩容方案一定会绽现出自己的光彩。
如今的区块链技术正进入了前所未有的大争鸣时代。从公链之争,到以太坊扩容方案之争,甚至具体到一个扩容方案下,都有着不同的项目方正在前赴后继,你追我赶。笔者十分庆幸,能身处这个区块链技术最生机勃勃的大时代。
参考资料:
2. zkSync 2.0: Hello Ethereum!
3. Episode 175: zkEVM & zkPorter with Matter Labs
4. Episode 194: zkEVM with Jordi & David from Hermez
5. Exploring Popular zkEVM Solutions: AppliedZKP\, Matter Labs\, Hermez\, and Sin7Y