随着zk的兴起,出现了一大批zk友好且面向算术化(Arithmetization-Oriented)的哈希函数,如MiMC-Hash, Rescue–Prime, Poseidon等等,本文要介绍的Anemoi是今年新出的一种zk友好且面向算术化的哈希函数,与其他哈希函数相比,Anemoi具有以下特点:
可以被用于Groth16, Plonk等证明系统中
包含对特定应用的优化,如merkle tree的证明
性能优越,参见下表
Flystel结构是butterfly和Feistel的结合:butterfly + Feistel = Flystel
图(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=(y−v)α+βv2+δx=(y−v)α+βy2+γ
Anemoi每轮主要由 constant addition 、linear layer M和 S-box layer这三步构成:
如果 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=(y−v)α+βv2+δx=(y−v)α+βy2+γ
一般
β
\beta
β取生成元
g
g
g,
γ
\gamma
γ取零,
δ
\delta
δ取
g
−
1
g^{-1}
g−1,则
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=(y−v)α+gv2+g−1x=(y−v)α+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}
u−x=g(v2−y2)=>u=x+gv2−gy2+g−1
以及由二式,可得
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}}
x−gy2=(y−v)α=>v=y−(x−gy2)α−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−(x−gy2)α−1u=x+gv2−gy2+g−1
当
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[ 1ggg2+1
输出等于
[
x
0
,
x
1
]
⋅
M
x
2
[x_0,x_1] \cdot M_x^2
[x0,x1]⋅Mx2
令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(xl−1,yl−1))
遵循海绵结构构造
我们使用封闭的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
(y−v)α+βv2+δ−u=0(y−v)α+βy2+γ−x=0