当今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…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...