Scroll 将构建一个兼容EVM 的zk-Rollup方案,实现三个目标:
- 完全兼容EVM;
- 实现Layer-2 proof 外包;
- 采用新的分层零知识证明方案。
zkEVM
有两种在zk-Rollup构建Dapps中的方式:
- 对不同的Dapps, 构建
application-specific
电路(ASIC); - 构建通用的EVM电路, 保证合约执行。
第一种方式需要开发者设计ASIC
, 并且导致可组合性(composibility)问是。第二种方式对开发者友好,实现难度较大。
随着zk技术的不断进步:
- 提出了更多符合zk的密码基元,例如
Poseidon hash
比SHA256 效率高100倍; - 对于通用VM的效率不断提升,例如
TinyRAM
; - 通用zk方案的优化,例如
Plonkup
等。
使得构建zkEVM成为可能。
zkEVM挑战
构建zkEVM非常困难,主要有以下原因:
- EVM只能支持有限的椭圆曲线 ,EVM只支持BN254双线性对,很难使用递归证明,因为不支持
cyclic
椭圆曲线。 - EVM字大小为256位,zk基本上素域上,域元素不匹配会导致EVM的每一步增加100个约束条件;
- EVM有一些特殊的
opcodes
, 例如CALL
, 为电路设计带来挑战。 - EVM是基于栈的虚拟机,
SyncVM
和Cairo
为基于栈的架构,采用专用编译器编译智能合约。 - 以太坊存储负担比较大,依赖
Keccak
和MPT
,都是非zk友好的。Keccak 比Poseidon电路复杂1000倍。 - 即使以上都问题都解决了,但是复合起来,仍是一个挑战,实现完全的EVM电路可能仍非常复杂。
技术进展
近年来,zkEVM取得一系列的进展:
- 多项式承诺:过去的zk-snark主要采用R1CS系统,会导致电路膨胀,多项式承诺允许每个约束条件任次数任意;
-
lookup table
和定制门电路: 例如Plookup, TurboPlonk, UltraPlonk, 可以大幅降低电路的负载; - 递归证明:先前的方案依赖双性线对友好的曲线(MNT), 导致很大的计算负担,Halo 通过内积避免这个问题;
- 硬件加速:采用GPU, ASIC/FPGA加速。
zkEVM 设计
对于每一个EVM字节码的执行过程为:
- 从
stack, memory, storage
中读取数据; - 对读取的数据进行计算;
- 将计算的结果写入
stack, memory, storage
中。
zkEVM的证明需要保证以下过程:
- 字节码正确载入;
- 字节码是一个接一个的有效执行;
- 每个字节码正确执行(包括三个子步骤,即R/W + compuation);
zkEVM 开发设计需要满足以下要求:
-
需要设计密码累加器的电路,实现可验证的存储,保证读入的字节码的有效性;
-
设计电路,链接字节码和真实的执行路径,不同的数据输入,会导致不同的执行路径。
-
需要实现每个字节码的电路设计,证明(R/W+Computation)过程,同时需要优化:
- 将R/W 和计算分成两个证明;
- 为每个字节码设计高次数的定制约束条件。
zkEVM不仅可以用在L2中,还可以直接用在L1中,类似Mina,实现所有状态转换的一次证明。
参考
https://hackmd.io/@yezhang/S1sJ2cEWY
网友评论