Poseidon 哈希是什么:为零知识证明电路设计的域原生函数 图 1
Poseidon 哈希是什么:为零知识证明电路设计的域原生函数 · 图 1

写零知识程序的人常抱怨一件事:链上验一笔转账逻辑很省,只要在电路里算一次 SHA-256,成本就爆炸。Poseidon 就是为消除这种错位而生的哈希函数——2019 年由 Grassi、Khovratovich、Rechberger 等人发表在密码学论文库里,它的口号可以概括成一句:在证明系统干活的那个域里,原地做哈希。本文讲清楚“域原生”到底解决什么问题、Poseidon 的轮结构、它和老前辈 Pedersen 的分工,以及实际部署中要留的坑。

为什么 ZK 电路里的哈希特别贵

零知识证明(Groth16、PLONK 一类 SNARK 系统)把程序翻译成有限素数域上的约束方程组。在这个世界里,加法和乘法各是一个约束,便宜;而 SHA-256 是为比特设计的——按位异或、与、循环移位,每一步都要先用“位分解”约束把域元素拆成比特,再逐位模拟逻辑门。论文给的量级感受:一个 SHA-256 压缩函数即便用高度优化的 gadget 也要两万条约束上下,比一次域乘法贵出几个数量级。Merkle 树验证恰恰要在电路里反复算哈希,于是“证明我知道路径上的叶子”这件本该很简单的事,被哈希函数卡成全场最贵环节。

Poseidon 哈希是什么:为零知识证明电路设计的域原生函数 图 2
Poseidon 哈希是什么:为零知识证明电路设计的域原生函数 · 图 2

Poseidon 的答案:直接在大素数域上跑置换

Poseidon 是一个迭代置换结构(sponge 模式吸收-挤出):状态是若干个大素数域元素,每轮做三件事——给状态每个元素算一个 S 盒(通常取 x 的 5 次幂这种在域上便宜又非线性的映射,分全轮和部分轮)、用固定矩阵做线性混合、再混入轮常数。全程只有域加法和少量乘法,没有位操作。论文报告的核心数字:相比 Pedersen 哈希,每条消息位最多能省到八分之一的约束数;相比在电路里模拟 SHA-256 更是数量级差距。代价是它不像 SHA-256 那样身经百战:安全性高度依赖轮数和常数的选择,后续密码分析多次促成参数修订,它的论文页面也一直挂着“按后续分析更新”的说明——用它的参数时必须对齐当期建议。

和 Pedersen 承诺的关系

Poseidon 常被和 Pedersen 放在一起比较,两者都为“在电路里验承诺”服务,但机制不同。Pedersen 承诺本质是椭圆曲线点的加法组合:把域元素映射成曲线点的线性组合,天然适合加法同态的场景(金额验算、承诺总和证明)。Poseidon 则是把哈希定义在标量域上的置换,输出直接就是一个域元素,可以继续喂给下一个约束。实践中两者常搭档:Poseidon 负责树结构(Merkle 树每一层算一次域置换),Pedersen 负责金额侧的同态验算,各挡一半成本。

谁在用它

以 Poseidon 做 Merkle 树哈希的公开项目不少:以太坊扩容生态里多个 zkRollup 的账户与状态树证明用它;iden3 体系(链上身份)和多个匿名凭证标准把 Poseidon 树写进规范;Circom、Noir 等电路语言都提供它的优化实现。需要注意的是,不同实现选择的域不一样(有的针对 254 位的黄金参数域,有的针对曲线标量域),换域就是换参数集——把 A 链的参数抄到 B 链的曲线上是真实发生过的事故类型。

一条直觉算术

在一门典型的约束计数口径里,一次 Poseidon 置换(8 个全轮加 50 多个部分轮这类常见参数)大约花两三百个约束;电路里模拟一次 SHA-256 压缩则要两万条约束上下。做 10 亿片叶子的 Merkle 证明确实能像论文演示的那样压进一秒内——差距不是百分比,是乘法因子的来源。

快速问答

问:Poseidon 能替换 SHA-256 当通用哈希吗? 答:不建议。它的抗碰撞性论证绑定特定域和轮参数,通用场景(签名前哈希、文件指纹)仍该用久经考验的标准函数。

问:域元素超出曲线标量域范围怎么办? 答:这正是踩坑点之一:域元素必须小于模数,输入比特要先做范围证明或拆包,设计时就要把“哪些字节进哪些槽”定死。

问:论文更新的参数影响老项目吗? 答:论文的更新不改已部署用例的轮数,但如果你在自己项目里裸抄旧参数,就应该对齐当期分析建议——参数要跟着当期密码学分析走。

风险提示

零知识证明系统的安全依赖参数选择与实现正确性,参数过时的承诺或证明可能被伪造,进而影响依赖其验证的资产。涉及具体协议实现时,请以该项目官方文档与当期密码学分析为准。本文仅为机制科普,不构成投资或项目使用建议。