Plonky方案

通过利用Plonk的置换,Halo的多项式承诺,和多参数的电路模型,Plonky能够实现量级的递归证明,代码库为plonky, 目前开发尚不完善。 理解本文内容需要
Plonk, Halo和Rescue的知识背景。

Plonk优化

多项式承诺

设定 为素数阶域, 为阶为, 是一组随机群元素。

若对次数为 的多项式 承诺,可以把多项式当作一个系数向量,每个 可以看作上的一组长度为 的向量,定义:


则 .

定义, 为多项式的承诺。在Bulletproofs中, 对于, 需要在承诺条件下证明.

对于 和, 可以通过随便值 证明 , 即证明 。

由此可以将多个多项式在多个点的承诺转换为一个多项式在单点的承诺。假如要证明所有的多项式在多点的值,即证明 。

随机选取 , 定义 , 随机选取 , 令 , , 可以利用内积证明。

批量多项式承诺

设是一系列随机的群元素,,。 证明者首先发送每个多项式的承诺, 并且值为 。验证者随机选取 , 并计算:

其中. 证明者需要证明 , 即归为内积的形式:

验证过程需要计算和, 其中 由Halo中定义,需要采用Halo中的技术。

Halo中点乘的瓶颈

在Halo中,验证多项式承诺涉及到计算:

其中和由证明者发送, 为随机挑战值。

点乘通过 通过 "double-and-add"方法计算,汲及 次点加和 次倍点运算。 Halo通过自同态技术将其约减为 次加法和 次倍点运算。

Plonky通过MSM 技术优化,约减为 次群操作。

广义Plonk电路模型

Plonk标准电路模型为:

其中 为电路的相关配置,为用户输入值。

Plonk电路简单, 但会导致很多的电路门数,例如椭圆曲线点运算需要7个门电路。 可以优化Plonk电路,减少电路门数。

(1)可以采用多参数(high-arity) 门电路,若想要一个门电路执行椭圆曲线操作,需要6个参数,但这会增加证明者的计算代价;

(2)可以增加约束,而非仅局限于一种,但这会要求证明者做更多的FFT运算;

(3)在Routed wire的基础上, 增加Advice wire, 用来作为中间变量的值,减少Plonk中置换多项式的次数。

(4)添加移位的点, 使当前门电路关联后续更多电路,减少复制约束。

椭圆曲线门电路

在MSM优化算法中,主要涉及点逆运算,自同态, 点加运算,可以表示为:

其中是要乘的点,为标量两个连续的bit,要加的点,是点加的结果。

对于Weierstrass形式曲线,加法公式为:

可以引入 advice wire处理像 类似的中间变量,门电路定义形式如下:

  • Routed wires:

  • Advice wires:

  • 约束条件为:
    \begin{aligned} r_\mathrm{low} (r_\mathrm{low} - 1) &= 0, \\ r_\mathrm{high} (r_\mathrm{high} - 1) &= 0, \\ x_1 &= (1 + (\zeta - 1) r_\mathrm{high}) x, \\ y_1 &= (2 r_\mathrm{low} - 1) y, \\ (x_1 - x_2) \mathrm{inv} &= 1, \\ \lambda &= (y_1 - y_2) \mathrm{inv}, \\ x_3 &= \lambda^2 - x_1 - x_2, \\ y_3 &= \lambda(x_1 - x_3) - y_1. \end{aligned}
    Plonky实际实现只用一个门电路实现椭圆曲线运算。

Rescue

设定 为Rescue中MDS矩阵,一个宽度为2的Rescue置换定义如下:
\begin{aligned} \operatorname{step}_{i,1}\left(\begin{bmatrix}x_1 \\ x_2\end{bmatrix}\right) &= M \begin{bmatrix}x_1^{1/\alpha} \\ x_2^{1/\alpha}\end{bmatrix} + \begin{bmatrix}r_{i,1} \\ r_{i,2}\end{bmatrix}, \\ \operatorname{step}_{i,2}\left(\begin{bmatrix}x_1 \\ x_2\end{bmatrix}\right) &= M \begin{bmatrix}x_1^{\alpha} \\ x_2^{\alpha}\end{bmatrix} + \begin{bmatrix}r_{i,3} \\ r_{i,4}\end{bmatrix}, \\ \operatorname{round}_i &= \operatorname{step}_{i,2} \circ \operatorname{step}_{i,1}, \end{aligned}
其中为轮变换常量。

计算 计算代码比较大, 需要证明者提供 advice wire . 表示轮函数的输出, 最终门电路定义如下:

  • Routed wires:

  • Advice wires:

  • Constants:
    \begin{aligned} x_1 & = y_1^\alpha, \\ x_2 & = y_2^\alpha, \\ z_1 & = A(Ay_1+By_2+r_{i,1})^\alpha+B(Cy_1+Dy_2+r_{i,2})^\alpha+r_{i,3}, \\ z_2 & = C(Ay_1+By_2+r_{i,1})^\alpha+D(Cy_1+Dy_2+r_{i,2})^\alpha+r_{i,4} \end{aligned}

Plonky甚至可以在一个门电路执行多轮Rescue置换,实际中受每个门电路中常量的限制。Rescue一轮中有4个常量: , 添加更多常量意味着处理更多的多项式。作为后期优化,可以把Rescue门电路和其它不需要常量的电路放在一起,例如椭圆曲线操作。或者对其进行更改,使它不需要那么多常量配置。

约束集

Plonk 只使用了一种约束,Plonky可以使用多种约束集,使用各种不同的定制门电路,并将其组织成二叉树的形式,如下所示:

未来优化

Plonky后续将持续优化,全面提升算法性能。

零知识证明特性

Plonk论文中对零知识证明特性缺少证明,plonky可以展示其零知识证明属性,并描述另一种适合Halo多项式承诺风格的盲化方法。

基础定义

对于 , 定义多项式 为:

或者等价表示为:

其中为Plonk中定义的Lagrange 基。

Plonk盲化方案

设为witess多项式,为挑战点的值,且 .

设为盲化多项式, 从中随机选择,Plonk中重新定义:

和 在 定义一致,因此可以用 替换 。

当, , 导致信息泄露。 为了实现零知识证明特性,需要选择 。 若 , 可知, 可以得到:

对于秘密多项式, 不会泄露 的任何信息。

Halo盲化

上述盲化不适合于Halo中的多项式承诺,因为超过了2的幂次方法次数。

Plonky采用Lagrange基的形式盲化witness多项式, 则盲化多项式定义如 下:

由于 的次数为 , 至多有 个根。因此可以选择不包括根元素的集合, 对于 , 可以得到:

对于 不会泄露 的信息。

盲化

Plonk 涉及置换多项式 ,即 , 若直接给出 的值,将会泄露witness的信息,

Lemma 1. 若限制 为上的置换,则 ;

Lemma 2. 对于

在 的其它点上, 可以将写作:

为上的多项式, 满足:

假定, 可以得到:

参考

https://github.com/mir-protocol/plonky

https://mirprotocol.org/blog/Fast-recursive-arguments-based-on-Plonk-and-Halo

https://hackmd.io/f6ShwcCLTfmClTmmmMUjuA?view

你可能感兴趣的:(Plonky方案)