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