Anemoi hash:一种SNARK-friendly的哈希函数

随着zk的兴起,出现了一大批zk友好且面向算术化(Arithmetization-Oriented)的哈希函数,如MiMC-Hash, Rescue–Prime, Poseidon等等,本文要介绍的Anemoi是今年新出的一种zk友好且面向算术化的哈希函数,与其他哈希函数相比,Anemoi具有以下特点:

  • 可以被用于Groth16, Plonk等证明系统中

  • 包含对特定应用的优化,如merkle tree的证明

  • 性能优越,参见下表

    Anemoi hash:一种SNARK-friendly的哈希函数_第1张图片

1. Flystel Structure

Flystel结构是butterfly和Feistel的结合:butterfly + Feistel = Flystel

Anemoi hash:一种SNARK-friendly的哈希函数_第2张图片

图(a)是开放的Flystel结构,图(b)是封闭的Flystel结构,图(a)通过一次旋转即可得到图(b),这样做的好处是消除了逆运算。

在实际运算中Flystel一般定义在 F q F_q Fq中,并且 Q r ( X ) = β x 2 + γ Q_r(X) = \beta x^2 +\gamma Qr(X)=βx2+γ Q δ ( X ) = β x 2 + δ Q_{\delta}(X) = \beta x^2 +\delta Qδ(X)=βx2+δ E ( X ) = X α E(X) = X^{\alpha} E(X)=Xα

所以对于封闭的Flystel结构,我们有下面等式成立
u = ( y − v ) α + β v 2 + δ x = ( y − v ) α + β y 2 + γ u = (y-v)^{\alpha} + \beta v^2 + \delta \\ x = (y-v)^{\alpha} + \beta y^2 + \gamma u=(yv)α+βv2+δx=(yv)α+βy2+γ

2. Anemoi

Anemoi每轮主要由 constant addition 、linear layer M和 S-box layer这三步构成:

Anemoi hash:一种SNARK-friendly的哈希函数_第3张图片

  • 如果 l l l很小,那么域则需要很大,一般用于基于配对的证明系统,如groth16,plonk等

  • 如果 l l l很大,则域不需要很大,一般用于基于FRI的证明系统

    我们知道
    u = ( y − v ) α + β v 2 + δ x = ( y − v ) α + β y 2 + γ u = (y-v)^{\alpha} + \beta v^2 + \delta \\ x = (y-v)^{\alpha} + \beta y^2 + \gamma u=(yv)α+βv2+δx=(yv)α+βy2+γ
    一般 β \beta β取生成元 g g g γ \gamma γ取零, δ \delta δ g − 1 g^{-1} g1,则
    u = ( y − v ) α + g v 2 + g − 1 x = ( y − v ) α + g y 2 u = (y-v)^{\alpha} + g v^2 + g^{-1} \\ x = (y-v)^{\alpha} + g y^2 u=(yv)α+gv2+g1x=(yv)α+gy2
    一式减二式,可得
    u − x = g ( v 2 − y 2 ) = > u = x + g v 2 − g y 2 + g − 1 u -x = g(v^2 -y^2) => u = x + gv^2 - gy^2 + g ^{-1} ux=g(v2y2)=>u=x+gv2gy2+g1
    以及由二式,可得
    x − g y 2 = ( y − v ) α = > v = y − ( x − g y 2 ) α − 1 x-gy^2 = (y-v)^{\alpha} => v = y -(x-gy^2)^{\alpha^{-1}} xgy2=(yv)α=>v=y(xgy2)α1
    从而可得输出 u , v u,v u,v,与上图中的S-box输出对应
    v = y − ( x − g y 2 ) α − 1 u = x + g v 2 − g y 2 + g − 1 v = y -(x-gy^2)^{\alpha^{-1}} \\ u = x + gv^2 - gy^2 + g ^{-1} v=y(xgy2)α1u=x+gv2gy2+g1

2.1 Diffusion Layer M.

Anemoi hash:一种SNARK-friendly的哈希函数_第4张图片

l ∈ { 1 , 2 , 3 , 4 } l \in \{1,2,3,4\} l{1,2,3,4}时,我们可以使用矩阵 M x l M_x^l Mxl来表达,如
M x 1 = M x 2 = [ 1 g g g 2 + 1 ] M_x^1=M_x^2 = \left[ \begin{array}{cc|r} 1 & g\\g & g^2+1 \end{array} \right] Mx1=Mx2=[1ggg2+1]
输出等于
[ x 0 , x 1 ] ⋅ M x 2 [x_0,x_1] \cdot M_x^2 [x0,x1]Mx2

2.2 S-box Layer S

令H是Flystel结构,则
S ( X , Y ) = ( H ( x o , y o ) , . . . , H ( x l − 1 , y l − 1 ) ) S(X,Y) = (H(x_o,y_o),...,H(x_{l-1},y_{l-1})) S(X,Y)=(H(xo,yo),...,H(xl1,yl1))

2.3 完整的Anemoi

遵循海绵结构构造
Anemoi hash:一种SNARK-friendly的哈希函数_第5张图片

3. R1CS 约束

我们使用封闭的Flystel结构,得到如下S-Box验证等式
( y − v ) α + β v 2 + δ − u = 0 ( y − v ) α + β y 2 + γ − x = 0 (y-v)^{\alpha} + \beta v^2 + \delta -u = 0\\ (y-v)^{\alpha} + \beta y^2 + \gamma -x = 0 (yv)α+βv2+δu=0(yv)α+βy2+γx=0

参考

  1. https://eprint.iacr.org/2022/840.pdf
  2. https://github.com/anemoi-hash/anemoi-hash
  3. https://github.com/FindoraNetwork/noah/blob/develop/crypto/src/basic/anemoi_jive.rs

你可能感兴趣的:(零知识证明(ZKP),哈希算法,SNARK-friendly,Anemoi)