本文是关于Binius证明系统的第二部分,重点介绍了连接码(允许扩展小字段的多项式承诺方案)和用于检查多元多项式上语句的不同协议。Binius中几乎所有的协议都归结为sumcheck协议,并提出使用Plonkish算术化,与HyperPlonk的主要区别在于trace包含属于不同子域的元素,因此门约束将表达不同子域的关系。
这篇文章是我们关于 Binius (一种基于二元域的新证明系统)讨论的延续。在继续之前,如果你不熟悉某些概念,请参阅第一部分,或者阅读我们的文章,了解我们为什么认为这个证明系统可以帮助推动行业发展。
在本文中,我们将重点介绍级联码(这使我们能够扩展小域的多项式承诺方案)以及用于检查多元多项式上的语句的不同协议。
在之前的文章中,我们介绍了小域的多项式承诺方案。为了开发通用的承诺方案,我们首先需要介绍 packing 方案和级联码。请记住,在这种设置中,我们正在使用域塔,τ0⊂τ1⊂⋯⊂τtτ0⊂τ1⊂⋯⊂τt。我们使用一个 [n0,k0,d0][n0,k0,d0] 线性外码,以及一个 [ni,ki,di][ni,ki,di] 线性内码。外码基于 τi+kτi+k,而内码基于 τiτi。
整个构造依赖于从一个域中 packing 几个元素,并将它们解释为来自扩展域的元素。我们可以将来自 τiτi 的 2k2k 个元素视为来自 τi+kτi+k 的单个元素(我们可以将其视为 τiτi 向量空间,因为我们可以将复数视为实数上的二维向量空间)。
级联码的编码过程如下:
我们面临的一个问题是我们必须使用扩展码。我们在不同的域之间存在相互作用:表示多项式系数的域、代码字母表的域、中间域以及我们用于密码安全的扩展域(这里是 τtτt)。为了使用扩展码,我们定义了一个结构,其中包含来自矩形数组(具有 2τ−i×2k2τ−i×2k 个元素)中 τiτi 的元素。每行包含 2k2k 个元素,可以解释为 τi+kτi+k 元素。类似地,一列中的 2τ−i2τ−i 个元素可以解释为 τtτt 中的单个元素。该结构具有双重视图:作为维度为 2k2k 的 τtτt 上的向量空间(查看列)或作为维度为 2t−i2t−i 的 τi+kτi+k 上的向量空间。数组与来自 τiτi 的元素的乘法被解释为逐元素乘法。如果我们要乘以 τtτt 上的元素,我们取每一列(它是来自 τtτt 的单个元素)并执行每一列与该元素的乘法。以类似的方式,我们可以通过将每一行相乘来乘以 τi+kτi+k 中的元素。
基于块级别编码的多项式承诺方案的步骤是:
证明的大小可以从 t′t′ (来自 τtτt 的 m1m1 个元素)、列(由来自 τi+kτi+k 的 ρm0ρm0 个元素组成)加上 ρρ 列的身份验证路径来计算。 假设摘要大小为 256256 位,我们有 2τm1+2i+kρm0+28ρlog2n2τm1+2i+kρm0+28ρlog2n 位。
Binius 包含一个关键多项式谓词列表,基于 HyperPlonk 提出的那些:
几乎所有的协议都归结为 sumcheck。 有关 sumcheck 协议的基础知识,请参阅我们之前的文章或 Thaler 的书。
例如,zerocheck 协议可用于证明在 HyperPlonk 中强制执行了 gate 约束。在该协议中,我们有一个多线性多项式 MM(它编码了 trace)和选择器多线性多项式 S1S1、S2S2、S3S3,这样,对于 0,1n0,1n 中的每个点,我们有
0=S1(M0+M1)+S2M0M1+S3G(M0,M1)−M2+I0=S1(M0+M1)+S2M0M1+S3G(M0,M1)−M2+I
其中 M0(x)=M(0,0,x)M0(x)=M(0,0,x),M1(x)=M(0,1,x)M1(x)=M(0,1,x),M2(x)=M(1,0,x)M2(x)=M(1,0,x)。
我们如何证明多元多项式 P=S1(M0+M1)+S2M0M1+S3G(M0,M1)−M2+IP=S1(M0+M1)+S2M0M1+S3G(M0,M1)−M2+I 对于 0,1n0,1n 中的每个值都等于零?我们让验证者提供来自 FnFn 的随机点 rzcrzc 并构建多元多项式
P′(x)=eq(rzc,x)P(x)P′(x)=eq(rzc,x)P(x)
其中 eq(x,y)=∏(xiyi+(1−xi)(1−yi))eq(x,y)=∏(xiyi+(1−xi)(1−yi)),我们为 P′(x)P′(x) 运行 sumcheck 协议,以 00 作为总和值。验证者只需要在 x=rsx=rs 处对 P′(x)P′(x) 进行一次评估。
将 sumcheck 与 P′(x)P′(x) 一起使用涉及到非多线性的多元多项式;这意味着证明者必须在每一轮发送一个最多为 dd 次的多项式。HyperPlonk 对此情况进行了优化:证明者发送对次数最多为 dd 的单变量多项式的承诺,并提供对单个点的评估(而不是至少 3 个点)。
由于大多数协议最终都以 sumcheck 结束,我们可以使用随机线性组合对多项式进行批处理,并将所有检查减少为单个 sumcheck。Binius 的存储库 包含零、求和和评估检查的实现。
Binius 建议使用 Plonkish 算术化; 与 HyperPlonk 的主要区别在于,trace 包含属于不同子域的元素。 因此,gate 约束将表达不同子域上的关系。 如果满足以下条件,则执行有效
前两个条件适用于 Plonk 的任何变体; 最后一个条件是引入的,因为我们使用扩展塔。
在本文中,我们介绍了如何扩展第一部分中开发的承诺方案以使用打包域。 我们可以以双重方式查看域元素数组,按列或按行 packing 元素。 本文稍后介绍了一些关键协议,以证明多项式上的谓词,例如评估、求和和乘积检查; 这些都归结为执行多个可以方便地批处理的 sumcheck。 这些与一些算术化方案(例如 Plonkish)一起可以使用来产生 SNARK。 HyperPlonk 和 Binius 之间的主要区别在于,Binius 中的 trace 元素可能属于不同的子域。 然而,这并没有增加新的检查。 相反,这可以取代 HyperPlonk 中可能存在的额外检查。 这些子域检查由小域多项式承诺方案的安全属性保证。
- 原文链接: blog.lambdaclass.com/bin...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!