# FRI低度测试中的示例及思考 ## 针对某FRI文章: 针对[此FRI介绍](https://blog.nowcoder.net/n/f9742fdb7b2c459ca2be87c7ff5a7f46?from=nowcoder_improve),做一个思考及示例研究。 此文章中,对应于经典的FRI(按degree折半的方式进行验证),与[此版本对应Python代码](https://github.com/aszepieniec/stark-anatomy) 的方式相同。 ### 选取案例: $f_{0}(X)=2X^4+3X^3+5X^2+X+3$ 作为示例,则 $Q(X,Y)=(2Y^2+5Y+3)+X(3Y+1)$ - step1 Verifier,对 $Q(X,Y)$随机选取 $x$,使得 $x=\alpha=2$, Prover计算得到: $f_{1}(Y)=2Y^2+11Y+5$ - step2 Verifier选取 $y=1$,则对应的 $x0=1, x1=-1$, 且query得到: $f_{0}(x0)=14, f_{0}(x1)=6$ 然后,取 $y=1$ 处的$f_{1}(y)=f_{1}(1)=18$ 验证共线性可知: $(x0,f_{0}(x0)),(x1,f_{0}(x1)),(\alpha,f_{1}(y))=(1,14),(-1,6),(2,18)$ 是共线性的 - step3 低度测试:判断 $f_{1}(Y)$ 是对应的低度,即 $f_{1}∈[F,L,ρ]$ ### 分析关键: 一开始是对这个共线性测试,百思不得其解,仔细思考后发现如下: - 对于下图的定义域为 $X∈L0,而Y∈L1$ , 定义域为 $L0*L1$,即为对应的绿色区域,其实相当于将最起初的 $f_{0}(X)$ 转变为了 $Q(X,Y)$ 了,即将一个1D的函数变为2D的,因此其定义域也是2D的了。 - 在红色曲线(实际为离散点,画为连续时为示意)时,方有 $f_{0}(X)=Q(X,Y)$ 而不是红色曲线上的点,是不等的。即,红色曲线上时,方有 $Y=X^2$ ,此时还原为了原曲线。 - 之所以会共线性,是因为此时是将 $y$ 固定住了。从而将 $Q(X,Y)$ 变为以 $X$ 为单变量的一阶线性函数,即为 $f(X)=a+bX$ 因此,在X取不同值时,a与b保持不变。因此是线性的。**特别要注意的是**:上述例子中,取 $y=1$ 时, $x0=1,与x0=-1$ 为原始 $f0(X)$ 曲线上的点。而 $y=1,x0=2$ 时,并不是原始曲线 $f0(X)$ 上的点,需要注意这个点是怎么来的:它是针对 $Q(x,y)$ 取随机点 $x=2,y=1$ 得到。 - 正确的叙述流程其实是先对 $Q(x,y)$ 取了随机点 $(x=2,y=1)$ ,然后根据 $y=1$ 得到 $y=x^2$ 曲线(也就是由 $f0(x)$ 折半为 $f1(x)$ 的约束曲线)上的点 $(x0,x1)$ 。而 $Q(x,y)=f(x)=a+bX$ ,在本案例中为 $f(x)=10+4x$,即对应的点为$(1,14)与(-1,6)$ - 最终:这三点的共线性。因为固定y时, $Q(x,y)$可表达为 $a+bx$ - 如果将这个例子进行下去,再做一轮:由 $f_1(x)=2x^2+11x+5=Q(X,Y)=(2Y+5)+X*11$ 我们可以再取: $x=\alpha=3,y=1$,则可以迭代下一轮的多项式 $f_2(x)=7+11x$,照样得到此时的点 $(1,18)$ 与 $(-1,-4)$,验证: $(1,18),(-1,4),(3,1)$共线性。 ![11221111](https://hackmd.io/_uploads/B1BrR7rtA.png) 注:这张图中的纵坐标是y,如果将纵坐标的刻度改为x^2,那么抛物线应该变成一条直线(同V神文章中的图) ### 为何要做多轮测试?何为Proximity要求? 考虑到一些点并不是在原始曲线上,需要对这种验证过程重复多次。 例如:我们知道大部分的点,在 $f_{0}(X)=2X^4+3X^3+5X^2+X+3$ 曲线上 我们再做一次正确性的验证,过程如下: - step1 $x=\alpha=2,f_{1}(Y)=2Y^2+11Y+5$ - step2 取 $x0=3, f_{0}(3)=294, x1=-3, f_{0}(-3)=126$ 对应于 $y=9$ 计算, $f_{1}(9)=122$ 可以轻松验证共线性。 - 假设,有一个点不在此曲线上 设针对 $x0=3时,f_{0}(3)=2X^4+3X^3+5X^2+X+4=295$ 那么我们知道,(3,295)实际上不是在该曲线上。那么,此时验证共线性则必失败。 所以,我们可以得出结论:共线性测试是保证了由 $f_{0}到f_{1}$ 选取的每个随机点,都是在对应曲线上的。 而之所以需要做多次:提高正确验证的概率,防止因为未能抽取到那个不在曲线上的点,而误判为正确。(降低这种误判的风险。假设存在10%概率的错误点,没有抽种这个错误点的概率为0.9,十次未抽中的概率为 $0.9^{10}=0.349$ 也就是说10次都(错将不正确误判为对)的概率很低。 如果本身100个点只有一个点为错误点,概率则为 $0.99^{10}=0.90$ 虽可能有误判,但很接近正确。可以说是概率上的接近。 ## 针对V神stark文章第二部分: [V神文章 Stark II:FRI](https://vitalik.eth.limo/general/2017/11/22/starks_part_2.html) ### 原始验证示例 Prover:复杂度为10^18^ ![image](https://hackmd.io/_uploads/H1Lv97LFR.png) #### 小示例举例 原始 $f(x)=1+x+x^{1001}+x^{3005}+x^{12}+x^{11001}$ 取 $y=x^{1000}$ 后,上式变为 $g(x,y)=1+x+xy+x^5y^3+x^{12}+xy^{11}$ 1. 固定 $x=x_{0}$ ,随机取1010个 $y$ 值进行query,看是否满足 $degree<1000$ 此时 $g(x,y)=g(y)=(1+x_{0}+x_{0}^{12}+x_{0}y+x_{0}^{5}y^3+x_{0}y^{11})$ 这是一个关于y的多项式。此时,若该多项式满足: $degree<1000$ ,则说明原多项式 $f(x)$ 满足 $degree<1000000$ 2. 固定 $y=y_{0}$,则此时: $g(x,y)=g(x)=1+(1+y_{0}+y_{0}^{11})x+y_{0}^{3}x^5+x^{12}$ 这是一个关于x的多项式。此时,若该多项式满足: $degree<1000$ ,则说明原多项式 $f(x)$ 满足 $degree<1000000$ 3. 此时还要验证:对于对角线上的点,满足 $y=x^{1000}$ 时:当固定 $x=x0$ 时,query $g(y)$ 与固定 $y=y0$ 时,query $g(x)$ ,二者是否相等,即为同一多项式? **<p style="color: red;">第三点有些不确定,存疑问</p>** ### 优化验证1 原始方案,Prover要commit每个点,是 $10^9 * 10^9 = 10^{18}$ 优化步骤:取p=1,000,005,001 $\forall x \in[0,|P| ]$ 那对于y按x^1000 modulus p进行取值,可知 y为0,1,... 1000006 此时:降为 $10^9 * 10^6=10^{15}$ ![image](https://hackmd.io/_uploads/SkPWRQ8t0.png) ### 优化验证2 进一步优化 固定y值,取一行。并且只取1000个点(只取x^1000=y的点?) 注意图中的对象线只有1000条。因此每一行只有1000个数据点?针对这1000个点,构造一个多项式。 **这一部分有一些存疑** 然后取一个列(固定x值),这里应该是10^6^个点,同样验证这里的多项式是否degree<1000 然后,做验证? **<p style="color: red;">总结,自己在这一段,好像没有懂。先搁置一下,再看一下其它的内容**</p> ## v神文章继续研究 ### part2:原始计算法 #### 证明过程 - 证明目标: - 要证明:在N=10^9^ points上,其多项式degree<10^6^ - 定义域: - $x \in N={0,1,2...10^9}$ - $y \in M=[{x^{1000}:1<=x<=N}]$ - Commit: - 将整个$x \in N, y \in M$ 的点进行commit,则须commit的数量为:$10^18$ - Verify - 取部分行(固定y值)、且该行取1010个点;取部分列(固定x值)、且该行取1010个点; - 取对象线上, - V神举例,取30行,30列。相当于取:x=x0,x1...x30,那么在固定x的情况下,可对应插值出g0(y)、g1(y)...g30(y),同理g0(x)、g1(x)...g30(x) #### 疑问 - 为何不是只取对象线上的10^6个点即可?如果只取对象线上的点可以验证,那是不是不用取colunm或row了? - 下图的疑问 ![image](https://hackmd.io/_uploads/HyiQz4x5R.png) ### part2:优化一 - 定义域变换: - x仍然是1~10^9,略扩大一点到p=1000005001 - y取x^1000^ mod p - 图形中的对象线,变为循环围绕式 - Prover - 优化后:需要Commit 10^9^ * 10^6^ =10^15^ 个点 - Verify - 取任意一个y=y0值,取各条对角线上的对应点(共1000个),将其插值为一个degree<1000的多项式f(x)。(这些点就是原始点?多项式相当于是原始多项式,当y=x^1000^时) - 然后:任取一个x值(x0),验证(x0,y0)在f(x)上。(因为y值被固定,所以必在此曲线上) - 最后:针对固定这个x值的colunm,取1000个y值点形成f(y),验证其degree<1000 - 该优化后的计算量: - Verifier:仍然是亚线性? - Prover:降至10^9?是否是,现在只commit在对角线上的这些点? - **<p style="color: red;">(即:10^3^ 根对角线,每根为10^6^ 个点,这样,其它点不用?但是不对呢,不是还要取一个colunm吗?那这样不还是要commit其它点吗?)**</p> ### part2:进一步优化:折半的低度测试 关于Jade分享中的困惑 ![image](https://hackmd.io/_uploads/HyYNiwxq0.png) 另外,这个数学公式的含义?可否解释一下? ![image](https://hackmd.io/_uploads/HyALiDecR.png) 这里应该就是FRI的不断折半的过程 但是:(1)commit的范围仍然没有变吧?x取值,仍然是从1~10^9,而y的范围则是1~10^9/2? (2)各轮次之间的f(x)有怎样的关系?好像不是像图中说的,上一轮f(x),怎么做为下一轮的f(x) ![image](https://hackmd.io/_uploads/ryGHYslq0.png)