Sangria:类似Nova folding scheme的relaxed PLONK for PLONK

news2025/1/17 4:52:03

1. 引言

前序博客有:

  • Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记
  • SuperNova:为多指令虚拟机执行提供递归证明
  • 基于Nova/SuperNova的zkVM
  • Sangria:PLONK + Folding

主要见2023年4月 Geometry团队Nicolas Mohnblatt在- Zero Knowledge Summit 9 on April 4 2023 in Lisbon 会议上的分享视频:

  • ZK9: Sangria is relaxed PLONK a Nova-like folding scheme for PLONK – Nicolas Mohnblatt (Geometry)
  • Nico 2023年3月twitterSNARK recursion survey

微软团队2021年论文 《Nova: Recursive Zero-Knowledge Arguments from Folding Schemes》中首次提出了Folding schemes:

  • 将某problem的2个instance 压缩为 同一问题的single instance。如解决了2个数独题,无需展示2个答案,而可以将其合并展示为1个答案。

Folding schemes为实现cheap recursion的关键要素。在Nova论文中仅展示了针对R1CS电路的folding scheme。而Sangria为针对PLONKish电路的folding scheme。

Sangria的开销与Nova的类似:

  • Verifier work为常量值,与电路中的行数(即depth)无关
  • 引入的常量值开销要比Nova大,但是该代价 带来的好处是 可获得更灵活的arithmetization。

当前Lurk项目在使用Nova方案,详细见Lurk——Recursive zk-SNARKs编程语言。
Sangria也在与相关项目方做相关实现。

2. 为何需要递归,以及现有递归方案

2.1 为何需要递归?——IVC

为何需要递归?
其目的是为了实现 IVC(Incrementally Verifiable Computation)。

对于需要将某函数 F F F执行 n n n次的长计算:
在这里插入图片描述
Prover想要证明其知道private inputs w 0 , w 1 , ⋯   , w n − 1 w_0,w_1,\cdots,w_{n-1} w0,w1,,wn1,使得由初始状态 s 0 s_0 s0执行 n n n F F F函数之后, s n s_n sn为正确的最终状态。

实际上,IVC可用于构建:

  • zkVMs:可将 F F F函数看成是(如RISC、ARM等)微处理器的一个cycle,对 F F F函数的迭代执行可看成是处理器的运行。
  • rollups:将 s s s看成是区块链状态, w w w为incoming交易, F F F为表示区块链状态变化的transition function。rollup可为很多很多区块构建succinct proof。
  • VDF(Verifiable Delay Functions):如Open VDF: Accelerating the Nova SNARK-based VDF。

为实现IVC,定义某Prover P F \mathcal{P}_F PF,其输入有某state和某proof,输出为更新的state和更新的proof:
在这里插入图片描述
从而可将Prover P F \mathcal{P}_F PF的内部结构拆分为2部分表示:

  • 1)函数 F F F:输入某state,执行 F F F函数,输出更新的state。
  • 2)overhead:输入某proof,运行overhead,输出更新的proof。overhead主要工作为Verifier验证前一proof,并为 该验证过程的正确执行 生成新的proof。
    在这里插入图片描述
    为实现IVC Prover P F \mathcal{P}_F PF
  • 需要一些额外的开销来更新proof。这些额外的开销在IVC的每一个step都需要,关键怎么将这些额外的开销做到最低。

2.2 现有IVC方案对比

现有的IVC方案在实现overhead上主要分为:

  • 1)SNARK of SNARK:Verifier会读取整个proof,并验证整个proof,无任何延缓操作。【每个step都需要读取完整的proof,并验证完整的proof。】
    SNARK of SNARK代表方案有:

    • Plonky2:为recursive STARK。 2 12 2^{12} 212个gate,不过为wide gate——width of 135 (Goldilocks) elements,且conjectured FRI soundness约为100 bits。
    • Fractal:为Groth16 + [BCTV14](2013年论文Succinct Non-Interactive Zero Knowledge for a von Neumann Architecture)。
      Fractal很昂贵,有约百万级的R1CS约束。
  • 2)Accumulation(atomic)(原子式累加):Verifier会读取整个proof,但只验证部分,会将hard part的验证累加推迟,即递归 n n n次,仅需要对hard part做一次验证。【每个step都需要读取完整的step,并做部分验证,在最后一个step需对hard part进行一次验证即可。】
    Accumulation(atomic)(原子式累加)代表方案有:

    • Halo/Halo2 以及 [BCMS20](对应2020年论文Proof-Carrying Data from Accumulation Schemes):约束数为数十万——优于SNARK of SNARK的百万级约束。
      在这里插入图片描述
  • 3)Accumulation(atomic)(切分累加):Verifier会读取部分proof,但只验证部分,会将hard part的验证累加推迟,即递归 n n n次,仅需在最后读取一次完整的proof,并对hard part做一次验证。【每个step仅需读取部分proof,并做部分验证,仅需在最后一个step读取一次完整的proof,并执行一次hard part验证。】
    Accumulation(atomic)(切分累加)代表方案有:

    • [BCLMS21]对应2020年论文Proof-Carrying Data without Succinct Arguments:其牺牲了succinctness。
  • 4)Folding:读取unproven instance,将其压缩为a running instance,对proving进行推迟。【每个step读取unproven instance,执行 F F F来获得new running instance,只在最后一个step做证明】
    Folding代表方案有:

    • Nova:比之前方案的overhead开销要便宜很多,仅有约2万个约束。

在这里插入图片描述
Sangria关注的点在于,在Nova的基础上,将R1CS电路表示,替换为效率更高的PLONK电路表示。

3. PLONK folding scheme设计思路

3.1 PLONK Arithmetization定义

在这里插入图片描述
PLONK trace与Sudoku(数独)类似:

  • 具有固定size的网格

  • 向单元格内填充“数字(有限域)”

  • 有某些已填值:这些已填值为selectors和public inputs。
    在这里插入图片描述

  • 需遵循一系列rules规则:

    • 规则 #1:copy constraints:
      在这里插入图片描述
    • 规则 #2:用于每行的gate equation:
      ( q L ) i a i + ( q R ) i b i + ( q O ) i c i + ( q M ) i a i b i + ( q C ) i = 0 (q_L)_ia_i+(q_R)_ib_i+(q_O)_ic_i+(q_M)_ia_ib_i+(q_C)_i=0 (qL)iai+(qR)ibi+(qO)ici+(qM)iaibi+(qC)i=0
  • 根据selectors和rules即定义了某circuit。

  • 整个trace可分为:

    • instance X:公开信息,对Prover和Verifier均已知。
    • witness W:private信息,仅对Prover已知。
      在这里插入图片描述

3.2 Folding Scheme定义

folding scheme是将相同电路的2个instance压缩为1个instance,具体定义见ZKMOOC中的下图:
在这里插入图片描述
folding schem需满足:

  • completeness属性
  • knowledge soundness属性

注意Folding scheme不是argument,folding scheme中不证明任何东西,Verifier接收后直接进入下一step——这也是为啥folding scheme更cheaper的理论原因。

3.3 PLONK folding scheme设计方案一

PLONK folding scheme设计方案一:

  • 采用密码学家最好的朋友:
    • random linear combination
      在这里插入图片描述

引入随机值 r r r,random linear combination之后:

  • Copy constraints仍然成立。
  • gate equation为非线性的,会存在一些问题。

3.4 PLONK folding scheme设计方案二

Nova采用了相应的方案:

  • 对gate equation进行relaxed
  • Prover对整个trace进行操作,而Verifier操作相应的commitments。commitments值很短,即意味着Verifier仅需做少量工作。

借鉴Nova,PLONK folding scheme设计方案二为——Relaxed PLONK arithmetization:

  • Witness(私有信息):包括:
    • PLONK witness: W = ( w a , w b , w c ) \mathbf{W}=(\mathbf{w}_a,\mathbf{w}_b,\mathbf{w}_c) W=(wa,wb,wc)
    • 某error vector: e \mathbf{e} e
  • Instance(公开信息):包括:
    • public inputs: X = ( x a , x b , x c ) \mathbf{X}=(\mathbf{x}_a,\mathbf{x}_b,\mathbf{x}_c) X=(xa,xb,xc)
    • 某scalar值: u u u
    • 以上witness的承诺值:【图片中以方框来表示承诺值】
      C o m ( w a ) , C o m ( w b ) , C o m ( w c ) , C o m ( e ) Com(\mathbf{w}_a),Com(\mathbf{w}_b),Com(\mathbf{w}_c), Com(\mathbf{e}) Com(wa),Com(wb),Com(wc),Com(e)
  • Relaxed gate equation:【即Sangria的名字来源】
    u [ ( q L ) i a i + ( q R ) i b i + ( q O ) i c i ] + ( q M ) i a i b i + u 2 ( q C ) i + e i u[(q_L)_ia_i+(q_R)_ib_i+(q_O)_ic_i]+(q_M)_ia_ib_i+u^2(q_C)_i+e_i u[(qL)iai+(qR)ibi+(qO)ici]+(qM)iaibi+u2(qC)i+ei
    这样,上述多项式中除 e i e_i ei之外的各项的degree均为2,从而实现了homogeneous函数。 e i e_i ei作为error项,功能类似可扔的trash,包含了所不想要的内容。

然后仍然引入随机值 r r r,random linear combination之后,folding为:
在这里插入图片描述
将folding之后的值插入到relaxed gate equation中,有:
在这里插入图片描述
其中 t \mathbf{t} t为something big and ugly。
根据folding scheme中的completeness属性,若trace正确,则Gate之后值为0,从而有 G a t e ( t r a c e ′ ) = 0 , G a t e ( t r a c e ′ ′ ) = 0 Gate(trace')=0,Gate(trace'')=0 Gate(trace)=0Gate(trace′′)=0,剩下的为ugly r t r\mathbf{t} rt

为摆脱ugly t \mathbf{t} t,可借助上面定义的trash error term e \mathbf{e} e,并将其folding为:
e = e ′ − r t + r 2 e ′ ′ \mathbf{e}=\mathbf{e}'-r\mathbf{t}+r^2\mathbf{e''} e=ert+r2e′′

3.5 PLONK folding scheme设计方案:Sangria

若gate equation为固定的,则 t \mathbf{t} t也是固定的。
因此:

  • 在协议开始之初,Prover可计算 t \mathbf{t} t,并将其承诺值发送给Verifier。

  • Verifier发送随机值 r r r

  • Prover:

    • 计算trace的random linear combination。

    Verifier:

    • 计算public inputs的random linear combination。
    • 计算各witness承诺值的random linear combination。【承诺方案应具有加法同态属性。】

整个交互流程为:【为简化表述,忽略了hiding需求。】
在这里插入图片描述
Sangria论文中的各变量的具体值为:【可看出各个变量的值很复杂,ugly。且在论文中考虑了hiding需求。】
在这里插入图片描述

4. Sangria性能分析——即overhead开销

Sangria性能分析——即overhead开销,Verifier的主要工作为承诺值的加法运算:【包含5次point addition运算】
在这里插入图片描述
实际上,是将 一个standard PLONK instance folding为 一个relaxed PLONK instance:

  • standard PLONK instance中没有error项
  • Verifier仅需做4次point addition运算。比5次少一次的原因在于:
    在实际做IVC时,incoming instance并未relaxed,因此其没有narrow term,所以实际上仅需要4次point addition运算。

因此:

  • Sangria overhead的开销为4次point addition运算。
  • 而Nova的overhead开销仅为2次point addition运算。Nova方案要更简洁,因为其不需要处理3个witness承诺值,Nova仅需要处理1个witness承诺值。

但Sangria具有更大的灵活性——采用PLONK电路:

  • 可添加更多的列
  • 可修改gate equation

5. TurboPLONK对Sangria性能的影响

Sangria具有更大的灵活性——采用PLONK电路:

  • 1)可添加更多的列(Wider Circuits):
    当使用Sangria folding scheme处理wider circuits时,需对每额外增加的列做commit,相应的开销为:【所谓wider circuits,是指具有larger fan-in fan-out at each gate的电路。即gate中多于2个in wire,多于1个out wire的情况。】
    • 每额外增加一个trace列,Verifier需额外多做一次point addition运算。
  • 2)可修改gate equation(Custom Gates):
    当使用Sangria folding scheme处理custom Gates(higher degree Gates)时:
    • degree为 d d d的gate,将relaxed with powers of u u u up to u d u^d ud
    • error的folding equation形如:
      e = e ′ − r t 1 − r 2 t 2 − ⋯ − r d − 1 t d − 1 + r d e ′ ′ \mathbf{e}=\mathbf{e}'-r\mathbf{t}_1-r^2\mathbf{t}_2-\cdots - r^{d-1}\mathbf{t}_{d-1}+r^d\mathbf{e''} e=ert1r2t2rd1td1+rde′′
    • 相应的开销为:
      • degree每额外加1:Prover的message中需额外包含一个新的承诺值,Veriifer需额外多做一次point addition运算。

6. 设计空间——递归开销的最小值

设计递归证明方案的关键在于:

  • 如何让overhead开销最小化

在这里插入图片描述
当前,Nova电路有约2万个约束,其中1.2万个为point addition。
开放问题为:

  • 对本文第5章的场景,采用wider circuits和custom gates的优势,能否超过给folding Verifier移入额外point additions运算开销的劣势?即如何在递归overhead开销 与 电路灵活性 之间权衡?

7. 后续工作

后续安排有:

  • Sangria为对标Nova的PLONK folding scheme,未来可能有对标SuperNova的PLONK folding scheme。
  • 当前正在做standard PLONK的Sangria代码实现。
  • 针对ultraPLONK,lookup-enabled traces的folding scheme。
  • 可能的非凡电路表示:具有cheaper overhead和super cheap IVC。

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

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

相关文章

多线程编程(1)

本篇重点 了解进程和线程的区别和联系使用Java,实现创建线程的五种写法 目录 使用Java进行多线程编程方法一:继承 Thread, 重写 run方法二: 实现 Runnable, 重写 run方法三: 继承 Thread, 重写 run, 使用匿名内部类方法四: 实现 Runnable, 重写 run, 使用…

【剑指offer】数据结构——数

目录 数据结构——数直接解【剑指offer】43. 1~n 整数中 1 出现的次数【剑指offer】44. 数字序列中某一位的数字【剑指offer】49. 丑数【剑指offer】60. n个骰子的点数【剑指offer】62. 圆圈中最后剩下的数字【剑指offer】64. 求12…n 特殊解——分治法 &#xff1a…

【网络】- TCP/IP四层(五层)协议 - 网际层(网络层) - 划分子网、构造超网

目录 一、概述二、分类IP地址不合理的地方三、划分子网四、无分类编址方法 一、概述 前面的文章介绍了网络层的网际协议IP,介绍了IP地址的定义,知道了IP地址分为网络标识(网络地址)、主机标识(主机地址)两部分,也清楚了最初IP地址是按照分类被…

C++ 迷宫问题

文章目录 题目描述输入描述输出描述示例1 答案:代码讲解: 题目描述 在一个给定大小的迷宫中,有一个起点和一个终点,中间夹杂着一些墙壁 如果能走到终点输出 YES 否则输出 NO 输入描述 迷宫的大小 nm,其中 n 表示行数…

[数据结构 -- C语言] 堆(Heap),你小子就是堆,看我如何透彻的将你拿捏

目录 1、堆的概念及结构 1.1 概念(概念总是重要的) 1.2 结构,分为两种 1.2.1 小堆/小根堆示例 1.2.2 大堆/大根堆示例 2、堆的接口 3、接口实现 3.1 堆的初始化 3.2 堆的销毁 3.3 堆的插入 功能分析: 功能实现&#x…

zabbix动作执行失败 No media defined for user.

问题 zabbix动作执行失败 No media defined for user. 详细问题 解决方案 1(导航栏)用户 → \rightarrow →报警媒介 → \rightarrow →添加 2 选择类型 → \rightarrow →收件人 → \rightarrow →添加 3 更新 解决原因 笔者由于未点击更新钮导…

【计算机网络】3、IO 多路复用:select、poll、epoll、reactor | 阻塞非阻塞、同步异步

文章目录 一、select()1.1 用法1.1 实战 二、poll()2.1 用法2.2 实战 三、阻塞、非阻塞3.1 非阻塞 IO3.1.1 read()3.1.2 write()3.1.3 accept()3.1.4 connect()3.1.5 非阻塞IO select() 多路复用实战 四、epoll()4.1 epoll_create()4.2 epoll_ctl()4.3 epoll_wait()4.4 实战4.…

GAN在图像转译领域的应用-CycleGANPix2Pix

在之前的博客中向大家介绍了生成对抗网络GAN的相关概念以及条件GAN,DCGAN相关内容,需要的小伙伴可以点击以下链接了解~生成对抗网络GAN_生成对抗网络流程_春末的南方城市的博客-CSDN博客生成对抗网络Generative Adversarial Networks(GAN&…

使用Docker安装Guacamole远程网关并配置录像回放

一、参考 guacamole配置guacamole使用Docker安装guacamole在浏览器中播放录像guacamole插件下载 二、环境 操作系统:Anolis OS 8.6 QU1 docker版本:23.0.5 docker compose版本:v2.17.3 docker-image-guacamole:1.5.1 docker-image…

线段树C++详细讲解和个人见解

问题引入 假设有这样的问题&#xff1a;有n个数&#xff0c;m次操作&#xff0c;操作分为&#xff1a;修改某一个数或者查询一段区间的值 数据范围是&#xff08;1 < n, m<1e9)。 这种题大家一看就知道打暴力&#xff0c;但是一看数据范围就知道只能得部分。 我们之前…

STM32F407单片机HAL库CAN2不能接收数据解决方法

最近在使用stm32F407的片子调试can通信&#xff0c;直接在正点原子的代码上修改调试&#xff0c;调试can1的时候&#xff0c;基本没啥问题&#xff0c;收发都正常&#xff0c;使用查询模式和中断模式都可以。但是当修改到can2的时候&#xff0c;可以正常发送数据&#xff0c;但…

@Transactional注解作用,不生效的场景,事务回滚

目录 一、Transactional注解二、注解失效问题1、Transactional 应用在非 public 修饰的方法上2、Transactional 注解属性 rollbackFor 设置错误3、同一个类中方法调用&#xff0c;导致Transactional失效4、捕获异常 三、Transactional回滚1、Transactional2、Transactional(rol…

HUD(抬头显示)的方案介绍

目录 一、基于DLP3030-Q1的HUD电路设计 二、DLP3030-Q1的介绍 三、DLP3030-Q1工作原理 四、DLPC120-Q1DMD 显示控制器 五、TMS320F2802332 位 MCU 六、 HUD显示实例 HUD主板实例 七、HUD的软件环境 一、基于DLP3030-Q1的HUD电路设计 本设计采用了DLP3030-Q1 芯片组&…

H3C IPSec IKE野蛮模式

这里使用H3C模拟器。 H3C IPSec IKE野蛮模式&#xff0c;又称为IKE Main Mode&#xff0c;主要是在第一阶段&#xff08;Phase 1&#xff09;的过程中提供身份保护。它主要用于VPN隧道建立过程中的密钥交换。以下是配置步骤&#xff1a; 创建IKE提案&#xff1a; system-view…

vite源码分析之dev

最近研究socket, 所以就顺便看了一下vite源码, vite的热更新就是根据socket实现的, 所以正好记录一下. 前端任何脚手架的入口,肯定是在package.json文件中,当我们输入script命令时, 会经历什么样的步骤呢? 接下来我们一起来探索一下~~~ 入口-package.json 看下面就是一个普…

【C++】string介绍

String 前言为什么学习string类&#xff1f;string类的常用接口说明string类对象的常见构造析构函数赋值运算符重载[ ] 重载size和length迭代器字符串追加关于容量的函数insert和erasefindreplacec_strrfindfind_first_offind_first_not_offind_last_ofsubstrgetlineto_string …

linux+onenet可视化(图形化步骤)

文章目录 一、ONENET项目搭建1.1 ONENET注册1.2 创建产品与设备1.3 添加数据流 二、可视化配置 OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接&#xff0c;快速完成产品开发部署&#xff0c;为智能硬件、智能家居产品提供完善的物…

孤儿僵尸守护进程

孤儿僵尸守护进程 1. 孤儿进程&#xff1a;2. 僵尸进程&#xff1a;3. 守护进程&#xff1a;(重点) 1. 孤儿进程&#xff1a; 父进程退出,还没退出的子进程就变成了孤儿进程 不要怕,还有爷爷进程init: 孤儿进程将被init进程所收养&#xff0c;并由init进程对它们完成状态收集…

认识HTTP协议---2

hi,大家好,今天继续为大家带来HTTP协议相关的知识 认识请求报头 &#x1f440;1.header &#x1f440;2.Content-Type,Content-Length &#x1f440;3.User-Agent &#x1f440;4.Referer &#x1f440;5.Cookie机制 小复习 进入正题之前我们先回忆一下之前的知识 http报…

牛客小白月赛73

A&#xff1a;最小的数字 A-最小的数字_牛客小白月赛73 (nowcoder.com) #include<bits/stdc.h> #define endl \n #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define int long long using namespace std; int n, m, k, A, B, N, M, K; const int ma…