当前位置: 首页 > news >正文

STARK Low Degree Testing——FRI

1. 引言

前序博客有:

  • ZKP大爆炸
  • STARKs and STARK VM: Proofs of Computational Integrity
  • STARK入门知识
  • STARK中的FRI代码解析
  • Rescue-Prime hash STARK 代码解析
  • Fast Reed-Solomon Interactive Oracle Proofs of Proximity学习笔记

Low Degree Testing低度测试为STARK证明succinctness的秘方。

在STARK中,通过Arithmetization将Computational Integrity问题reduce为low degree testing问题。

所谓low degree testing低度测试,是指,若要判定某函数是否为具有某指定上限degree的多项式,仅需要make a small number of queries to the function。
低度测试问题已研究了二十多年,是probabilistic proof理论的核心工具。本文重点在于详细解释低度测试,并介绍FRI协议——STARK中所用的低度测试解决方案。

2. 低度测试

低度测试针对的场景为:
给定某函数,仅查询该函数的 “少量” 位置,来判定该函数是否为 小于某常量 d d d degree的某多项式。

即,已知某域 F F F的子集 L L L和degree bound d d d,判定 f : L → F f:L\rightarrow F f:LF是否等于某degree小于 d d d的多项式,即,是否存在多项式:
p ( x ) = c 0 + c 1 x + ⋯ + c d − 1 x d − 1 p(x)=c_0+c_1x+\cdots+c_{d-1}x^{d-1} p(x)=c0+c1x++cd1xd1
over F F F,其中对于 ∀ a ∈ L \forall a\in L aL,有 p ( a ) = f ( a ) p(a)=f(a) p(a)=f(a)
可想象field size很大,如为 2 128 2^{128} 2128 L L L的size约为1千万(10,000,000)。

为解决该问题,需要query f f f at 整个 L L L域,因 f f f可能仅在 L L L中的某个单点不满足 p ( a ) = f ( a ) p(a)=f(a) p(a)=f(a)。即使我们允许一定概率的错误,所需query的次数仍然与 L L L的size呈线性关系。

低度测试,通过构建probabilistic proof,将query number降为logarithmic in ∣ L ∣ |L| L(如 L ≈ 10 , 000 , 000 ,则 log ⁡ 2 ( L ) ≈ 23 L\approx10,000,000,则\log_2(L)\approx 23 L10,000,000,则log2(L)23),可解决上述问题。确切来说,分为如下2种情况:

  • 1)第一种情况——若函数 f f f等于某低度多项式:即存在多项式 p ( x ) p(x) p(x) over F F F,其degree小于 d d d,并agrees with f f f everywhere on L L L
  • 2)第二种情况——若函数 f f f为far from ALL low degree polynomials:如,需调整 f f f中至少 10 % 10\% 10%的值,才能获得一个与degree小于 d d d多项式一致的函数 f ′ f' f

还有一种可能性是:

  • 3)第三种情况——若函数 f f f中度接近某低度多项式,但不等于任何低度多项式。如,某函数具有 5 % 5\% 5%的值不等于低度多项式,因此不符合以上两种情况。但是,之前的STARK arithmetization步骤中,确保了本情况不会发生。即,诚实的Prover在处理true statement算术化过程中,会落入第一种情况;而作弊的Prover在试图证明false claim时,将大概率落入第二种情况。

为了区分以上两种情况,将使用a probabilistic polynomial-time test来query f f f at a small number of locations。

  • f f f确实是低度的,则该测试通过的概率为 1 1 1
  • f f f为far from low degree,则该测试将大概率不通过。
  • f f f δ \delta δ-far from any function degree less than d d d(即,必须修改至少 δ ∣ L ∣ \delta|L| δL 个位置来获得某个degree小于 d d d的多项式),则测试被拒绝的概率不低于 Ω ( δ ) \Omega({\delta}) Ω(δ)(或其它“nice” function of δ \delta δ)。直观来说,若 δ \delta δ越接近零,则区分这两种情况的难度越大。

接下来将一种简单的低度测试方案,并解释其为何无法满足要求,然后介绍一种效率指数级提升的复杂低度测试方案——STARK中使用的FRI。

2.1 Direct Test 低度测试方案

Direct Test 低度测试方案是:
通过采用 d + 1 d+1 d+1次query,来判断某函数是否为(或接近为)某degree小于 d d d的多项式。

Direct Test 低度测试方案 基于的多项式basic fact为:

  • 任意degree小于 d d d的多项式,可由 F F F中任意 d d d个不同位置的值唯一确定。

该fact源自:degree为 k k k的多项式,最多具有 k k k个roots in F F F

Direct Test 低度测试方案中,query次数为 d + 1 d+1 d+1,远小于 f f f的domain size ∣ L ∣ |L| L

首先讨论2个简单的特例情况:

  • 1)若函数 f f f为constant function,即 d = 1 d=1 d=1:则低度测试问题转为区分 f f f为某constant function( f ( x ) = c f(x)=c f(x)=c for some c c c in F F F) 还是 f f f为far from any constant function。
    针对这种特例情况,仅需要2-query test即可:query f f f at 某固定点 z 1 z_1 z1以及某随机点 w w w,然后检查 f ( z 1 ) = f ( w ) f(z_1)=f(w) f(z1)=f(w)是否成立即可。直观的, f ( z 1 ) f(z_1) f(z1)可决定 f f f的常量值, f ( w ) f(w) f(w)测试是否所有的 f f f都接近该常量值。

  • 2)若函数 f f f为线性函数,即 d = 2 d=2 d=2:则低度测试问题转为区分 f f f为某线性函数( f ( x ) = a x + b f(x)=ax+b f(x)=ax+b for some a , b a,b a,b in F F F) 还是 f f f为far from any linear function。
    针对这种特例情况,仅需要3-query test即可:query f f f at 某2个固定点 z 1 , z 2 z_1,z_2 z1,z2以及某随机点 w w w,然后检查 ( z 1 , f ( z 1 ) ) , ( z 2 , f ( z 2 ) ) , ( w , f ( w ) ) (z_1,f(z_1)),(z_2,f(z_2)),(w,f(w)) (z1,f(z1)),(z2,f(z2)),(w,f(w))是否共线性。直观的, f ( z 1 ) 和 f ( z 2 ) f(z_1)和f(z_2) f(z1)f(z2)可决定 f f f线性函数, f ( w ) f(w) f(w)测试所有 f f f值是否都在该线上。

将以上特例情况推广至具有degree bound d d d的通用情况:
query f f f at d d d个固定点 z 1 , z 2 , ⋯   , z d z_1,z_2,\cdots,z_d z1,z2,,zd以及某随机点 w w w。根据 f f f z 1 , z 2 , ⋯   , z d z_1,z_2,\cdots,z_d z1,z2,,zd d d d个值,可唯一确定degree小于 d d d的多项式 h ( x ) h(x) h(x) over F F F that agrees with f f f at these points。然后检查随机点的 h ( w ) = f ( w ) h(w)=f(w) h(w)=f(w)是否成立即可,因此称为Direct Test。

根据定义可知,若 f ( x ) f(x) f(x)等于 某degree小于 d d d的多项式 p ( x ) p(x) p(x),则 h ( x ) h(x) h(x)等于 p ( x ) p(x) p(x),Direct Test被通过的概率为 1 1 1。该属性称为“完美完备性”,即意味着Direct Test具有only 1-sided error。

接下来讨论,若 f f f δ \delta δ-far from any function of degree less than d d d的情况,如假设 δ = 10 % \delta=10\% δ=10%。此时,Direct Test被拒绝的概率不低于 δ \delta δ。通过随机选择 w w w,使得 h ( w ) ≠ f ( w ) h(w)\neq f(w) h(w)=f(w)的概率为 μ \mu μ,则 μ \mu μ必须不小于 δ \delta δ

【反向证明,若 μ \mu μ小于 δ \delta δ,则可推论 f f f δ \delta δ-close to h h h,与 f f f δ \delta δ-far from any function of degree less than d d d的前提情况矛盾。】

2.2 Direct Test低度测试方案不足以满足需求

因STARK中的testing函数 f : L → F f:L\rightarrow F f:LF中编码了computation traces,其degree d d d(和domain L L L)非常大,若直接运行query d + 1 d+1 d+1次的Direct Test,将是非常昂贵的。
为此,为指数级(相对于computation trace size)的节约STARK中Verifier的验证时间,需要将 d + 1 d+1 d+1次 reduce为仅需 O ( log ⁡ d ) O(\log d) O(logd)次query。

但是,若query f f f at 小于 d + 1 d+1 d+1个位置,将无法得出任何结论。


方案之一是,考虑函数 f : L → F f:L\rightarrow F f:LF的2种不同分布:

  • 分布一:uniformly选择一个degree正好为 d d d的多项式,并对其evaluate on L L L
  • 分布二:对于任意 d d d个点 z 1 , z 2 , ⋯   , z d z_1,z_2,\cdots,z_d z1,z2,,zd,其值 f ( z 1 ) , f ( z 2 ) , ⋯   , f ( z d ) f(z_1),f(z_2),\cdots,f(z_d) f(z1),f(z2),,f(zd)为均匀独立分布的。

即意味着从信息轮角度来将,即使借助某test也无法区分以上2种分布(since polynomials from the first distribution should be accepted by the test while those of degree exactly d are very far from all polynomials of degree less than d, and thus should be rejected)。

2.3 引入Prover

已知,若要测试某函数 f : L → F f:L\rightarrow F f:LF close to某degree小于 d d d的多项式,需要 d + 1 d+1 d+1次query,但是我们无法承担那么多的query次数。

将该低度测试问题转换为:
某Prover可提供关于函数 f f f的有用辅助信息。

通过引入Prover,可将低度测试的query次数实现指数级改进,所需query次数降为 O ( log ⁡ d ) O(\log d) O(logd)

具体协议为:

  • (untrusted)Prover:直到待测试的整个函数 f f f
  • Verifier:查询函数 f f f的少量位置,并希望借助Prover的帮助,但不需要信任Prover是诚实的。即意味着Prover可能会作弊且不遵循该协议,但Prover一旦作弊,Verifier有权拒绝,无论函数 f f f是否为低度的。关键点在于,除非 f f f确实是低度的,否则Verifier不会被说服。

可将上面的Direct Test看成是Prover啥也没干的特例情况,Verifier没有任何人辅助,自行测试该函数是否为低度多项式。为此,需充分有效利用Prover的功能,使得效率比Direct Test要高。

在整个协议中,Prover将want to enable the Verifier to query auxiliary functions on locations of the Verifier’s choice。可通过“commitment”来达成。即,Prover可将其选择的函数commit为a Merkle tree,然后Verifier可要求Prover公开该committed函数的任意位置集。这种承诺机制的主要属性在于:一旦Prover对某函数commit之后,其必须公开正确的值,且无法作弊(即,其无法在看到Verifier发来的请求位置之后再决定函数的值)。

2.4 2个函数的情况下将query次数减半

接下来将举例说明在Prover的帮助下如何将query次数减半。

假设有2个多项式 f , g f,g f,g,想要证明 f 和 g f和g fg的degree都小于 d d d,若运行Direct Test,则需要分别对 f , g f,g f,g进行query,一共需要 2 ∗ ( d + 1 ) 2*(d+1) 2(d+1)次query。接下来将说明如何将query次数降为 ( d + 1 ) (d+1) (d+1)再加某smaller-order term。

  • 1)Verifier选择随机值 α \alpha α发送给Prover;
  • 2)Prover将 h ( x ) = f ( x ) + α g ( x ) h(x)=f(x)+\alpha g(x) h(x)=f(x)+αg(x)在domain L L L进行evaluate,并将evaluation值进行commit后发送给Verifier(实时上,Prover将 ∀ x ∈ L \forall x\in L xL的所有 h ( x ) h(x) h(x)值作为叶子节点构建Merkle tree,将相应Merkle tree root发送给了Verifier);【注意此处的domain L L L仍为函数 f f f的domain L L L
  • 3)Verifier现在可通过Direct Test测试 h h h的degree是否小于 d d d,需要的查询次数为 d + 1 d+1 d+1

直观的,若 f f f g g g的degree不小于 d d d,则大概率 h h h的degree也不小于 d d d
如,假设 f f f x n x^n xn项系数不为零,且 n ≥ d n\geq d nd,则最多仅有一个 α \alpha α取值(由Verifier选择发送),使得 h h h x n x^n xn项系数为零,即意味着 h h h degree小于 d d d的概率约为 1 / ∣ F ∣ 1/|F| 1/∣F。若field足够大,如 ∣ F ∣ > 2 128 |F|>2^{128} F>2128,该错误概率可忽略。

不过,我们在第3)步中,并不检查 h h h为某degree小于 d d d的多项式,而转为仅检查 h h h close to 某degree小于 d d d的多项式。这就意味着以上分析并不准确。是否有可能 f f f为far from a low degree polynomial and the linear combination h h h will be close to one with a non-negligible probability over α \alpha α?答案是不可能,详细可阅读 2017年论文Ligero: Lightweight Sublinear Arguments Without a Trusted Setup 以及 2018年论文Fast Reed-Solomon Interactive Oracle Proofs of Proximity。

参考资料

[1] StarkWare 2019年论文 Low Degree Testing

相关文章:

  • 基于孤立森林的信用卡欺诈 Python 实战案例,最佳参数选择、可视化等
  • B/S 架构 与 C/S 架构
  • 【JAVAEE框架】Mybatis常用操作(CRUD)
  • 【PCB专题】如何在嘉立创8月1日起的新规则下免费打样
  • ElasticSearch--写入数据的流程(原理)
  • Java 下数据业务逻辑开发技术 JOOQ 和 SPL
  • 嵌入式系统多线程学习笔记
  • 【DaVinci Developer专题】-44-Software Component软件组件的Multiple Instantiation多次实例化
  • Docker 进阶指南(下)- 使用Docker Compose编排多个容器
  • 走进Prime Time系列 - 走进PT - 01
  • 天龙八部科举答题问题和答案(全4/8)
  • 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)
  • 【电源专题】案例:为什么芯片支持0.8V的工作电压,但EN却又要高达1.25V?
  • 湖仓一体电商项目(十四):实时任务执行流程
  • 猿创征文|Java中的IO流大家族 (两万字详解)
  • JS中 map, filter, some, every, forEach, for in, for of 用法总结
  • python3.6+scrapy+mysql 爬虫实战
  • 【comparator, comparable】小总结
  • Docker容器管理
  • Intervention/image 图片处理扩展包的安装和使用
  • JAVA多线程机制解析-volatilesynchronized
  • JS笔记四:作用域、变量(函数)提升
  • php面试题 汇集2
  • Python 反序列化安全问题(二)
  • 从0到1:PostCSS 插件开发最佳实践
  • 从0实现一个tiny react(三)生命周期
  • 从零开始在ubuntu上搭建node开发环境
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 跳前端坑前,先看看这个!!
  • 正则学习笔记
  • 自动记录MySQL慢查询快照脚本
  • Spring Batch JSON 支持
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 昨天1024程序员节,我故意写了个死循环~
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #每天一道面试题# 什么是MySQL的回表查询
  • #数学建模# 线性规划问题的Matlab求解
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C)一些题4
  • (八)Spring源码解析:Spring MVC
  • (笔试题)合法字符串
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (过滤器)Filter和(监听器)listener
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (一)SpringBoot3---尚硅谷总结
  • (一)VirtualBox安装增强功能
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (正则)提取页面里的img标签
  • (转)ORM
  • (转)visual stdio 书签功能介绍
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core引入性能分析引导优化
  • .NET 材料检测系统崩溃分析