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/ecc/fixed-base-scalar-mul.html

定基标量乘(Fixed-base scalar multiplication)

Orchard 协议中有 个定基(fixed base):

  • ,用于推导 nullifier;
  • ,用于 spend authorization(花费授权);
  • 基,用于 ;
  • 基,用于 ;以及
  • 基,用于

分解标量(Decompose scalar)

我们支持三种类型标量(scalar)的定基标量乘:

全宽标量(Full-width scalar)

一个来自 位标量。我们把一个全宽标量 分解为 位窗口(window):

对于表示 范围内任意整数的 ,标量乘都将被正确计算——也就是说,允许标量是非规范(non-canonical)的。

我们使用一个多项式范围检查约束(polynomial range-check constraint)对标量分解的每个 位字(word)进行范围约束: 其中

基域元素(Base field element)

我们支持使用一个基域元素(base field element)作为定基乘法中的标量。例如,这出现在 Action 电路 nullifier 计算的标量乘中::这里,标量 是一次基域加法的结果。

把基域元素 分解为三位窗口,并对每个窗口进行范围约束,使用严格模式(strict mode)下的短范围分解(short range decomposition) gadget,其中

如果 是直接见证的,那么不会出现规范性(canonicity)问题。然而,因为这里标量是作为一个基域元素给出的,必须谨慎确保规范表示,因为 。也就是说,我们必须检查 其中 是 Pallas 基域模数 注意

为此,我们把 分解为三段:

我们通过以下方式检查此分解的正确性: 如果最高有效位(MSB) 未被置位,那么 然而,在 的情况下,我们必须检查:

  • :
    • ,

为了检查 我们利用三位移动求和(running sum)分解:

  • 首先,我们通过强制 的高 位全为零,把 约束为一个 位值。我们可以从分解中得到 :
  • 然后,我们约束 的第 位为零;换句话说,我们约束三位字 我们利用移动求和分解来得到

定义 。为了检查 我们使用 13 个十位查找(lookups),在其中我们约束查找的 移动求和输出在 时为

短有符号标量(Short signed scalar)

一个短有符号标量被见证为一个幅值(magnitude) 和一个符号(sign),使得

这用于 。我们想要计算 ,其中

各自已经被约束到 位(由于它们被用作 的输入)。

把幅值 分解为三位窗口,并对每个窗口进行范围约束,使用严格模式下的短范围分解(short range decomposition) gadget,其中

我们有两个额外的约束: 其中

加载定基(Load fixed base)

然后,我们为每个窗口预计算定基 的若干倍数。这采取窗口表(window table)的形式:,使得:

  • 对于前 (W-1) 行 :
  • 在最后一行 :

额外的 项让我们在 的情况下避免加上无穷远点(point at infinity)。我们通过在最后一个窗口中减去这些累加项来抵消它们,即我们减去

注:虽然 的偏移量朴素地看似乎就足够了,但它会在 时引入一个边界情形(edge case)。 在这种情况下,窗口表项求值为同一个点:

在定基标量乘中,我们使用不完全加法(incomplete addition)对每个窗口(除最后一个之外)的 的倍数求和。 由于倍点(point doubling)情形不被不完全加法处理,我们通过使用 的偏移量来避免它。

对于每个定基倍数窗口 :

  • 定义一个 Lagrange 插值多项式(interpolation polynomial),它把 映射到倍数 坐标,即
  • 找到一个值 ,使得 在域中是一个平方数 ,但错误符号的 坐标 不产生平方数。

对全部 个窗口重复此操作,我们最终得到:

  • 一个 的表 ,为每个窗口存储 个对 坐标进行插值的系数。每个 坐标插值多项式将具有如下形式 其中 ,且 各次幂的系数;以及
  • 一个长度为 的数组 ,存储各个

每当我们在电路中进行定基标量乘时,就把这些预计算值加载到固定列(fixed columns)中。

定基标量乘(Fixed-base scalar multiplication)

给定一个分解后的标量 和一个定基 ,我们如下计算 :

  1. 对于标量分解中的每个 ,见证 坐标和 坐标
  2. 检查 在曲线上:
  3. 见证 ,使得
  4. 对于除最后一个之外的所有窗口,使用不完全加法(incomplete addition)对各个 求和,得到
  5. 对于最后一个窗口,使用完全加法(complete addition) 并返回最终结果。

注:最后一步需要完全加法,以便正确地把 映射到无穷远点的表示 ;并且也用于处理最后一步是倍点的一个极端情形(corner case)。

约束(Constraints):

其中 (来自 Pallas 曲线方程)。

有符号短指数(Signed short exponent)

回想一下,有符号短指数被见证为一个 位幅值 和一个符号 使用上述算法,我们计算 。然后,为了得到最终结果 我们使用 进行条件取负(conditionally negate)。

约束(Constraints):

布局(Layout)

注:这不包括使用完全加法(complete addition)的最后一行。在实现中这是在一个不同的 region 中分配的。