前序博客有:
Polygon zkEVM为zk-rollup layer 2扩容方案,其:
开源代码见:
各代码库有:
Core Repos | Specific Tools & Libraries | Generic Tools & Libraries |
---|---|---|
zkevm-proverjs:以Javascript编写的zkEVM proof generator。 | zkevm-commonjs:以Javascript实现的Polygon-Hermez zkEVM通用工具库。 | pilcom:为Polynomial Identity Language(PIL)编译器。 |
zkevm-rom:包含了polygon-Hermez zkEVM的zkASM源码。 | zkasmcom:zkASM Compiler。将zkASM文件编译为json文件,供zkExecutor使用。 | pil-stark:Generate a stark from a SM written in pil。 |
zkevm-prover:以C++语言实现的zkEVM proof generator。 | zkevm-testvectors:为与Ethereum test类似的,针对Polygon-Hermez zkEVM实现所提供的test vectors。 | |
zkevm-node:Go语言实现的Polygon zkEVM节点软件。 | zkevm-storagerom:为Storage状态机的zkASM实现,可将.zkasm storage编译为json文件。 | |
zkevm-contracts:相关智能合约。 | goldilocks:为一个素数域,用于实现Poseidon哈希函数。 | |
zkevm-bridge-service:与bridge合约交互,提供Merkleproofs。Go语言。 | zkevm-comms-protocol:模仿真实的zk-Prover接口和功能。 | |
zkevm-bridge-ui:UI界面,用户用于在以太坊和Polygon zkEVM之间来回转移ETH和ERC-20资产。 | ||
zkevm-doc:相关文档。 |
证明某EVM交易执行正确的第一步是:
所谓execution trace,是指满足EVM processing约束的一组值。将execution trace以矩阵表示,每列具有一个name。将每列插值为一个多项式,将execution的正确性 最终reduce为 验证多项式之间(列之间) 的一组identities。设计合适的列和identities的过程 称为 arithmetization。
Polygon zkEVM提供了an efficient arithmetization of the EVM。
由Executor负责创建execution trace。
Executor的输入有:
Executor本质上是一种名为zkASM的汇编语言解释器。
使用zkASM语言来构建名为zkROM的程序,Executor运行zkROM程序来提供合适的execution trace。
在zkROM程序中,每个EVM opcode都以一组zkASM指令集来实现。
每个zkASM指令利用了execution trace矩阵中的一行,又名zkEVM的一个“step”。
Executor为zkProver的一部分,zkProver为Polygon zkEVM的核心部件。
zkProver与节点和Database(DB)之间的交互流程为:
根据zkEVM Audit Education Sessions 1/4 -Circuit Arithmetization for ZKP有:
zkProver采用模块化设计,主要由14种state machines组成:
zkProver这种模块化的设计,使得Main SM可将其职责委托给尽可能专业的state machine,通过委托实现效率的提升。
Main SM Executor直接向secondary state machine发送名为Actions的合适指令 来传达命令。
上图灰色方框即表示的是Actions。这些指令会命令 某state machine内的state如何transition。无论是来自Main SM还是来自特定SM的“Action”,每个Action都必须附加一个proof以证明其执行的正确性。
SM之间有一些相互依赖:
Polygon Hermez团队为zkProver创建了2种编程语言:
1)zkASM:Zero-Knowledge Assembly language。zkASM负责将zkProver Main SM的指令映射到其它SM。若SM有firmware,则zkASM为该firmware的解析器。
zkASM代码的输入为 来自Main SM的指令,输出为 生成特定SM Executor如何运行计算的特定assembly codes。该Executor会严格遵循zkASM代码的规则和逻辑,从而可很容易地验证计算。
2)PIL:Polynomial Identity Language。因为几乎所有的状态机都将计算表示为多项式。状态机内状态变化必须满足特定计算相关的polynomial identities。
Polygon zkEVM项目的主要目的是解决区块链不可能三角问题:隐私性、安全性、可扩展性,其本质是一种高效零知识承诺机制。而当前最安全和高效的承诺机制为多项式承诺机制,将计算转换成某种多项式语言是有利的,在这种语言中,验证归结为测试执行是否满足某些多项式恒等式(identities)。
zkProver状态机内的所有PIL代码,构成了verifier code的DNA。
Polynomial Identity Language(PIL)为定义state machine execution trace约束的领域特定语言。
PIL用于:
以满足execution是正确的。
zkProver中有2种微处理器类型的状态机:
这2种微处理器类型的状态机有:
尽管Main SM和Storage SM看起来跟上图一样,但是二者区别很大:
值得注意的是,每个微处理SM有各自的ROM。
有2个二级状态机负责哈希运算,二者均为标准密码学哈希函数的“automised”版本:
zkProver的状态机设计为:
每个二级状态机内包含了:
系统实现交易的证明和验证的基本流程为:
多项式约束以PIL语言编写,而指令初始以zkASM语言编写,然后以JSON格式表达和存储。
尽管并不是所有的verification都包含了Plookup,但确实Plookup在zkProver中承担的了重要角色:
zkProver主要有4大核心元素:
采用zk-STARK是因其证明速度很快,无需trusted setup,但是,zk-STARK的proof size很大,为此,引入zk-SNARK来证明zk-STARK proof的正确性,然后将zk-SNARK proof作为状态变化的validity proof发送到L1。借助zk-SNARK,验证validity proof的gas开销由500万降低为35万。
对于如EVM这样的复杂state machine,其execution trace对应的列数量和identities数量可达数千。而管理如此庞大的矩阵将是非常复杂且难处理的。
为简化,Polygon zkEVM使用divide and conquer技术,将execution trace切分为更小的矩阵。
使用名为plookup的proving技术,使得一个矩阵的行 可 关联到 另一矩阵的行 成为可能。
此外,还使用了:
PIL语言:
namespace
关键字来命名execution trace中切分的每个矩阵的列。in
关键字来定义inclusion。is
关键字来定义permutation。Polygon zkEVM中,会将execution trace切分为:
借助divide and conquer技术:
根据Polygon团队Jordi Baylina在2022年4月的分享Jordi Baylina - How we are building the zkEVM 可知:
Fibonacci序列: a 1 , a 2 , … , a n \mathbf{a_1, a_2, \dots , a_n} a1,a2,…,an,满足 a i + 1 = a i − 1 + a i \mathbf{ a_{i+1} = a_{i-1} + a_i } ai+1=ai−1+ai。
如具有12个成员的序列:
0 , 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , 55 , 89 , … \mathbf{ \ \ 0,\ \ 1,\ \ 1,\ \ 2,\ \ 3,\ \ 5,\ \ 8,\ \ 13,\ \ 21,\ \ 34,\ \ 55,\ \ 89,\ \ \dots } 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …
很容易检查发现 377 \mathbf{377} 377和 987 \mathbf{987} 987是Fibonacci 序列成员。但若要判断 12 , 586 , 269 , 025 \mathbf{ 12,586,269,025 } 12,586,269,025是否为序列成员,则需要一个公式 或 计算机程序——本文以state machine密码学工具来实现。
具有寄存器 A = ( A 1 , A 2 , … , A l ) \mathbf{A} = ( A_1, A_2, \dots , A_l ) A=(A1,A2,…,Al)和 B = ( B 1 , B 2 , … , B l ) \mathbf{B} = ( B_1, B_ 2, \dots , B_l ) B=(B1,B2,…,Bl)的状态机,第 i i i个状态为 ( A i , B i ) (A_i,B_i) (Ai,Bi),初始状态为 A 1 = 0 , B 1 = 1 A_1=0,B_1=1 A1=0,B1=1。
A 和 B \mathbf{A}和\mathbf{B} A和B寄存器均包含了Fibonacci序列,只是 B \mathbf{B} B中的序列为one step ahead of A \mathbf{A} A,二者具有如下关系:
A i + 1 = B i , B i + 1 = A i + B i . \begin{aligned} A_{i+1} &= B_i , \\ B_{i+1} &= A_i + B_i. \end{aligned} Ai+1Bi+1=Bi,=Ai+Bi.
接下来,是将这些寄存器以多项式表示,并最终引入多项式承诺机制来构建该membership密码学工具。
区块链传统中,将2个寄存器的多项式表示为 Z p [ x ] \mathbb{Z}_p[x] Zp[x],其系数源自a prime field Z p \mathbb{Z}_p Zp。
将多项式evaluate over subgroup of H = { ω , ω 2 , ω 3 , … , ω 8 = 1 } = ⟨ ω ⟩ H = \{\omega,\omega^2,\omega^3,\dots,\omega^8 = 1\} = \langle\omega\rangle H={ω,ω2,ω3,…,ω8=1}=⟨ω⟩ of order 8 8 8。
定义多项式 P ( x ) P(x) P(x)和 Q ( x ) Q(x) Q(x)为:
P ( ω i ) = A i , Q ( ω i ) = B i . P(\omega^i) = A_i, \\ Q(\omega^i) = B_i. P(ωi)=Ai,Q(ωi)=Bi.
H H H中的每个 x x x形式为 x = ω i x=\omega^i x=ωi for some i i i,从而有:
P ( x ω ) = P ( ω i + 1 ) = A i + 1 , Q ( x ω ) = Q ( ω i + 1 ) = B i + 1 . \begin{aligned} P(x\omega) &= P(\omega^{i + 1}) = A_{i+1}, \\ Q(x\omega) &= Q(\omega^{i+1}) = B_{i+1}. \end{aligned} P(xω)Q(xω)=P(ωi+1)=Ai+1,=Q(ωi+1)=Bi+1.
将关系 A i + 1 = B i A_{i+1} = B_i Ai+1=Bi and B i + 1 = A i + B i B_{i+1} = A_i + B_i Bi+1=Ai+Bi代入,获得如下polynomial identities:
P ( x ω ) = A i + 1 = B i = Q ( ω i ) = ∣ H Q ( x ) , Q ( x ω ) = B i + 1 = A i + B i = P ( ω i ) + Q ( ω i ) = ∣ H P ( x ) + Q ( x ) . \begin{aligned} P(x\omega) &= A_{i+1} = B_i = Q(\omega^i) = \bigg\lvert_H Q(x), \\ Q(x\omega) &= B_{i+1} = A_i + B_i = P(\omega^i) + Q(\omega^i) = \bigg\lvert_H P(x) + Q(x). \end{aligned} P(xω)Q(xω)=Ai+1=Bi=Q(ωi)=∣∣∣∣HQ(x),=Bi+1=Ai+Bi=P(ωi)+Q(ωi)=∣∣∣∣HP(x)+Q(x).
即:
P ( x ω ) = ∣ H Q ( x ) , Q ( x ω ) = ∣ H P ( x ) + Q ( x ) . \begin{aligned} P(x\omega) &= \bigg\lvert_H Q(x), \\ Q(x\omega) &= \bigg\lvert_H P(x) + Q(x). \end{aligned} P(xω)Q(xω)=∣∣∣∣HQ(x),=∣∣∣∣HP(x)+Q(x).
若以上这些polynomial identities可准确表达2个寄存器,则Fibonacci序列中的每个成员均可满足该identities。
注意, H H H的定义并未限定 i ≤ 8 i\leq 8 i≤8,若设置 i = 27 i=27 i=27,则 ω 27 \omega^{27} ω27 is in H H H,因为 ω 27 = w 8 ⋅ ω 8 ⋅ ω 8 ⋅ ω 3 = 1 ⋅ 1 ⋅ 1 ⋅ ω 3 = ω 3 \omega^{27}=w^8 \cdot \omega^8 \cdot \omega^8 \cdot \omega^3 = 1 \cdot 1 \cdot 1 \cdot \omega^3 = \omega^3 ω27=w8⋅ω8⋅ω8⋅ω3=1⋅1⋅1⋅ω3=ω3。
但是不限定 i i i值,以上polynomial identities会有问题。如令 x = ω 8 x=\omega^8 x=ω8,有:
这意味着,尽管 H H H是cyclic的,但是identities并不是cyclic的,polynomial identities 与 Fibonacci state machine寄存器 并不匹配。
为此,需要引入纠错多项式 R ( x ) R(x) R(x),使得polynomial identities也是cyclic的。纠错多项式也必须in Z p [ x ] \mathbb{Z}_p[x] Zp[x]。
为Fibonacci state machine引入第三个寄存器 C = ( C 1 , C 2 , … , C l ) \mathbf{C} = ( C_1, C_2, \dots , C_l) C=(C1,C2,…,Cl),设置该寄存器的值为 C = ( 1 , 0 , 0 , … , 0 ) \mathbf{C} = ( 1, 0, 0, \dots , 0) C=(1,0,0,…,0)。
将纠错多项式 R ( x ) R(x) R(x)定义为:
R ( ω i ) = C i . R(\omega^i) = C_i. R(ωi)=Ci.
即:
R ( ω i ) = C i = 1 , if i m o d 8 = 1 , R ( ω i ) = C i = 0 , otherwise . \begin{aligned} R(\omega^i) &= C_i = 1, \text{ if }\ \ i \mod 8 = 1 , \\ R(\omega^i) &= C_i = 0, \text{ otherwise}. \end{aligned} R(ωi)R(ωi)=Ci=1, if imod8=1,=Ci=0, otherwise.
将纠错多项式 R ( x ) R(x) R(x)嵌入到之前的polynomial identities,有:
P ( x ω ) = ∣ H Q ( x ) ( 1 − R ( x ω ) ) , Q ( x ω ) = ∣ H ( P ( x ) + Q ( x ) ) ( 1 − R ( x ω ) ) + R ( x ω ) \begin{aligned} P(x \omega) &= \bigg\lvert_H Q(x) \big( 1 - R(x \omega) \big), \\ Q(x \omega) &= \bigg\lvert_H \big( P(x) + Q(x) \big) \big( 1 - R(x \omega) \big) + R(x \omega) \end{aligned} P(xω)Q(xω)=∣∣∣∣HQ(x)(1−R(xω)),=∣∣∣∣H(P(x)+Q(x))(1−R(xω))+R(xω)
接下来,仍然设置 x = ω 8 x=\omega^8 x=ω8,来检查新的polynomial identities是否是cyclic的:
注意,此处不再限定初始条件为 ( A 1 , B 1 ) = ( 0 , 1 ) \big( A_1 , B_1 \big) = \big( 0 , 1 \big) (A1,B1)=(0,1)。
将polynomial identities调整为适于任意初始条件 ( A 1 , B 1 ) \big( A_1 , B_1 \big) (A1,B1):
P ( x ω ) = ∣ H Q ( x ) ( 1 − R ( x ω ) ) + A 1 R ( x ω ) , Q ( x ω ) = ∣ H ( P ( x ) + Q ( x ) ) ( 1 − R ( x ω ) ) + B 1 R ( x ω ) . \begin{aligned} P(x \omega) &= \bigg\lvert_H Q(x) \big( 1 - R(x \omega) \big) + A_1 R(x \omega), \\ Q(x \omega) &= \bigg\lvert_H \big( P(x) + Q(x) \big) \big( 1 - R(x \omega) \big) + B_1 R(x \omega) . \end{aligned} P(xω)Q(xω)=∣∣∣∣HQ(x)(1−R(xω))+A1R(xω),=∣∣∣∣H(P(x)+Q(x))(1−R(xω))+B1R(xω).
之前的多项式关系可通过如 KZG 和 基于FRI 的多项式承诺来证明。
承诺机制具有binding和hiding属性:
arithmetic state machine将检查32bit元素的加减乘除运算。
约束中有5个寄存器:
A i ⋅ B i + C i = 2 32 D i + E i . \mathcal{A}_i \cdot \mathcal{B}_i + \mathcal{C}_i = 2^{32} \mathcal{D}_i + \mathcal{E}_i. Ai⋅Bi+Ci=232Di+Ei.
注意,以上五个寄存器均为32bit的。
跟之前类似,将该关系表示为a cyclic polynomial identity at some subgroup H H H of roots of unity of Z p \mathbb{Z}_p Zp:
A ( x ) ⋅ B ( x ) + C ( x ) = 2 32 D ( x ) + E ( x ) . \mathcal{A}(x) \cdot \mathcal{B}(x) + \mathcal{C}(x) = 2^{32} \mathcal{D}(x) + \mathcal{E}(x). A(x)⋅B(x)+C(x)=232D(x)+E(x).
注意,此处需要 enforce A ( x ) \mathcal{A}(x) A(x), B ( x ) \mathcal{B}(x) B(x), C ( x ) \mathcal{C}(x) C(x), D ( x ) \mathcal{D}(x) D(x) 和 E ( x ) \mathcal{E}(x) E(x) 在 H H H 的值均为32bit。
[1] Polygon zkEVM Basic Concepts