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/sinsemilla/merkle-crh.html

MerkleCRH

消息分解(decomposition)

被用在 哈希函数中。 的输入是:

其中:

  • ,
  • ,
  • ,

其中 允许是 的非规范(non-canonical) 比特编码。

Sinsemilla 以 10 比特的整数倍进行操作,所以我们首先把消息分解(decomposing)成若干块(chunks):

然后我们把这些块重新组合(recompose)成若干 MessagePiece(消息片):

每个消息片都被 约束到其所声明的长度。此外, 作为域元素(field elements)被见证(witnessed),所以我们知道它们 是规范的(canonical)。然而,我们还需要额外的约束来确保这些块具有正确的比特长度(否则它们可能在分解中相互重叠,从而允许证明者(prover)见证出任意的 消息)。

其中一些约束可以用可复用的电路 gadget 来实现。我们定义一个由选择子(selector) 控制的自定义门(custom gate)来承载其余的约束。

比特长度约束

由 Sinsemilla 直接约束。我们用以下约束来约束其余的块:

,即 的下标为 1 的累加和(running sum)输出,被拷入门中。 已被 约束为 比特,并且恰好就是 。我们利用 来恢复块 :

,即 的下标为 1 的累加和输出,被拷入门中。 已被 约束为 比特。我们在该门之外见证子片(subpieces),并各自约束它们为 比特。在门内,我们检查 我们还利用 恢复子片 :

约束

其中 是一个 短查表范围检查(short lookup range check)

分解约束

至此我们已经导出或见证了每个子片,并对每个子片做了范围约束:

  • ( 比特),导出为 ;
  • ( 比特),等于 ;
  • ( 比特),导出为 ;
  • ( 比特)在门外被见证并约束;
  • ( 比特)在门外被见证并约束;
  • ( 比特)在门外被见证并约束。
  • 被约束为等于

现在我们可以用它们来重建原始的域元素输入:

区域布局(Region layout)

电路组件

Orchard 电路横跨 个建议列(advice columns),而 芯片(chip)只使用 个建议列。我们把路径哈希(path hashing)均匀地分摊到两个 芯片上,以便更好地利用可用的电路面积。由于上一层哈希的输出会被拷入下一层哈希,即使在从一个芯片转到另一个芯片时,我们也能保持连续性。