实用的小方法
本节包含几个写 halo2 电路时能用帮上忙的小策略。
小范围(or 区间?)约束
在 R1CS 电路中,经常用到的一种约束就是布尔约束: . 这种约束限定了 或者 .
类似地,在 halo2 电路中,你也可以限定一个 单元格 在一个小集合内取值。比如,若要限定 的值落在区间 ,你可以构建如下形式的门:
又比如,要限定 等于 7 或 13,你可以用如下的门:
基本原理就是,我们构建一个多项式约束,使得其根集合与我们想限定的取值集合相同。 R1CS 电路支持的多项式次数最大为2(因为所有的约束方程必须具有 的形式)。 而 halo2 电路支持任意次数的多项式,只不过更高次数会带来更大的代价。
需要注意,这些根不必是常量;比如,可以用 来限定 等于集合 中的任一元素。而且,
小集合插值
我们可以用 Lagrange 插值法构造一个多项式约束,证明 ,其中 。
例如,假设我们想把两个比特的值通过插零扩展为“Spread”4个比特值。我们首先预计算出每一个点上的取值:
然后,为每一个点计算出对应的 Lagrange 基多项式(basis polynomial),其中 是点的个数(在我们的例子中,):
回顾一下,Lagrange 基多项式 满足如下性质:若 , 则 ;否则,,一定有 。
回到我们刚才举的例子,我们就计算出了4个 Lagrange 基多项式:
那么,我们就得到了如下所示的多项式约束: