Polygon zkEVM公式梳理
Posted mutourend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Polygon zkEVM公式梳理相关的知识,希望对你有一定的参考价值。
const resP = await starkGen(comPols, constPols, constTree, starkInfo)
其中输入有:
- 1)comPols:为commit多项式trace domain evaluation值
- 2)constPols:为常量多项式trace domain evaluation值
- 3)constTree:为常量多项式Low Degree Extension domain evaluation值的Merkle树
- 4)starkInfo:为Prover生成证明以及Verifier验证证明所需的逻辑表达
starkGen
函数内各关键变量含义为:
- cm1_n:为commit多项式trace domain的evaluation值。
- cm1_2ns:为commit多项式low degree extension domain的evaluation值。
- tree1:为commit多项式扩域上evaluation值构建的Merkle树。
- cm2_n/cm2_2ns/tree2:为plookup约束相关evaluation值及Merkle树。
- cm3_n/cm3_2ns/tree3:为plookup/permutation/connection约束Z多项式evaluation值及Merkle树。
- exps_withq_n/exps_withq_2ns/q_2ns/tree4:为polIdentities约束相关evaluation值及Merkle树。【tree4为根据q_2ns构建的Merkle树。】
- constTree:为constant多项式low degree extension domain的evaluation值对应的Merkle树。
各关键变量定义为:
-
N = 2 nBits N=2^\\textnBits N=2nBits
-
Next = 2 nBitsExt \\textNext=2^\\textnBitsExt Next=2nBitsExt
-
extendBits = nBitsExt − nBits \\textextendBits=\\textnBitsExt-\\textnBits extendBits=nBitsExt−nBits
-
令 w w w为 F F F域内的 N N N-th root of unity, w ′ w' w′为 F F F域内的 Next \\textNext Next-th root of unity。
-
令 g g g为 F . shift F.\\textshift F.shift, e e e为 F F F域内的 2 extendBits 2^\\textextendBits 2extendBits-th root of unity。
-
ctx.Zi \\textctx.Zi ctx.Zi 表示的是长度为 Next \\textNext Next的数组,其每个元素i为:
1 ( g w ′ ) 2 nBits − 1 = 1 ( g 2 nBits ∗ e i ) − 1 = 1 g N ∗ e i − 1 \\frac1(gw')^2^\\textnBits-1=\\frac1(g^2^\\textnBits*e^i)-1=\\frac1g^N*e^i-1 (gw′)2nBits−11=(g2nBits∗ei)−11=gN∗ei−11 -
x_n为长度为N的数组,其每个元素 i i i为: w i w^i wi,其中 w w w为 F F F域内的 N N N-th root of unity。【
ctx.x_n
为trace domain的插值点】 -
x_2ns为长度为 Next \\textNext Next的数组,其每个元素 i i i为: g w ′ i gw'^i gw′i,其中 w ′ w' w′为 F F F域内的 Next \\textNext Next-th root of unity。【
ctx.x_2ns
为low degree extension domain的插值点】 -
令challenge[7]= x i x_i xi,有: xis = x i / g , wxis = ( w x i ) / g \\textxis=x_i/g,\\textwxis=(wx_i)/g xis=xi/g,wxis=(wxi)/g。构建长度为 N N N的数组LEv_tmp,其每个元素 i i i为: ( x i / g ) i (x_i/g)^i (xi/g)i;构建长度为 N N N的数组LpEv_tmp,其每个元素 i i i为: ( ( w x i / g ) i ((wx_i/g)^i ((wxi/g)i。以LEv_tmp中值为插值点 y y y坐标,以x_n为插值点 x x x坐标,ifft获得多项式系数数组LEv;同理以LpEv_tmp中值为插值点 y y y坐标,以x_n为插值点 x x x坐标,ifft获得多项式系数数组LpEv。
- starkInfo.json的evMap中的第
i
i
i项ev,若其ev.prime为true,则使用LpEv多项式;否则,使用LEv多项式。
l = ev.prime ? LpEv : LEv;
。根据ev.type取相应的扩域ctx.*_2ns evaluations中依次取第0、1<<extendBits、...、k<<extendBits、...、(N-1)<<extendBits
共N个值 v v v,计算 ctx.evals [ i ] = ∑ k = 0 N − 1 v [ k ] ∗ l [ k ] \\textctx.evals[i]=\\sum_k=0^N-1v[k]*l[k] ctx.evals[i]=∑k=0N−1v[k]∗l[k]。ctx.evals数组的长度为starkInfo.evMap.length。【后续计算FRI多项式扩域值ctx.exps_withoutq_2ns需用到。】
- starkInfo.json的evMap中的第
i
i
i项ev,若其ev.prime为true,则使用LpEv多项式;否则,使用LEv多项式。
-
令 wxi = w x i \\textwxi=wx_i wxi=wxi,其中 w w w为 F F F域内的 N N N-th root of unity。
-
ctx.xDivXSubXi 和 ctx.xDivXSubWXi 均为长度为 N \\textN N的数组,其每个元素 i i i均为Goldilocks extension 3 域元素,表示为 [ a i , b i , c i ] [a_i,b_i,c_i] [ai,bi,ci]。
- ctx.xDivXSubXi的第 i i i个元素为: g w ′ i g w ′ i − x i \\fracgw'^igw'^i-x_i gw′i−xigw′i
- ctx.xDivXSubWXi的第 i i i个元素为: g w ′ i g w ′ i − w x i \\fracgw'^igw'^i-wx_i gw′i−wxigw′i
-
starkInfo.json中的“Zi”标签,在
compileCode
时翻译为ctx.Zi(i)
。
以Fibonacci为例:
namespace Fibonacci(%N);
pol constant L1, LLAST; //constant多项式
pol commit l1,l2; //commit多项式
pol l2c = l2; //中间多项式
//公开变量值
public in1 = l2c(0);
public in2 = l1(0);
public out = l1(%N-1);
(l2' - l1)*(1-LLAST) = 0; //约束1
pol next = l1*l1 + l2*l2; //中间多项式
(l1' - next)*(1-LLAST) = 0; //约束2
L1 * (l2 - :in1) = 0; //约束3
L1 * (l1 - :in2) = 0; //约束4
LLAST * (l1 - :out) = 0; //约束5
序号 | x x x | A \\mathbfA A( l 2 ( x ) l_2(x) l2(x)多项式) | B \\mathbfB B( l 1 ( x ) l_1(x) l1(x)多项式) |
i
s
I
n
i
t
i
a
l
\\mathbfisInitial
isInitial(
L
1
(
x
)
L_1(x)
< 以上是关于Polygon zkEVM公式梳理的主要内容,如果未能解决你的问题,请参考以下文章 |
---|