Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

译自 halo2 book:https://zcash.github.io/halo2/design/gadgets/decomposition.html

分解(Decomposition)

给定一个域元素(field element),这些 gadget 把它分解(decompose)成 比特的窗口(windows) 其中每个 是一个 比特的值。

这是用一个累加和(running sum) 来完成的。我们将累加和初始化为 并计算后续各项 这给出:

严格模式(Strict mode)

严格模式把累加和输出 约束为零,从而把该域元素范围约束(range-constrain)在 比特之内。

在严格模式下,我们还能确信 给出了分解中的最后一个窗口。

查表分解(Lookup decomposition)

这个 gadget 利用一张 比特的查表表把域元素 分解成 比特的字(words)。每个 比特字 都通过在 比特表中查表而被范围约束。

查表分解的区域布局使用单个建议列(advice column),以及两个选择子(selectors)

短范围检查(Short range check)

使用两次 比特查表,我们可以把一个域元素 范围约束为 比特,其中 做法是:

  1. 用一次 比特查表把 约束在 比特之内。
  2. 用一次 比特查表把 约束在 比特之内。

查表分解的短变体(short variant)引入了一个 选择子。这里把同一个建议列 重命名为 以便表述清晰:

其中 注意 在密钥生成(keygen)时被赋到一个固定列里,并在证明(proving)时拷入。它被用在由 选择子启用的门中,以检查 是否被正确地移位(shifted):

合并的查表表达式

由于查表分解及其短变体都使用同一张查表表,我们把它们的查表输入表达式合并成一个:

其中 是同一个单元(cell)(此处为了用法上的清晰而加以区分)。

短范围分解(Short range decomposition)

对于一个短范围(例如 ,其中 ),我们可以用一个 次多项式约束来范围约束每个字,而不必用查表: