当今SNARKs全景
1. 引言
前序博客有:
- ZKP历史总览
 - SNARK原理示例
 - SNARK性能及安全——Prover篇
 - SNARK性能及安全——Verifier篇
 - Transparent 且 Post-quantum zkSNARKs
 - SNARK Design
 - Rollup项目的SNARK景观
 
SNARKs因:
- proof size
 - 证明时长
 - 验证时长
 - 密码学信任假设
 - 是否需要trusted setup
 
等而各不相同。从广义上讲,实际所用证明系统可分为三大类:
- Pairing-based SNARKs:必须基于pairing曲线构建,需要可信设置,是人们通常所认为的“SNARKs”。
 - Hash-based SNARKs(或,Code-based SNARKs):不需要基于曲线构建,无需可信设置,且具有合理的后量子安全性,是人们通常所说的“STARKs”。
 - Non-Pairing Elliptic curve-based SNARKs:可基于非paiirng曲线构建,且无需可信设置,常见的如Bulletproofs和Folding schemes。
 
1.1 Pairing-based SNARKs
Pairing-based SNARKs包括:
- Plonk
 - Marlin
 - Groth16
 
等证明系统,如果人们熟悉 ZK,大多数人会想到 Groth16 证明系统。
这些Pairing-based SNARKs的特点为:
- proof size非常小,且大小恒定
 - 验证速度非常快
 - 但证明速度通常较慢。
 
这是因为Pairing-based SNARKs需要:
- 在大素数域上工作,这很慢,
 - 而且需要使用配对友好的椭圆曲线。
 
由于Pairing-based SNARKs使用椭圆曲线,因此:
- 其无法抵御量子攻击。
 
值得注意的是,并非所有可信设置 SNARK 都具有相同类型的可信设置:
- 1)Groth16 要求每个电路都有一个可信设置,
 - 2)而 Plonk、Marlin 和其他基于 KZG 的证明系统可以对所有有限大小的电路使用单个可信设置。 
- 这种“universal 通用”可信设置也是可更新的: 
- 给定一个可信设置,任何人都可以稍后向可信设置添加随机性。
 - 这对于 Groth16 来说是不可能的,因为Groth16 要求每个电路都有一个新设置。
 
 
 - 这种“universal 通用”可信设置也是可更新的: 
 
1.2 Hash-based SNARKs(或,Code-based SNARKs)
Hash-based SNARKs(或,Code-based SNARKs)中的典型代表有:
- STARKs
 - Plonky2:带预处理的FRI-based证明系统
 
Hash-based SNARKs(或,Code-based SNARKs)证明系统:
- 1)通常具有出色的prover性能, 
- 尤其是当其使用具有特殊结构的小域时,如Goldilocks、Babybear或Mersenne 31,
 
 - 2)但proof size要大得多。 
- 具体而言,FRI-based proof 可比 Groth16 proof 大 100 到 1000 倍(200 字节 vs. 50-200kB)。
 - 其他基于纠错码的证明系统——如Bininus(其使用Brakedown PCS而不是 FRI PCS)的proof可能更大或可能更小——若可借助STIR等类似技术,则可实现更小的proof。
 
 - 3)不需要可信设置,
 - 4)且在使用合适的哈希函数实例化时具有抗量子性。
 - 5)其安全性仅依赖于底层哈希函数的安全性。 
- 然而,与基于椭圆曲线的 SNARKs 相比,FRI-based证明系统的安全性提供了更多可调的自由度,这使得分析其安全性更加复杂。
 
 
大多数最先进的大型电路证明系统都针对证明时长进行了优化,因此使用FRI-based证明系统。但是,当希望在区块链上验证这些证明时,即使在以太坊上,对于纯 STARK proof 来说,这也很昂贵。因此,大多数已部署的系统将 STARK proof包装在pairing-based SNARK 中,如 Groth16 或 fflonk(Plonk 的变体)。从而提供了两种方案的主要优点:
- 非常快的prover和非常小的proof,
 - 但牺牲了量子抗性并需要可信的设置。
 - 这也是“proof recursion递归证明”这一非常强大想法的示例: 
- 通过在另一个证明中验证证明,可以将更大的证明或可能将许多更大的证明压缩为较小的证明。
 
 
1.3 Non-Pairing Elliptic curve-based SNARKs
Non-Pairing Elliptic curve-based SNARKs中包括:
- Bulletproofs
 - Folding Schemes
 
其中Bulletproofs:
- 具有 concretely small proofs,
 - 证明时长与Pairing-based SNARKs 相当,
 - 且没有可信设置。
 - 但其验证复杂性非常差: 
- 验证Bulletproofs proof所需的时间与构建该proof所需的时间成正比。
 - 这意味着Bulletproofs-based协议仅限于像范围证明这样的小电路,更根本的是,这意味着人们无法有效地、递归地用一个Bulletproofs来验证另一个Bulletproofs——因为验证Bulletproofs的电路将比被证明的原始电路更大!
 
 
Halo改变了这一现状:
- 展示了如何以递归方式“accumulate 积累” Bulletproofs,而无需以递归方式验证整个 Bulletproofs。
 
这一系列工作成果颇丰,最终催生出各种folding方案,如:
- Nova
 - HyperNova
 - ProtoStar
 - ProtoGalaxy等等(folding方案有很多)。
 
与folding方案结合使用时,人们可以使用 Bulletproofs 构建具有小证明、无可信设置和相当快prover的 SNARKs。
基于folding的证明系统能否与小域 FRI 相媲美仍是一个悬而未决的问题。最近的一些工作(如Benedikt Bunz ¨等人2024年论文Accumulation without Homomorphism)实际上试图统一folding和 FRI,但仅对小深度递归有效。
2. Sumcheck 和 GKR
从历史上看,大多数 SNARKs 都使用单变量多项式将算术电路编码为 IOP。
- 这部分是由于底层多项式承诺方案(特别是 FRI 和 KZG)的结构,也由于该方法相对简单。
 - 在基于单变量多项式的SNARKs方案中,证明者必须计算“商多项式”来证明该单变量方程得到满足。 
- 商多项式的有效计算需要具有超线性运行时间的快速傅里叶变换 (FFT), O ( n log  n ) O(n\log n) O(nlogn),并且非常昂贵。 
- 特别是,当使用大域时,FFT 计算需要大量内存。这对于快速prover来说是一个主要瓶颈。
 
 
 - 商多项式的有效计算需要具有超线性运行时间的快速傅里叶变换 (FFT), O ( n log  n ) O(n\log n) O(nlogn),并且非常昂贵。 
 
最近,人们开始使用一种称为“Sumcheck协议”的替代协议。sumcheck协议最初于 1992 年作为纯理论成果发表(见1992年论文《Algebraic Methods for Interactive Proof Systems》),现在sumcheck协议,重新成为单变量 SNARKs 的主要痛点之一的解决方案:
- 不再需要计算商多项式。
 - 相反,prover使用多线性多项式对witness进行编码,并与verifier进行 O ( log  n ) O(\log n) O(logn)轮交互以“fold”(注意:与“folding方案”中的“fold”不同,更像 Bulletproofs 和 FRI中的“fold”)这些多项式。 
- 这意味着,其它条件相同的情况下,sumcheck-based proof 通常比单变量proof更大,但可以在线性时间内证明,且内存要求更低。
 
 
一些sumcheck-based SNARKs 包括:
- Spartan
 - HyperPlonk
 - Honk
 
从某种意义上说,sumcheck协议一直都隐藏在人们的视线中。
- Bulletproofs 所基于的inner product argument与sumcheck协议具有相同的基本结构。
 - 事实上,这可以变得严格,详情见Jonathan Bootle等人2021年论文Sumcheck Arguments and their Applications。
 
这意味着人们可以非常有效地将inner product argument的结构与sumcheck-based SNARKs 结合使用。FRI 也是如此,正如最近在 BaseFold 中观察到的那样。
最近,GKR协议也引起了applied ZK 社区的新兴趣。
- GKR 协议以 sumcheck 协议为基础,通过“layering 分层”不同的 sumcheck 实例。 
- 这限制了可以应用 GKR 的电路类型,但值得注意的是,其可完全避免对中间层进行commit。 
- 回想一下,承诺,特别是对于elliptic curve-based SNARKs,是证明中最昂贵的部分。
 
 - 权衡是:verifier必须与电路中的层数成比例地完成工作,对于许多类型的电路,verifier最终会有 O ( log  2 n ) O(\log^2 n) O(log2n)的总工作量。
 
 - 这限制了可以应用 GKR 的电路类型,但值得注意的是,其可完全避免对中间层进行commit。 
 
通过改变用于实例化 GKR 的sumcheck类型,已经出现了一些有希望的新研究成果来微调这种权衡,如Benedikt B¨unz和Jessica Chen 2024年论文《Proofs for Deep Thought: Accumulation for large memories and deterministic computations》。
3. Lookup Arguments
传统上,SNARKs 将要证明的陈述编码为算术电路中的加法和乘法“门”网络。
- 从技术意义上讲,这已经足够了,但并不总是很有效。 
- 如,若想证明 x x x位于某个范围内,可能首先需要将该值拆分成位,检查每个位是否有效,然后检查合并这些位是否得到原始值。
 
 
若能简单地构造一组有效值并检查 x x x是这些值之一,则要简单得多。
- 这正是Lookup Arguments所允许的:在某个表中查找一个值。
 
事实证明,查找表是一种非常强大的原语,早期计算机广泛使用。Lookup Arguments 非常强大,甚至可将其看成是一种“通用原语”,因为人们可仅使用查找表来实现 SNARKs——被称为“lookup singularity查找奇点”。虽然仅使用查找的 SNARKs 现如今可能效率不高,但Lookup Arguments对于许多无法高效算术化的操作类别(如转换为加法、乘法和随机查询)确实很有效。使用Lookup Arguments还可以简化 SNARKs 的分析。
有许多不同的lookup协议。
- 1)动态表查找——最简单的协议只是在电路中构建表:适用于,当该表的内容是动态的但证明时间取决于该表的大小时: 
- 可使用plookup或log derivative Lookup Arguments来构建。
 
 - 2)静态表查找——当表是静态的时可使用另一组不同的Lookup Arguments: 
- 从Caulk到cq Lookup Arguments系列适用于静态表。 
- 在这些方案中,会对该静态表进行预处理,以便在证明时,prover所做的(密码学)工作仅与其想要查找的值的数量成比例。
 - 从而能够有效地构建对非常大的表的查找。
 
 
 - 从Caulk到cq Lookup Arguments系列适用于静态表。 
 - 3)结构化表查找——如Lasso: 
- 在这种情况下,该结构化表是预先固定的,但它具有一些结构,因此不需要为表预先计算任何东西。
 - Lasso 能够将对非常大的结构化表的查找,转换为,对一组较小表的查找。
 - 这些较小的查找可以使用不同的协议执行,且当使用 GKR 时,可以避免在证明lookup arguments时承诺任何“大”值。
 - 虽然对结构化表的限制似乎会限制该协议,但配套论文 Jolt 表明,所有 RISCV 操作都可以使用结构化查找表来实现。
 
 
4. BitVM
不幸的是,以上这些SNARKs发展都与比特币本身不兼容,因为比特币脚本和区块大小限制太有限,无法在单个比特币区块中容纳 SNARKs verifier。即使是(如 Groth16 或 BN254 上的 fflonk)针对verifier简单性优化的 SNARKs verifier也过于复杂。随着 BitVM 和最近的 BitVM2 的出现,这种情况发生了变化。
BitVM 是一种乐观协议,可用于“证明”比特币可以原生执行的更复杂statement的执行。
- 乐观意味着 BitVM 不是由prover实际构建 SNARKs,
 - 而是依靠多个预先指定的挑战者之一来提交欺诈证明。 
- BitVM2 放宽了这一点,以便任何人都可以提交挑战,但代价是链上通信量明显增多。
 
 
基于 BitVM 的协议还有许多额外的改进,包括Alpen Labs团队的SNARKnado:
- 可用于乐观地验证 SNARK,从而为比特币带来零知识证明的力量。
 
5. 结论
在过去的十到十五年里,SNARKs 已经从一门几乎完全局限于学术界的理论学科发展成为一项在世界范围内部署的实用技术。
- 实际计算的证明速度的提高速度,甚至比摩尔定律的提高速度还要快得多,现在以数百千赫兹为单位——详情见2024年5月视频 On Comparing Proof Systems and their Implementations - Matteo Campanelli (Matter Labs)。
 - 就目前而言,这种不懈的改进步伐没有放缓的迹象。为此,非常感谢 SNARK 密码学理论家和实践者的不懈努力。
 
人们还欠比特币诞生前的早期黑客和密码朋克很多东西,并继承了他们的文化。
- 与传统密码学不同,传统密码学往往受制于寻租知识产权,从而限制了其采用,如比特币中的 Schnorr 签名,而 SNARKs 研究则一直保持自由和开放。这是一个了不起的情况,不能视之为理所当然。毫无疑问,这也是极速改进的必要先决条件。随着这个领域的成熟,以及越来越多的项目寻求赚钱,至关重要的是,要保持这种微妙的平衡,并在社会上强制执行本工作必须free的规范。
 
大部分改进都是由区块链应用推动的。与传统的中心化服务设置不同,区块链没有可信任的第三方来委托验证。这使得区块链以及广义上的去中心化协议成为 SNARKs 的完美应用。在比特币的历史中,人们很早就认识到了这一点(见2013年8月Bitcoin论坛帖子Really Really ultimate blockchain compression: CoinWitness),但当时这项技术还不够成熟。这种情况已经或至少几乎已经不再存在,正如 SNARKs 在现实世界中的大量部署所证明的那样。现在是时候将 SNARKs 带回比特币了。
另外,2024年5月视频 On Comparing Proof Systems and their Implementations - Matteo Campanelli (Matter Labs)中指出:ZKP学术和工业实践之间存在分离,并建议构建针对ZKP的L2BEAT平台,以对各ZKP系统统一测试和评估标准。
 
 
参考资料
[1] Alpen Labs团队2024年5月29日博客 Current state of SNARKs: A survey of today’s SNARKs landscape.
相关文章:
当今SNARKs全景
1. 引言 前序博客有: ZKP历史总览SNARK原理示例SNARK性能及安全——Prover篇SNARK性能及安全——Verifier篇Transparent 且 Post-quantum zkSNARKsSNARK DesignRollup项目的SNARK景观 SNARKs因: proof size证明时长验证时长密码学信任假设是否需要tr…...
PMP敏捷专题课:敏捷原则与理念
信息发射源、看板是敏捷相关的词汇。 需求不明确:敏捷的关键词。 明确的端对端工作范围是传统项目管理的关键词。所以,应该采用:混合的,多轨制,瀑布态这样的声明周期 STACEY矩阵。 敏捷价值观指引者我们敏捷的实现。…...
有两个水桶,容量分别为5升和3升,请问如何使用这两个桶得到4升的水?
网上看到的一个面试的题目,感觉挺有意思的记录一下 可以按照以下步骤使用这两个桶得到 4 升的水: 将 5 升水桶装满水,倒入 3 升水桶中,此时 5 升水桶中还剩下 2 升水。将 3 升水桶中的水全部倒掉,然后将 5 升水桶中的…...
pytorch_lightning笔记
Debug 1. 快速运行一次所有的代码 (fast_dev_run) 训练了好长时间但是在训练or 验证的时候崩溃了 使用 fast_dev_run运行5个batch 的 training validation test and predication 查看是否存在错误: train Trainer(fast_dev_runTrue) # True 时为5 train Train…...
从零开始了解云WAF,您的网站安全升级指南
网站安全对任何线上业务来说至关重要,尤其是在网络威胁不断升级的今天。无论是流量高峰期还是日常运营,确保数据安全与服务稳定是每个网站运营者最关心的事情。云WAF(Web应用防火墙)作为一种高效的安全防护手段,正逐渐…...
Python脚本爬取目标网站上的所有链接
一、爬取后txt文件保存 需要先pip install requests和BeautifulSoup库 import requests from bs4 import BeautifulSoup# 定义要爬取的新闻网站URL url https://www.chinadaily.com.cn/ # China Daily 网站# 发送请求获取页面内容 response requests.get(url)# 检查请求是否…...
Linux下以编译源码的方式安装Qt5与Qt6及其使用
文章目录 概要资源下载依赖安装编译Qt5Qt6 遇到的问题qtchooser使用 概要 自 Qt 5.15 开始,不再提供 open source offline installers,也就是原来的 .run 的安装文件,只能通过源码编译来安装了参考文章 资源下载 源码网址,链接…...
替换掉js后重启nginx 页面加载后js还是原来的 解决方法.【js版本号】【js不生效】【js失效】
原文: 替换掉js后重启nginx 页面加载后js还是原来的 解决方法.【js版本号】【js不生效】【js失效】 产品升级,部署js后,前端页面加载不生效,F12 NetWork查看js源码还是原来的内容。但是查看前端服务器上js已经是最新版本。 &…...
SHELL脚本之输出语句的使用
shell脚本能够给用户显示一些信息,就需要输出语句的使用。 1.echo语句 如上图所示,中英文都可以, 如上图所示,在shell脚本中对于转义符的使用应该加上-e的选项,\n表示换行,\t表示电脑键盘上使用tab键隔开的…...
《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调
第一轮学习目标:了解大模型理论体系 第二轮学习目标:进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段:预训练、有监督微调、奖励建模、强化学习。 预训练(Pretraining&…...
XGBoost回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出
回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出 目录 回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、…...
【翻译】在 Python 应用程序中使用Qt Designer的UI文件
原文地址:Using a Designer UI File in Your Qt for Python Application 直接上图,上代码 将UI文件转为Python 为了演示,我们使用 Qt Widgets 简单示例说明。 这个应用程序由一个源文件 easing.py、一个 UI 文件 form.UI、一个资源文件 ea…...
002-Html
Html 一、常用样式1.设置滚动条2.设置省略号3.设置高度自适应4.高度算法5.按钮样式6.按钮颜色 二、DIV1.并排显示 三、Input1.漂浮显示 一、常用样式 1.设置滚动条 <html> <!--滚动条-->overflow: auto; // x 和 yoverflow-x: auto; // xoverflow-y: auto; // y …...
微知-Mellanox提供的一个不错的测试rdma_cm方式建链的工具软件ucmatose?(ucmatose; ucmatose -s 1.1.1.1)
文章目录 快速命令获取背景实验server端客户端一个错误的情况无法建链: rpm安装包:librdmacm-utils-48.0-1.0.1.an8.x86_64详细介绍综述 快速命令获取 #server端 ucmatose# client端 ucmatose -s 1.1.1.1背景 平时使用rdma cm建链的测试一般使用ib_wri…...
Vivado HLS C/RTL 联合仿真时间
简单的led.cpp,led.h,还有一个test bench文件xxxx.cpp source D:/Vivado_HLS_project/RGB_YCBCR_RGB/solution1/sim/verilog/xsim.dir/flash_led/webtalk/xsim_webtalk.tcl -notraceINFO: [Common 17-206] Exiting Webtalk at Tue Oct 15 18:51:42 2024... INFO: [Common 17-2…...
Python实现图像加密与解密工具
Python实现图像加密与解密工具 一、整体思路 加密思路 读取图像文件,将图像数据转换为可以处理的格式(例如字节流)。选择一种加密算法,如AES(Advanced Encryption Standard)对称加密算法。生成加密密钥&a…...
《RabbitMQ篇》消费者轮询消费消息
当有多个消费者都在同一个队列中拿取消息时,会轮询从队列中拿取消息消费。 RabbitMQUtil类为工具类,获取Channel。 import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory;public…...
mongodb导入导出
分享自己mongodb导出导入经验。将一个数据库数据备份,导入到另一个数据库。 mongodb的导入导出工具有版本限制,过旧的版本是不支持导入导出的。mongodb 4.2以后版本支持比较好。mongodb 3.4以前完全不支持。 1,下载 mongodb的导入导出需要自…...
判断 HTTP/2 多路复用是否在服务器上实现
要判断 HTTP/2 多路复用是否在服务器上实现,并确保浏览器正在使用多路复用来加载资源,您可以使用以下几种方法进行验证: 1. 使用浏览器开发者工具 大多数现代浏览器(如 Chrome、Firefox、Edge)提供了开发者工具&…...
(已解决)vscode使用launch.json进行debug调试报错:Couldn‘t spawn debuggee:embedded null byte
Launch.json 进行debug时报错: 主要原因是vscode全局配置被整乱了,下面是个人解决的方法,以供参考. 在网上也寻找过解决方法,有的说是,在launch.json中,添加一行"python":"/root/miniconda3…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
