前序博客有:
Polygon zkEVM为zk-rollup layer 2扩容方案,其:
开源代码见:
各代码库有:
证明某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)之间的交互流程为:

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技术:
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
.
接下来,是将这些寄存器以多项式表示,并最终引入多项式承诺机制来构建该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
.
将关系
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
)
.
即:
P
(
x
ω
)
=
∣
H
Q
(
x
)
,
Q
(
x
ω
)
=
∣
H
P
(
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
.
将纠错多项式
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
ω
)
接下来,仍然设置 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
ω
)
.

之前的多项式关系可通过如 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。