1、哈希函数(Hash Function)与Poseidon
在密码学中,哈希函数是一种将任意大小的数据映射到固定大小的输出的函数。哈希函数的输出称为哈希值或哈希码。哈希函数具有单向性和抗碰撞性。一些常见的哈希函数包括 MD5、SHA-1、SHA-256 和 SHA-3。例如,假设您要验证一个文件的完整性。您可以使用哈希函数来计算该文件的哈希值。然后,您可以将该哈希值与文件的预期哈希值进行比较。如果两个哈希值相匹配,则可以确信文件没有被篡改。
在零知识证明领域中,使用抗碰撞Hash函数能够有效消除对可信任设置或椭圆曲线运算的需要,使Hash函数成为零知识证明系统中不可或缺的一部分。哈希函数在零知识证明系统中的发展过程可以总结为以下几个阶段:
•第一阶段:通用哈希函数
在零知识证明的早期阶段,主要使用通用哈希函数,例如 SHA-256 和 MD5。这些哈希函数被设计用于各种应用,包括数字签名和消息认证。然而,它们并不一定适合零知识证明系统的特定需求。
•第二阶段:基于 Merkle 树的承诺方案
随着零知识证明技术的发展,许多零知识证明系统开始开发专门用于零知识证明的哈希函数。一个重要的标志是基于 Merkle 树的承诺方案。Merkle 树是一种二叉树,它使用哈希函数来构建。Merkle 树可以用来构建多项式承诺,承诺值是 Merkle 树的根哈希值。基于 Merkle 树的承诺方案的优点是简单易懂,并且可以被有效地实现。然而,这些方案的安全性通常依赖于随机预言机模型,而随机预言机模型在现实世界中是不存在的。因此,基于 Merkle 树的承诺方案的安全性在理论上存在争议。
•第三阶段:基于专用哈希函数
随着更加高效的多项式承诺方案的出现和发展,出现了专门用于零知识证明的哈希函数,例如 Poseidon和Rescue-Prime。这些专用哈希函数针对零知识证明系统的特定需求进行了优化,例如高效的计算和抵抗特定类型的攻击。
在Plonky2中就使用了Poseidon哈希函数作为多项式承诺的节点生成方式。Poseidon采用 sponge/squeeze 结构,该结构吸纳万物并生成固定大小的输出,内部有一个状态 ,初始状态为0,状态S. 可分为外部状态和内部状态。