ZKP中的哈希函数

news2024/11/18 10:51:12

1. 引言

后续博客:

  • 如何选择ZK-friendly 哈希函数?

当暴露在ZK空间中时,对于普通crypto工程师来说,通常只需很少的时间就可以偶然发现一些外来的哈希函数——很可能是Poseidon。本文,将介绍ZK中高效哈希函数的历史,并解释为何不简单地使用现有已标准化哈希函数SHA-2/3。

也可参考:

  • Dmitry Khovratovich——很多ZK-friendly哈希函数(包括Poseidon)的作者之一,在2022年10月的播客分享 Episode 250: What’s the Deal with Hash Functions?。

2. 为何需要Poseidon之类的哈希函数?

当前,许多ZK框架都基于Poseidon哈希函数实现,原因何在?

  • membership proofs和Merkle tree commitments 对许多ZK应用场景至关重要。这两种情况下:
    • 都需要使用Merkle tree来积累很多数据元素。
    • 并使用ZKP系统来证明叶子节点到root的path。
    • Merkle tree中每个节点的计算,正是基于某密码学哈希函数的哈希运算。

假设有Merkle tree中某叶子节点,并向使用SNARK或STARK证明其ownership。最终的ZK电路中包含多个哈希计算,直到到达该Merkle tree的root。随着Merkle tree的高度增加,生成proof的性能将高度依赖于所使用哈希函数的效率。这也是为何在ZK场景,没人用传统已标准化哈希函数(如SHA-256、SHA-3、Blake等)的原因。尽管这些传统已标准化哈希函数在现代CPU上运行非常快。

当前现状为:

  • 大多数现代ZKP系统都基于更大素数域运算——如Halo2的256-bit、Plonky2的64-bit、Plonky3的31-bit,其性能开销通常与电路中的乘法运算相关。
    • 对R1CS约束,通常仅关注乘法次数
    • Plonkish系统porver开销随trace width、trace depth、transition多项式degree而增加,即也取决于电路的乘法复杂度。

传统哈希函数,通常基于位运算,而不是基于素数域元素运算的。这有两个重要的含义:

  • 1)内部状态的哈希计算必须至少是256位的,在Plonkish表示中,这意味着large trace width,或large trace depth。
  • 2)需要在ZKP的原生素数域中模拟二进制运算,将:
    • 要求证明每个输入元素为a bit(即对每个bit证明 x ( x − 1 ) = 0 x(x-1)=0 x(x1)=0)。
    • 模拟AND/XOR,需要做乘法运算: x 1   a n d   x 2 = x 3 ⇒ x 1 ⋅ x 2 = x 3 x_1\ \mathsf{and}\ x_2=x_3 \Rightarrow x_1 \cdot x_2=x_3 x1 and x2=x3x1x2=x3 x 1   x o r   x 2 = x 3 ⇒ x 1 + x 2 – 2 ⋅ x 1 ⋅ x 2 = x 3 x_1\ \mathsf{xor}\ x_2=x_3 \Rightarrow x_1 + x_2 – 2\cdot x_1 \cdot x_2 = x_3 x1 xor x2=x3x1+x2–2x1x2=x3。这将导致大量的乘法运算,从而导致large trace,最终导致prover性能非常低效。

因此,研究人员开发了新的哈希函数,这些新的经过优化的哈希函数,可在ZK证明系统中高效运行。这些哈希函数定义为直接基于素数域运算,从而抵消了上述缺点。此外,引入了额外的技术来最小化ZK电路中的乘法次数。因此现代ZK友好哈希函数可 以由少于100次的乘法来构建(如2022年论文 Horst Meets Fluid-SPN: Griffin for Zero-Knowledge Applications)。与仅证明传统哈希函数输入为bits(忽略实际哈希计算)相比,这已经大大减少了乘法运算次数。

在这里插入图片描述

广义来说,新的哈希函数可分为三大类:

  • 1)Low-degree round functions 哈希函数:如MiMC、GMiMC、Poseidon、Poseidon2、Neptune。
  • 2)“Low-degree equivalent” round functions 哈希函数:如Rescue、Rescue-Prime、Anemoi、Griffin、Grendel。
  • 3)Lookup-based round functions 哈希函数:如Reinforced Concrete、Tip5、Monolith。

现有已标准化哈希函数SHA-2/3、Blake等,具有非常快的plain(电路外)哈希性能,但受限于其算术性质,在ZK电路内具有很高的开销。

  • MiMC为首个实用 Low-degree round functions 的哈希函数,基于MiMC方向,后来有了Poseidon——相比于传统哈希函数,实现了在ZK电路内的性能飞跃。
  • 后来,研究人员基于“Low-degree equivalent” round functions,进一步改进了电路内性能,从而有了Rescue、Rescue-Prime和Griffin。
    • ZK电路内,Griffin比Poseidon更便宜,但Griffin在电路外的哈希开销更昂贵。
  • 百万美元的问题是:能否得到与SHA-3或类似的速度,但仍能提高ZK电路内部开销的新哈希函数?
    事实上,这个问题是有答案的!答案是肯定的——当ZKP证明系统支持lookup argument时。
    • Lookup-based round functions 哈希函数【愿SHA-3速度与你同在】

3. Low-degree round functions 哈希函数

Low-degree round functions 哈希函数,可看成是初代ZK友好哈希函数,起源于MiMC。
很多哈希函数,都基于MiMC和GMiMC构建,如:

  • Poseidon
  • Poseidon2
  • Neptune

除依赖于 Low-degree round functions 之外,大多数通常都基于power map y = x d y=x^d y=xd 构建,其中 d d d 值取决于具体素数域, d d d值通常为 3 , 5 或 7 3,5或7 3,57

Low-degree round functions 哈希函数:

  • 每轮就有相对小数量的乘法运算次数
  • 需要很多轮,以确保安全

总体来说,比基于bits运算的标准化哈希函数(如SHA-2)性能要好得多,且在做密码学分析攻击时,分析起来也相对直接。

4. “Low-degree equivalent” round functions 哈希函数

“Low-degree equivalent” round functions 哈希函数,基于如下发现:

  • 在ZK电路中,不必直接对给定电路的约束系统进行建模。对不同的约束系统进行建模就足够了,当且仅当原始约束系统得到满足时,该约束系统才得到满足。

如:

  • 假设电路计算 y = x 1 / d y=x^{1/d} y=x1/d,可直接构建某约束来直接证明 y = x 1 / d y=x^{1/d} y=x1/d
  • 另一种方法是证明 y = x 1 / d y=x^{1/d} y=x1/d的等价表示—— y d = x y^d=x yd=x
  • d d d小,而素数域大时,则 1 / d 1/d 1/d是一个相当大的指数,需要进行多次乘法运算。但是, y d = x y^d=x yd=x为其equivalent constraint of low degree,适于在ZK电路中高效表示。

使用 y = x 1 / d y=x^{1/d} y=x1/d power map的设计:

  • 相同的安全性,需要的轮数更少
  • 相比于仅依赖Low-degree round functions 的哈希函数,通常在证明系统中具有更高效的表示。——这是重大利好,因为ZK友好哈希函数的设计目的之一,就是改进ZK电路内的性能。

但是“Low-degree equivalent” round functions 哈希函数 的这种改进是有代价的,当用于在电路外(将“电路外”,称为,plain)计算哈希时,必须直接计算 y = x 1 / d y=x^{1/d} y=x1/d,这比计算 y = x d y=x^{d} y=xd要慢得多。因此,基于“Low-degree equivalent” round functions 设计的哈希函数,其相对于,Low-degree round functions 哈希函数(如Poseidon),通常plain哈希性能要更慢。

遵循 “Low-degree equivalent” round functions 策略的哈希函数有:

  • Rescue
  • Rescue-Prime
  • Anemoi
  • Griffin
  • Grendel:采用Legendre symbol,具有更低效的构建。

5. Lookup-based round functions 哈希函数

Lookup-based round functions 哈希函数,为第三代且最新的一类哈希函数,其遵循现代ZKP系统发展趋势,使用lookup tables来让计算更便宜。主要在于如下发现:

  • 当基于大素数域运算时,可将域元素分解为更小的元素(如8-bit size),然后做table lookup,将结果组合回某域元素。

这种方法有多个优势:

  • 1)table lookup在电路外是快速的,(当ZKP证明系统支持lookup argument时)在ZK电路内也相对便宜。
  • 2)对应的安全性高——特别是应对algebraic attacks。因此仅需要少量轮数就行。
    • 缺点在于,底层的证明系统必须支持lookup arguments,从而支持Lookup-based round functions 类型的哈希函数。

遵循Lookup-based round functions的:

  • 首个哈希函数为:Reinforced Concrete:针对约256-bit大素数域做了高度优化。在电路外的性能相比其它ZK友好哈希函数要快得多,但相比于SHA-3来说仍然要慢得多。
  • Tip5:基于Reinforced Concrete思想,但针对的是Plonky2中所使用的特殊64-bit素数域,而构建的哈希函数。
  • Monolith:针对更通用的域(如同时适用于Plonky2的64-bit域,和Plonky3的31-bit域),为首个实现与SHA-3电路外性能相当的ZK友好哈希函数。

参考资料

[1] TACEO 2023年8月17日博客 What’s the deal with hash functions in Zero Knowledge?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252924.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么给数据库某个字段建立一个前缀索引

说明:SQL调优中重要的一个环节是建立索引,其中有一条是字段值过长字段应该建立前缀索引,即根据字段值的前几位建立索引,像数据库中的密码字段、UUID字段。 因为其随机性,其实根据前几位就可以锁定某一条记录了。前缀索…

css实现图片绕中心旋转,鼠标悬浮按钮炫酷展示

vue模板中代码 <div class"contentBox clearfix home"><div class"circle"><img class"in-circle" src"../../assets/img/in-circle.png" alt""><img class"out-circle" src"../../as…

python基于DETR(DEtection TRansformer)开发构建钢铁产业产品智能自动化检测识别系统

在前文中我们基于经典的YOLOv5开发构建了钢铁产业产品智能自动化检测识别系统&#xff0c;这里本文的主要目的是想要实践应用DETR这一端到端的检测模型来开发构建钢铁产业产品智能自动化检测识别系统。 DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检…

字符串转换成十进制整数

编程要求 输入一个以#结束的字符串&#xff0c;本题要求滤去所有的非十六进制字符&#xff08;不分大小写&#xff09;&#xff0c;组成一个新的表示十六进制数字的字符串&#xff0c;然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”&#xff0c;则…

vue2:组件中extends的使用

上一篇文章中我对mixin的使用进行了一个使用和测试,这里对extend进行一个使用,其实extend和mixin还是有区别的。 上一篇文章:vue2:mixin混入的使用-CSDN博客 不过也是看实际的业务场景,我们也可以使用extend完成和mixin几乎一摸一样的操作。 不废话,上代码 创建extendTest.…

MySQL表连接

文章目录 MySQL内外连接1.内连接2.外连接&#xff08;1&#xff09;左外连接&#xff08;2)右外连接 3.简单案例 MySQL内外连接 1.内连接 内连接的SQL如下&#xff1a; SELECT ... FROM t1 INNER JOIN t2 ON 连接条件 [INNER JOIN t3 ON 连接条件] ... AND 其他条件;说明一下…

vulnhub靶机Aragog-1.0.2

靶机下载&#xff1a;https://download.vulnhub.com/harrypotter/Aragog-1.0.2.ova 主机发现 目标133 端口扫描 端口服务扫描 漏洞扫描 去看web 就一个图片 直接目录扫描 有点东西一个一个看&#xff08;blog里面有东西&#xff09; 这里面直接能看到wordpress 直接用wpscan…

Go 语言之 Maps 详解:创建、遍历、操作和注意事项

Maps用于以键值对的形式存储数据值。Maps中的每个元素都是一个键值对。Maps是一个无序且可更改的集合&#xff0c;不允许重复。Maps的长度是其元素的数量。您可以使用 len() 函数来查找长度。Maps的默认值是 nil。Maps保存对底层哈希表的引用。 Go语言有多种方法来创建Maps。 …

VS中如何使用Halcon

使用Halcon的本质就是调用Halcon的库&#xff0c;其主要步骤有&#xff1a; 1、将Halcon代码导出为C的.cpp文件 2、获取.cpp文件中的action函数的函数体 3、添加Halcon的动态库和静态库 4、添加action函数需要的头文件 导出halcon中的代码 a&#xff09;导出代码 b&#x…

运行软件报错找不到vcruntime140_1.dll无法继续执行代码如何解决?-常见问题

关于vcruntime140_1.dll丢失的6个解决方法。在我们使用电脑的过程中&#xff0c;有时候会遇到一些错误提示&#xff0c;其中之一就是“vcruntime140_1.dll丢失”。那么&#xff0c;究竟什么是vcruntime140_1.dll文件呢&#xff1f;又是什么原因导致了它的丢失&#xff1f;接下来…

基于uniapp+vue微信小程序的健康饮食管理系统 907m6

设计这个微信小程序系统能使用户实现不需出门就可以在手机或电脑前进行网上查询美食信息、 运动视频等功能。 本系统由用户和管理员两大模块组成。用户界面显示在应用程序中&#xff0c;管理员界面显示在后台服务中&#xff0c;通过小程序端与服务端间进行数据交互与数据传输实…

微服务实战系列之Nginx(技巧篇)

前言 今天北京早晨竟然飘了一些“雪花”&#xff0c;定睛一看&#xff0c;似雪非雪&#xff0c;像泡沫球一样&#xff0c;原来那叫“霰”。 自然中&#xff0c;雨雪霜露雾&#xff0c;因为出场太频繁&#xff0c;认识门槛较低&#xff0c;自然不费吹灰之力&#xff0c;即可享受…

电脑技巧:电脑常见蓝屏、上不了网等故障及解决办法

目录 一、电脑蓝屏 常见原因1: 病毒木马 常见原因2: 安装了不兼容的软件 二、电脑不能上网 常见原因1: 新装系统无驱动 常见原因2: DNS服务器异常 常见原因3: 硬件问题 三、电脑没声音 常见原因1: 未安装驱动 常见原因2: 硬件故障 四、电脑屏幕不显示 常见原因1: 显…

【限流配电开关】TPS2001C

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评百大…

物联网AI 无线连接学习之蓝牙基础篇 协议的发展

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 蓝牙由来 “蓝牙”&#xff08;Bluetooth&#xff09;原是一位在10世纪统一丹麦的国王哈拉尔 (HaralBluetooth)&#xff0c;他将当时的瑞典、芬兰与丹麦统一起来。而将“蓝牙”与后来的无线通讯技术标准关联…

SpringBoot——配置及原理

优质博文&#xff1a;IT-BLOG-CN 一、Spring Boot全局配置文件 application.properties与application.yml配置文件的作用&#xff1a;可以覆盖SpringBoot配置的默认值。 ◀ YML&#xff08;is not a Markup Language&#xff1a;不仅仅是一个标记语言&#xff09;&#xff1…

plotneuralnet和netron结合绘制模型架构图

plotneuralnet和netron结合绘制模型架构图 一、plotneuralnet 本身的操作 模型结构图的可视化&#xff0c;能直观展示模型的结构以及各个模块之间的关系。最近借助plotneuralnet python库&#xff08;windows版&#xff09;绘制了一个网络结构图&#xff0c;有一些经验和心得…

【SpringCloud】设计原则之单一职责与服务拆分

一、设计原则之单一职责 设计原则很重要的一点就是简单&#xff0c;单一职责也就是所谓的专人干专事 一个单元&#xff08;一个类、函数或微服务&#xff09;应该有且只有一个职责 无论如何&#xff0c;一个微服务不应该包含多于一个的职责 职责单一的后果之一就是职责单…

产品经理和项目经理的区别在哪里?

在当今的商业环境中&#xff0c;产品经理和项目经理扮演着两个非常重要的角色。虽然他们都是组织成功的重要推动者&#xff0c;但他们的职责和所关注的角度却有着显著的不同。 1. 职责差异 产品经理负责一个或多个产品线&#xff0c;从产品的规划到开发、推出和市场表现。他们…

Java实现-数据结构 2.时间和空间复杂度

.如何衡量一个算法的好坏&#xff1a;时间复杂度和空间复杂度 算法效率分为时间效率和空间效率&#xff0c;时间效率称为时间复杂度&#xff0c;空间效率称为空间复杂度 时间复杂度 算法的时间复杂度是一个数学函数&#xff0c;它描述了算法的运行时间&#xff0c;一个算法执…