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
.
-
设定
.
-
发送
和盲化因子
.
-
验证
是否成立。
网友评论