Halo2是Zcash协议在Orchard升级中将要采用的零知识证明系统,无需可信设置,可以实现递归证明。
基本概念
证明系统
证明公开输入和隐私输入满足关系
-
private inputs
: 隐私输入 -
advice value
: 中间输入 -
public input
: 公开输入
private input
和 advice value
统称为 witness
。
PLONKish
Halo2 基于PLONK
实现,支持 custom gate
和 lookup argument
,称为Plonkish
.
UPA
电路定了一个矩阵,包括rows
, columns
和 cells
等元素。
-
cell
的值定义在有限域 上; -
columns
可分为fixed
,advice
,instance
。fixed
对应着固定的列,advice
对应着witness
值,instance
主要用作公开输入; - 域 上的多变量多项式在每一行值为0.
- 由
input expressions
和table columns
定义的lookup arguments
通过电路的描述,可以生成 proving key
和 verification key
.
电路门包括 standard gate
(支持通用操作)和 custom gates
(支持专用的操作)。
Cores
Cores
可以用来实现一些密码组件,例如hash
算法,标量乘或双线性对等。
Chips
可以将多个cores
的功能整合在一起,形成chip
。
Gadgets
相比Chips
, 能提供更上层的抽象。
用户文档
开发工具
MockProver
: 可以用于调试电路,并验证电路的正确性;
dev-graph
: 创建 电路的图形化表示;
circuit_dot_graph
: 用于构建电路的DOT图表示。
cost-model
: 用于评估验证的消耗和proof大小。
查找表
以空间换时间,通过查找表提升性能。
证明系统
门电路
Halo2证明系统可以分解为五步:
- 对电路的主要组件生成多项式承诺;
- 构造
vanishing argument
限制所有的电路关系为0; - 有一些必要的点对上面的多项式进行估值;
- 构建
multipoint opening argument
验证估值和承诺一致; - 利用
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
列,用 表示固定列 行 列的赋值,相似地, 表示advice
和instance
列的赋值。
为了对赋值进行承诺,构造次数为次的多项式,满足:
- 插值得到:
- 插值得到:
然后构建 每一列多项式的承诺:
是密钥生成的一部分,盲化因子为1。 由证明者构造,发送给验证者。
Committing to the lookup permutaions
验证者随机生成 , 用于保证查找表各列相互独立,证明者对置换承诺的过程如下:
- 对于输入的列多项式和表的列多项式,证明者可以构造两个压缩多项式:
- 证明者再得到 和 的置换 和
然后证明者得到lookup
的盲承若:
并将其发送给验证者。
验证者得到 后,生成随机挑战 和 , 可以用于 permutation argument
和 lookup 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
多项式, 设 为正整数。 对于交互 式证明 , 其关系为:
其中 为多变量多项式, 次数 , 次数为 .
返回参数为:
- 和 进行以下 轮交互 :
- 设定 ;
- 发送承诺 , 其中 为 的系数。
- 响应 挑战
和 设定多项式
发送承诺 , 其中 随机抽样的系数,单变量多项式 的次数为
计算单变量多项式 , 其次数为
计算至多 度数为 的多项式: 使得
发送承诺 , 对于所有 , 表示 的系数
响应挑战 , 并计算
设置
发送 , 对于所有 , 发送 , 使得 ,
对于所有的 和 设定 为次数最低的单变量多项式,定义为: ,
响应挑战 , 并初始化
- 从 到 , 设定
- 最终设定
- 初始化
- 从 到 , 设定
- 最终设定
- 和 初始化
- 从 到 , 和 设定 .
- 和 设定 , 其中 is由 通过 计算, 由证明者 提供。
- 发送 , 其中 定义了多项式的系数:
$$
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)
$$
- 响应挑战 .
- 发送 使得 , .
- 响应挑战 .
- 和 设定 , 其中
$$
\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
$$
- 设定 .
- 选取次数为 的多项式s(X) , 其中一个根为, 并发送承诺 , 其中 定义了多项式 系数。.
- 响应挑战 .
- 和 设定 .
- 设定 .
- 初始化 作为 的系数, , . 和 将在以下 中交互,对于 :
- 发送 和
- 响应挑战 .
- 和 设定 and .
- 设定 .
- 发送 和盲化因子 .
- 验证是否成立。
参考
https://zcash.github.io/halo2/index.html
https://github.com/zcash/halo2