Polygon zkEVM哈希状态机——Keccak-256和Poseidon
Posted mutourend
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Polygon zkEVM哈希状态机——Keccak-256和Poseidon相关的知识,希望对你有一定的参考价值。
1. 引言
前序博客有:
- Polygon zkEVM Arithmetic状态机
- Polygon zkEVM中的常量多项式
- Polygon zkEVM Binary状态机
- Polygon zkEVM Memory状态机
- Polygon zkEVM Memory Align状态机
Polygon zkEVM中主要使用了2类哈希函数:
- 1)Keccak-256哈希函数:可参看SHA-3 and The Hash Function
Keccak。【因EVM Storage使用Keccak-256哈希函数来构建Merkle树。】 - 2)Poseidon哈希函数:可参看POSEIDON: A New Hash Function for Zero-Knowledge Proof Systems 学习笔记。【zkEVM内部使用Poseidon哈希函数,以降低证明复杂度。】
这2种哈希函数都采用了Sponge construction。
所谓Sponge construction,是一种迭代结构,用于构建函数:
F
:
Z
∗
→
Z
l
F: \\mathbbZ^* \\to \\mathbbZ^l
F:Z∗→Zl
即基于可变长度的input,得到特定长度的输出。核心为a fixed-length permutation:
f
:
Z
b
→
Z
b
f: \\mathbbZ^b \\to \\mathbbZ^b
f:Zb→Zb
该permutation对a fixed number
b
b
b of bits进行运算。
其中
b
b
b称为width,
f
f
f函数所持续转换的
b
b
b bits数组称为state。可将该state array切分为2段,分别具有
r
r
r bits和
c
c
cbits,其中
r
r
r 称为bitrate(或rate),
c
c
c称为capacity。这样切分的目的后续将介绍。
Sponge construction的基本工作原理为:
- 1)初始化阶段:首先,需根据可逆填充规则对输入字符串进行填充,使得填充后的字符串长度可被 r r r整除,然后将输入字符串按 r r r bits切分为多个blocks。同时,将state中的 b b b bits都初始化为0。
- 2)Absorbing阶段:在该阶段,将input blocks的 r r r bits 与 state中的前 r r r bits 进行异或操作,与permutation函数 f f f的应用交错进行。直到处理完所有的 r r r bits input blocks。注意,最终的 c c c bits对应为不从外部吸收任何输入的capacity值。
- 3)Squeezing阶段:在该阶段中,state的前 r r r bits作为output blocks,与permutation函数 f f f的应用交错执行。output blocks的数量由用户选择。注意,最终的 c c c bits对应为capacity值,在该阶段永远不输出。实际上,若输出值大于指定的长度,可简单裁剪即可。
具体如下图所示:
要唯一确定Sponge construction所需的参数有:
- 1)fixed-length permutation f f f;
- 2)填充规则pad;
- 3)rate value r r r。
2. Polygon zkEVM中的Keccak-256哈希函数
EVM所使用的KECCAK-256哈希函数,采用了KECCAK[512] sponge construction。
首先定义KECCAK[c] sponge construction:【
c
c
c表示capacity】
- width为: 1600 1600 1600 bits
- rate为: 1600 − c 1600-c 1600−c bits
对于KECCAK[512],rate为1088 bits(等价为136 bytes),capacity为512 bits(等价为64 bytes)。
根据 NIST SHA-3 Stanard中:
可知,KECCAK[c]使用的permutation为KECCAK-p[1600,24]。
自此,已完成了对rate
r
r
r 和 fixed-length permutation
f
f
f的定义。为完整定义具体的哈希函数,最后需指定相应的填充规则。
KECCAK[c]使用的填充规则为pad10*1:
若定义
j
=
(
−
m
−
2
)
m
o
d
r
j=(-m-2)\\mod r
j=(−m−2)modr
其中
m
m
m为原始input的bit length,然后对原始input进行填充:
P
=
1
∣
∣
0
j
∣
∣
1.
P = 1 \\mid\\mid 0^j \\mid\\mid 1.
P=1∣∣0j∣∣1.
自此,已知input bit string M M M 和 output length d d d,KECCAK[c](M,d)会根据之前的sponge construction描述,生成 d d d bit string。
注意,Polygon zkEVM的KECCAK-256并不遵循FIPS-202标准(即并不遵循SHA-3标准)。根据NIST规范,SHA3 padding应为:
SHA3-256
(
M
)
=
KECCAK
[
512
]
(
M
∣
∣
01
,
256
)
.
\\textSHA3-256(M) = \\textKECCAK[512](M \\mid\\mid 01, 256).
SHA3-256(M)=KECCAK[512](M∣∣01,256).
差别在于,原始的KECCAK规范中并没有在 原始消息之后额外附加01 bits。
Polygon zkEVM中实现的KECCAK-256哈希函数约束见zkevm-proverjs/pil/:
- padding_kk.pil
- padding_kkbit.pil
- norm_gate9.pil
- keccak.pil
- nine2one.pil
相关测试用例见:
- zkevm-proverjs/test/sm/sm_padding_kk_test.js
- zkevm-proverjs/test/counters/keccak.js
2.1 KECCAK-256中的pad10*1填充约束
根据 NIST SHA-3 Stanard 可知,pad10*1为KECCAK的multi-rate填充规则,表示填充内容为一个1、后续为一组0(可能也没有0)、然后最后一个1。
pad10*1 填充算法为:【最少填充2个bit(即开始一个1和最后一个1);最多填充
x
+
1
x+1
x+1个bit。】
Polygon zkEVM中实现的pad10*1约束见zkevm-proverjs/pil/:
- padding_kk.pil
3. Polygon zkEVM中的Poseidon哈希函数
设计Poseidon哈希函数(详细见Poseidon哈希函数论文)的目的在于减轻ZKP prover和verifier的计算复杂度。之前定义的KECCAK-256哈希函数由于其不是针对ZKP有限域设计的,需要用大的circuit才能表示。(KECCAK-256在二进制域中运行良好,但在约束设计时将引入大量复杂度。)为此,zkEVM将Poseidon哈希函数作为其内部主要哈希函数。
Polygon zkEVM中使用的Poseidon哈希函数:
- 1)基于的域 F p \\mathbbF_p Fp,其中 p = 2 64 − 2 32 + 1 p=2^64-2^32+1 p=264−232+1。
- 2)Poseidon permutation的state width为8个field elements。(注意,此时改为按完整的field element数,而不是bit数来表示。)
- 3)相应的capacity为4个field element。
- 4)Poseidon S-box层使用7-power S-Box,即:
S B ( x ) = x 7 , SB(x) = x^7, SB(x)=x7, - 5)同时,需指定permutation的full round数和partial round数为:
R F = 8 (number of full rounds) , R P = 22 (number of partial rounds) R_F = 8 \\text (number of full rounds) , \\quad R_P = 22 \\text (number of partial rounds) RF=8 (number of full rounds) ,RP=22 (number of partial rounds) - 6)实际实现仅需要一次squeezing迭代,state的前4个field element作为ouput(近似为256-bits,但不会超过256-bits)。
- 7)而Round Constants和MDS matrix可由以上参数完全确定。
参考资料
附录:Polygon Hermez 2.0 zkEVM系列博客
- ZK-Rollups工作原理
- Polygon zkEVM——Hermez 2.0简介
- Polygon zkEVM网络节点
- Polygon zkEVM 基本概念
- Polygon zkEVM Prover
- Polygon zkEVM工具——PIL和CIRCOM
- Polygon zkEVM节点代码解析
- Polygon zkEVM的pil-stark Fibonacci状态机初体验
- Polygon zkEVM的pil-stark Fibonacci状态机代码解析
- Polygon zkEVM PIL编译器——pilcom 代码解析
- Polygon zkEVM Arithmetic状态机
- Polygon zkEVM中的常量多项式
- Polygon zkEVM Binary状态机
- Polygon zkEVM Memory状态机
- Polygon zkEVM Memory Align状态机
以上是关于Polygon zkEVM哈希状态机——Keccak-256和Poseidon的主要内容,如果未能解决你的问题,请参考以下文章