Halo2

Halo2是Zcash协议在Orchard升级中将要采用的零知识证明系统,无需可信设置,可以实现递归证明。

基本概念

证明系统

证明公开输入和隐私输入满足关系

  • private inputs: 隐私输入
  • advice value: 中间输入
  • public input: 公开输入

private inputadvice value 统称为 witness

PLONKish

Halo2 基于PLONK实现,支持 custom gatelookup argument,称为Plonkish.

UPA电路定了一个矩阵,包括rows, columnscells等元素。

  • cell的值定义在有限域 上;
  • columns可分为fixed, advice, instancefixed 对应着固定的列,advice 对应着 witness 值,instance 主要用作公开输入;
  • 域 上的多变量多项式在每一行值为0.
  • input expressionstable columns定义的lookup arguments

通过电路的描述,可以生成 proving keyverification key.

电路门包括 standard gate (支持通用操作)和 custom gates(支持专用的操作)。

Cores

Cores 可以用来实现一些密码组件,例如hash 算法,标量乘或双线性对等。

Chips

可以将多个cores的功能整合在一起,形成chip

Gadgets

相比Chips, 能提供更上层的抽象。

用户文档

开发工具

MockProver: 可以用于调试电路,并验证电路的正确性;

dev-graph: 创建 电路的图形化表示;

circuit_dot_graph: 用于构建电路的DOT图表示。

cost-model: 用于评估验证的消耗和proof大小。

查找表

以空间换时间,通过查找表提升性能。

证明系统

门电路

Halo2证明系统可以分解为五步:

  1. 对电路的主要组件生成多项式承诺;
  2. 构造 vanishing argument 限制所有的电路关系为0;
  3. 有一些必要的点对上面的多项式进行估值;
  4. 构建 multipoint opening argument 验证估值和承诺一致;
  5. 利用inner product argument 构建 polynomial commitment opening proof.

halo2协议

检查
构造

然后证明者和验证者执行:

  • 构造;

  • 构造;

  • 执行

Lookup argument

halo2采用查找表技术,比Plookup更简单。

  • grand product argument polynomial

技术描述

对于长度为的两个列 和 , 查找表主要实现:确何 中的每个元素在 中存在。

  • 其中 的值可以固定的,也可能是变化的;
  • 和 都可以包含重复的值。

给定 和 置换分别为 和 , 它们之间可以采用 permutaion argument 进行约束。

对于所有的 :

上述只是指定了置换关系,但未指明具体的置换。

需要注意的点:

  • 由 排序得到,并且相同的值连接排列;

  • 中与 中相同连续值的第一个对应行保持相等,其它的值可以为任意置换。

相应地,约束 或 条件为:


另外,需要限制 , 采用以下规则:

通过上述规则可以保证 中的每个元素存在于 中。

Permuation argument

置换为一对一的映射,一个置换可以分解为多个cycles , 例如 表示 映射 , 映射到 , 映射到 。

设 为 次本原根, 为 次本原根, 其中 , 为奇数,. 用 表示 行 列。

用 表示 个多项式 的向量置换,使得

恒等置换为:

置换可以表示:

定义 为: , 对于:

可以有效进行约束:

列的个数可以进行任意扩展,具体不再进行介绍 。

Circuit commitments

Committing to the circuit assignments

对于长度为 的表,可以分解为 advice, instance, fixed 列,用 表示固定列 行 列的赋值,相似地, 表示adviceinstance列的赋值。

为了对赋值进行承诺,构造次数为次的多项式,满足:

  • 插值得到:
  • 插值得到:

然后构建 每一列多项式的承诺:

是密钥生成的一部分,盲化因子为1。 由证明者构造,发送给验证者。

Committing to the lookup permutaions

验证者随机生成 , 用于保证查找表各列相互独立,证明者对置换承诺的过程如下:

  • 对于输入的列多项式和表的列多项式,证明者可以构造两个压缩多项式:

  • 证明者再得到 和 的置换 和

然后证明者得到lookup 的盲承若:

并将其发送给验证者。

验证者得到 后,生成随机挑战 和 , 可以用于 permutation argumentlookup argument中。

Committing to the quality constraint permutation

定义 为 等式约束的列数, 为最大的列数, 为 Permuation argument 中可用的行数,

证明者构建向量, 其长度为, 对于列集 , 对于每一行 :

然后证明者构建 多项式的盲承若:

并将基发送给验证者。

Committing to the lookup permuation product columns

对于查找表,证明者需要构建置换的承诺:

  • 证明构建向量 , 满足:

  • 证明者构建 多项式 , 采用Lagrange 基表示, 且

然后,证明者构造 多项式的盲承诺:

Vanishing argument

在对电路赋值承诺之后,证明者需要保证电路关系满足:

  • 定制电路门,由表示
  • 查找表的规则;
  • 等式约束置换的规则;

每列的次数为 , relation 由次数为 ,其中 表示 列多项式的次数。

例如,对于下述门电路多项式,其次数为:

若多项式值为0, 表示relation 关系满足, 可以通过vanishing polynomial 实现。若relation 多项式可以被 整除,则表示它在domain上的所有值为0.

可以对每一个多项式关系构造一个承诺,也可以对所有关系多项式同时进行承诺,验证者生成随机挑战 , 然后证明者构造 商多项式:

其中分子是电路关系的随机线性组合。

Committing to

次数 为 , halo2 中的多项式承诺最多支持次数 , 因此需要对 多项式进行拆分,即:

然后生成每个部分的盲多项式承诺:

Evaluating the polynomials

目前所有多项式都被承诺了,验证需要知道 的承诺是否正确,验证者生成 , 证明者生成多项式在 的值:

本例中, 多项式值包括:
$$
a_0(x) \
a_1(x) \
a_2(x), a_2(x\omega^{-1}) \
a_3(x) \
f_0(x), f_0(x\omega^{-1}) \
h_0(x),\cdots, h_{d-1}(x)

$$

验证者检查 的值满足以下形式:

通过检查估值,验证者可以验证电路约束关系满足。因此验证者需要验证所有多项式在 处的值和它们的承诺对应,这通过 multipoit opening argument 实现。

Multipoint opening argument

multipoint opening的输入包含:

  • 由验证者随机生成的 , 在其上计算多项式 的值;
  • 由证明者提供多项式的值:

优化过程如下:

  • 随机选取 , 使 线性无关。

  • 累加多项式和其对应的值:

    插值值的集合:

构造 f_polys, 并检查其正确性:

随机选取 , 构造

随机选取 , 估计值 :

随机选取 , 构造 , 即为最终进行内积证明承诺的多项式。

Inner product argument

Halo2 内积证明类似 BCMS20.

协议描述

采用 作为安全参数。

cryptographic groups

用 表示素数阶为 的循环群,单位元为 . 标量域 , 阶为 . 用 表示两个向量的内积,其中 . 表示群元素的线性组合,其中

离散对数关系问题: 采用的度量为:

由以下游戏定义:
$$
\begin{array}{ll}

&\underline{\bf{Game}\ \ G_{\mathbb{G},n}^{dl-rel}(\mathcal{A}, \lambda):} \
& \mathbf{G}\leftarrow \mathbb{G}_{\lambda}^n \
& a \leftarrow \mathcal{A}(\mathbf{G}) \
& Return\ (\langle \mathbf{a}, \mathbf{G} \rangle = \and\ \mathbf{a}\neq \mathbf{0}^n)
\end{array}
$$

Interactive proofs

交互式证明是一个三元的算法: , 生成公开的参数 , 证明者 和 验证者 采用 表示,其输入分别为 和 。

零知识证明具体有以下属性:

  • Completeness
  • Soundness
  • Knowledge soundness
  • Zero knowledge

协议

定义 为 次本原根,定义域为 , 为定义域上的vanishing 多项式, 设 为正整数。 对于交互 式证明 , 其关系为:
\mathcal{R} =\left\{ \begin{array}{ll} & \left( \begin{array}{ll} \left( g(X, C_0, C_1, ..., C_{n_a - 1}) \right); \\ \left( a_0(X), a_1(X, C_0), ..., a_{n_a - 1}(X, C_0, C_1, ..., C_{n_a - 1}) \right) \end{array} \right): \\ & g(\omega^i, C_0, C_1, ..., C_{n_a - 1}) = 0 \, \, \, \, \forall i \in [0, 2^k) \end{array} \right\}
其中 为多变量多项式, 次数 , 次数为 .

返回参数为:

  1. 和 进行以下 轮交互 :
  • 设定 ;
  • 发送承诺 , 其中 为 的系数。
  • 响应 挑战
  1. 和 设定多项式

  2. 发送承诺 , 其中 随机抽样的系数,单变量多项式 的次数为

  3. 计算单变量多项式 , 其次数为

  4. 计算至多 度数为 的多项式: 使得

  5. 发送承诺 , 对于所有 , 表示 的系数

  6. 响应挑战 , 并计算

  7. 设置

  8. 发送 , 对于所有 , 发送 , 使得 ,

  9. 对于所有的 和 设定 为次数最低的单变量多项式,定义为: ,

  10. 响应挑战 , 并初始化

  • 从 到 , 设定
  • 最终设定
  1. 初始化
  • 从 到 , 设定
  • 最终设定
  1. 和 初始化
  • 从 到 , 和 设定 .
  • 和 设定 , 其中 is由 通过 计算, 由证明者 提供。
  1. 发送 , 其中 定义了多项式的系数:
    $$
    q'(X) = \sum\limits_{i=0}^{n_q - 1}

x_2^i
\left(
\frac
{q_i(X) - r_i(X)}
{\prod\limits_{j=0}^{n_e - 1}
\left(
X - \omega^{\left(
\mathbf{q_i}
\right)_j} x
\right)
}
\right)
$$

  1. 响应挑战 .
  2. 发送 使得 , .
  3. 响应挑战 .
  4. 和 设定 , 其中
    $$
    \sum\limits_{i=0}^{n_q - 1}
    \left(
    x_2^i
    \left(
    \frac
    { \mathbf{u}i - r_i(x_3) }
    {\prod\limits
    {j=0}^{n_e - 1}
    \left(
    x_3 - \omega^{\left(
    \mathbf{q_i}
    \right)_j} x
    \right)
    }
    \right)
    \right)

x_4 \sum\limits_{i=0}^{n_q - 1} x_4 \mathbf{u}_i
$$

  1. 设定 .
  2. 选取次数为 的多项式s(X) , 其中一个根为, 并发送承诺 , 其中 定义了多项式 系数。.
  3. 响应挑战 .
  4. 和 设定 .
  5. 设定 .
  6. 初始化 作为 的系数, , . 和 将在以下 中交互,对于 :
  • 发送 和
  • 响应挑战 .
  • 和 设定 and .
  • 设定 .
  1. 发送 和盲化因子 .
  2. 验证是否成立。

参考

https://zcash.github.io/halo2/index.html

https://github.com/zcash/halo2

你可能感兴趣的:(Halo2)