译自 halo2 book:user/tips-and-tricks.md
技巧与窍门
本节包含各种你在编写 halo2 电路(circuit)时可能会觉得有用的想法和代码片段。
小范围约束
R1CS 电路中常用的一种约束是布尔约束(boolean constraint):。这个约束只能被 或 满足。
在 halo2 电路中,你可以用类似的方式约束某个单元格(cell)取一小组值中的某一个。例如,要把 约束到范围 ,你可以创建如下形式的门(gate):
而要把 约束为 7 或 13,你可以使用:
这里的底层原理是:我们构造一个多项式约束(polynomial constraint),让它在我们想要允许的那组可能取值中的每一个值处都有一个根。在 R1CS 电路中,所支持的多项式最大次数(degree)为 2(因为所有约束都是 的形式)。在 halo2 电路中,你可以使用任意次数的多项式——但前提是,次数越高的约束使用起来成本越高。
注意,这些根不必是常数;例如 会把 约束为等于 中的某一个,其中后者可以是任意多项式,只要整个表达式保持在最大次数界限之内即可。
小集合插值
我们可以使用拉格朗日插值(Lagrange interpolation)构造一个多项式约束,对于小集合 实现映射 。
例如,假设我们想把一个 2 比特的值映射到一个与零交错排列的"展开(spread)"版本。我们首先预计算每个点处的取值:
然后,我们使用如下恒等式为每个点构造拉格朗日基多项式(Lagrange basis polynomial): 其中 是数据点的个数。(在上面的例子中 。)
回顾一下,拉格朗日基多项式 在 处取值为 ,在所有其他 处取值为 。
继续我们的例子,我们得到四个拉格朗日基多项式:
于是我们的多项式约束为