STARKs:多项式证明(二)

本系列的上一部分中,我们讨论了如何使用涉及多项式组合和除法的技术,如何使用一种非常有趣而且简洁的计算证明你已经计算出第100万个斐波那契数。然而,这种算法依赖于一个关键因素:至少能够证明大部分给定的点在相同的低次多项式上。这个被称为“低次测试”的问题,可能是算法中最复杂的部分。

我们回顾一下我们的问题。假设有一组点,它们都在同一个多项式上,次数(deg)小于D(即:deg < 2表示它们在同一直线上,deg < 3表示它们在同一直线或抛物线上等)你需要创建一个简洁的概率证明来证明这是真的。

 

表 1左:点都在同一个deg < 3多项式上。右:不在同一个deg < 3多项式上的点

 

如果你想验证所有的点是否都在同一次数小于 D的多项式上,那你必须检查每一个点,哪怕有一点没有检查到,即使其他点都存在,你也不能确定这一点是否在多项式上。但你可以做的是概率性地检查所有点的至少有一部分(例如90%)是否在同一多项式上。

可能足够接近一个多项式

不太接近多项式

接近两个多项式

绝对不接近多项式

如果你能检查多项式上的每一点,那么问题就很简单了。但是,如果你只能检查几个点——也就是说,你可以检查你想要的任何具体点,并且证明者有义务为你提供该点的数据作为算法的一部分,但查询的总数肯定是有限的,那么问题来了,你到底要检查多少点,才能算是一定程度上的检查通过了呢?

显然,D个点是不够的。D个点正是唯一定义次数小于D多项式所需要的,所以你收到的任何一组点都会对应于某个次数小于D多项式。然而,正如我们在上图中看到的,D+1点或更多的点确实能给我们提供更多的信息。

给定的一组值,检查D+1次,看一下这些值是否在同一个次数小于D多项式次数相同的算法并不太复杂。首先,选择D点的一个随机子集,然后使用拉格朗日插值法  (Lagrange interpolation)来还原通过所有这些点的唯一次数小于D多项式。然后,再随机抽样一个点,检查它是否在同一个多项式上。

 

注意,这只是一个接近度测试,因为大多数点都在相同的低次多项式上,但少数点不是,而且 D+1 样本完全忽略了这些点。但是,如果推导出小于90%的点都在相同的小于D 多项式上,那么测试失败的可能性就很大。具体来说,如果你进行 D+k 次检查,并且如果这些点的至少有p%不在与其他点相同的多项式上,则测试将仅以概率(1-p%)k通过。

但是,如果如前一篇文章中的例子所示,D 非常高,并且你想用小于D次的检查来验证一个多项式的次数,又会怎样呢?当然由于上面的简单论证(即,任何 k <= D 点都至少在一个次数小于D多项式上),这肯定是不能直接进行的。但是,很有可能通过提供辅助数据间接地做到这一点,并通过这样做来实现大规模的效率提升。这正是新的算法,如快速所罗门交互式Oracle近距离证明(FRI ,Fast Reed-Solomon Interactive Oracle Proofs of Proximity),以及更早的类似设计,称为概率可检验的邻近证明(PCPPs,probabilistically checkable proofs of proximity),去尝试实现。

 

   01   初识亚线性算法

 A First Look at Sublinearity 

为了证明这是可行的,我们将从一个相对简单的算法开始,虽然这是一个非常差的折中方案,但仍然达到亚线性验证复杂次数多项式的目标——也就是说,你可以证明一个次数小于D的多项式 (也就是用小于O(D)次计算来证明)。

这个想法如下:假设有 N 个点(我们设 N = 10亿),它们都在f(x)的次数小于 1,000,000多项式上。我们找到了一个二元多项式(即表达式1 + x + xy + x5 * y3 + x12 + x * y11 ),我们将表示为 g(x, y),并且g(x, x1000)= f(x)。按如下操作:对于 f(x) 中的第 k 次项(例如,1744 * x185423),我们将它分解成 1744 * xk%1000 * yfloor(k/1000) = 1744 * x423 * y185。你可以看到,如果 y = x1000,那么1744 * x423 * y185 等于 1744 * x185423。

在证明的第一阶段,证明者提供(即,制作一个 Merkle 树) g(x,y)在整个正方形上的值 [1..N] x {x1000:1 <= x <= N} -- 也就是说,列出所有10亿个 x 坐标,以及所有行上10亿个 y 坐标的一千次方。该正方形的对角线表示形式为 g(x,x1000)的 g(x,y)的值,因此对应于 f(x)的值。

验证者随机选择也许几十行和几十列(如果我们想要一个非交互式证明,可能使用正方形的 Merkle 根作为伪随机源),并且对于它挑选的每个行或列,例如,要求验证者在行和列上提取1010个点的样本,确保在每种情况下,这个点都在对角线上。证明者必须回复这些点,通过Merkle 分支,证明他们是证明者提供的原始数据的一部分。验证者检查 Merkle 分支是否匹配,并且证明者提供的点真的是1000次多项式上的值。

 

 

这给验证者一个统计证明:

(i)大多数行主要由小于1000次多项式上的点填充,

(ii)大多数列主要由小于1000次多项式上的点填充,

(iii)对角线大部分都在多项式上。

这就使验证者确信对角线上的大多数点实际上对应的是一个小于1,000,000次的多项式。

如果我们选择 30 行和 30 列,验证者需要访问总共 1010个点* 60个行和列 = 60600个点,小于原始1,000,000点,但还是有些多。就计算时间而言,插入次数小于 1000 的多项式会有其自己的开销,但是由于多项式插值可以转换成次二次条件(Subquadratic),所以这种算法仍然算是亚线性的验证方法。 证明者的复杂性更高:证明者需要计算并提交整个 N * N 矩形,这总共有1018个计算工作量(实际上还更多一点,因为多项式求值仍然是超线性的)。在所有这些算法中,证明的过程比原本计算的过程还要复杂;接下来我们将看到,其实这些开销完全没必要那么高。

 

   02   模块数学的插曲

 A Modular Math Interlude 

在我们进入到更复杂的算法之前,我们在说模块化数学的话提前先加入一些其他的话题。通常,当我们处理数学表达式和多项式时,我们处理的是常规数字,而算术,使用运算符加减乘除(和求幂,也就是重复的乘法),是按照我们从学校学到的一般方法来做的:2 + 2 = 4,72 / 5 = 14.4,1001 * 1001 = 1002001 等等。然而,数学家们已经意识到这些定义加减乘除的方式,并不是唯一定义这些运算符的自洽(self-consistent)方式。

定义这些运算符的另一种方法的最简单示例是模块化算法,定义如下:%运算符的意思是“取余数”:15% 7 = 1,53 % 10 = 3等(注意,答案总是非负的,例如-1 % 10 = 9)。对于任何特定的素数p,我们可以重新定义:

x + y   --->   (x + y) % p

x * y   --->   (x * y) % p

x ^ y   --->   (x ^ y) % p

x - y   --->   (x - y) % p

x / y   --->   (x * y(p-2)) % p

以上规则都是自洽的。例如,如果p = 7,则:

  • 5 + 3 = 1 (as 8 % 7 = 1)

  • 1 - 3 = 5 (as - 2 % 7 = 5)

  • 2 * 5 = 3

  • 3 / 5 = 2 (as (3 * 55) % 7 = 9375 % 7 = 2)

更复杂的恒等式,如分配律也成立:(2 + 4) * 3和(2 * 3 + 4 * 3)都等于4。甚至像 (a2 - b2) = (a - b) * (a + b) 这样的公式在这种新算法中仍然成立。除法是最难的部分;我们不能用常规除法,因为我们想要结果始终是整数,而常规除法通常会算出非整数结果(如3/5的情况)。上面除法公式中的p-2指数是使用费马小定理解决这个问题的结果,该定理指出对于任何非零 x < p,它都认为 x(p-1) = 1(mod p)。这意味着 xp-2 * x = 1(mod p),因此可以得出 xp-2 = 1 / x(mod p)。对于模块化除法运算符另一种更复杂但更快速的算法是扩展的欧几里德算法。

 

由于数字如何“环绕”,模数运算有时被称为“时钟数学”

通过模块化数学,我们创造了一个全新的算术系统,因为它的自洽性和传统算术的自洽性是一样的,所以我们可以在这个领域讨论所有相同的结构,包括多项式,我们在“常规数学”中讨论过。密码学家喜欢在模块化数学中工作(或者更常见的是,“有限域”),因为任何模块化数学计算都会产生一个有限的数字——无论你做什么,这些值都不会“跳出”集合 {0,1,2…p - 1 }。

费马的定理还有另一个有趣的结果。如果p-1是某个数字 k 的倍数,那么函数 x -> xk 有一个小的“映像”——即,函数只能给出 (p - 1) / k + 1 组满足条件的结果。例如 x -> x2,p=17只有9组满足条件的结果。

 

 

对于较高的指数,结果更显著: 例如,x -> x8,p=17 只有3组满足条件的结果;当然,x -> x16,p=17 只有2 组满足条件的结果;对于0,它返回 0,对于其他所有结果,它返回1。

 

   03   现在效率提高了一点

 Now A Bit More Efficiency 

现在让我们继续讨论稍微复杂一点的算法,它的目标是将验证程序的复杂性从 1018 降低到 1015,然后降低到 109。首先,我们将用模块化数学计算来检验多项式的接近程度,而不是用常规算法来计算。正如我们在前一篇文章中看到的,我们这样做可以防止 STARKs 中的数字增长到20万位数。然而,在这里,我们将使用某些模幂运算的“小映像”属性作为突破点,以便我们的算法更加高效。

具体来说,我们将使用p = 1,000,005,001。之所以我们会选择这个数,是因为

  1. 它大于10亿,我们需要它至少是10亿所以我们可以检查10亿个点,

  2. 它是质数,

  3. p-1是1000的偶数倍。求幂x1000的图像大小为1000006——也就是说,求幂只能给出1000006个可能的结果。

这意味着“对角线”(x, x1000) 现在变成了被包围的对角线;由于 x1000只能接受1000006个可能的值,所以我们只需要1000006行。因此,g(x, x1000) 的完整计算现在只有大约1015个元素。

 

 

也可以更进一步的说:我们可以让验证者只在单个列上对 g 进行评估。关键在于原始数据本身已经包含了任意给定行上的1000个点,所以我们可以简单地对这些点进行抽样,得出它们所在的次数小于1000的多项式,然后检查列上的对应点是否在同一个多项式上。再接着检查列本身是小于1000多项式就可以了。

验证者的复杂度仍然是亚线性的,但是证明者的复杂度现在已经下降到109,而且它在查询数量上变成了线性的(虽然在评估多项式开销的时候,它在仍然是超线性的)。

   

04   甚至是更高的效率

 And Even More Efficiency 

虽然,证明者的复杂性无法降得更低了。但是我们仍然可以进一步降低验证者的复杂度,从二次到对数。我们的方法是让算法递归。我们从上面的最后一个算法开始,但是我们并不是要将多项式嵌入到x和y次数相等的二维多项式中,而是将多项式嵌入到二维多项式中,其中x中的次数是一个很小的常数;为简单起见,我们甚至就是2。也就是说,表达式 f(x)= g(x, x2),在检查的时候,我们只需要检查每一行上的3个点(2个来自对角线,1个来自列)。

如果原始多项式的次数小于n,则行的次数小于2(是一条直线),列的度数小于n/2。因此,我们现在得到的线性时间过程将证明次数小于 n的近似多项式问题转化成一个证明次数小于 n/2 的近似多项式的问题。此外,需要提交的点数以及证明者的计算复杂度每次下降2倍(Eli Ben-Sasson 喜欢将 FRI 的这一方面与FFT“快速傅里叶变换”进行比较,关键与FFT算法区别在于,递归的每一步只引入了一个新的子问题而不是将问题一分为二)。因此,我们可以继续在上一轮算法中创建的列上使用算法,直到列变得非常小,我们可以直接检查它;总的复杂度大概是 n + n/2 + n/4 +…… ≈ 2n。

 

 

实际上,算法需要重复执行多次,因为攻击者仍然有很大的可能会在某一次计算中作弊。然而,即使是这样的证明也不是很明显;验证的复杂性在量级上依然是对数的,但是如果你把Merkle的大小计算在内的话,它会上升到 log2(n)。

“真正的”FRI算法也有其他一些变种版本;例如,它使用二分的 Galois 域(基本上,与我在这里讨论的12度扩展域是相同的,但素数模数为2)用于该行的指数通常是4而不是2。这样的修改结果就是提高了效率,使系统更友好地在其上构建 STARKs。但是,这些修改对于理解算法的工作原理就没太大必要了,如果你真的想要,你肯定可以用这里描述的基于模块化数学的 FRI 制作STARK。

 

   05   可靠性

 Soundness 

注意,计算的可靠性——以现在的算法来说,仍然有很小的概率,是可以伪造出通的过重重考验的最佳假证明——在这个很小概率内仍然是“危险”地带。可以看一个简单的例子,对于你获取的1,000,000 + k 个点,有一个简单的下界:如果给定数据集对于任何多项式中,至少 p% 不在多项式上,则该测试将会有最多(1-p%)k 的概率通过测试。然而,即使这个下界非常小 - 例如,不可能有“同时接近两个低次多项式”的概率是超过 50% 的,并且你选择第一个点正确的概率非常低。对于成熟的 FRI,也还是存在涉及各种特定类型的复杂攻击。

总的来说,“好消息”是,为了让STARKs情况下的D(x)* Z(x)= C(P(x))通过检查,一个无效方案的 D(x) 将需要是某种意义上的“最坏情况”  – 这需要最大程度地远离任何有效的多项式。这也意味着我们对检查的精度没有那么高的要求。已经证明有下界,但是这些界限意味着实际的STARKs需要大约1-3MB; 还有一个未被证实的更强的边猜想,所需的检查次数减少了4倍。

 

   06   总结

 Review and summarize 

本系列的第三部分将讨论构建STARKs的最后一个主要部分:我们如何实际构造约束检查多项式,以便我们可以证明任意算法,而不仅仅是几个斐波那契数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值