Nova代码解析

news2024/9/29 19:24:12

1. 引言

前序博客有:

  • Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记
  • 基于cycle of curves的Nova证明系统(1)
  • 基于cycle of curves的Nova证明系统(2)

微软团队2021年论文 《Nova: Recursive Zero-Knowledge Arguments from Folding Schemes》。
本文主要解析代码见:

  • https://github.com/Microsoft/Nova(Rust)

其主要依赖的库有:

  • bellperson(bellman)库:https://github.com/filecoin-project/bellperson
  • ff 有限域库:https://github.com/zkcrypto/ff
  • (Sha2)digest库:https://github.com/RustCrypto/traits
  • SHA-3 (Keccak) 哈希函数库:https://github.com/RustCrypto/hashes
  • rayon并行库:https://github.com/rayon-rs/rayon
  • rand_core库(基础随机数生成器):https://github.com/rust-random/rand
  • rand_chacha库(使用ChaCha算法的密码学安全的随机数生成器):https://github.com/rust-random/rand
  • itertools库(批量数据遍历工具库):https://github.com/rust-itertools/itertools
  • subtle库(constant-time密码学库):https://github.com/dalek-cryptography/subtle,可参看博客:
    • Rust crate subtle:用于实现常量时间执行密码学操作的库
    • rust Trait subtle::ConditionallySelectable常量时间执行及应用举例
    • dudect_bencher test for constant-time函数
    • subtle:constant-time密码学库
  • pasta库(Pasta曲线对——Pallas和Vesta库):https://github.com/zcash/pasta_curves,可参看博客:Mina中的Pasta(Pallas和Vesta)曲线。
  • neptune Poseidon哈希函数库(由Filecoin开发、已审计,支持BLS12-381/Pallas/Vesta曲线的scalar域的Poseidon哈希。 ):https://github.com/lurk-lab/neptune
  • generic-array(通用数组类型库):https://github.com/fizyk20/generic-array
  • num-bigint(大整数库):https://github.com/rust-num/num-bigint
  • num-traits(通用数学numeric traits):https://github.com/rust-num/num-traits
  • num-integer(整数trait和函数库):https://github.com/rust-num/num-integer
  • serde(通用序列化、反序列化框架):https://github.com/serde-rs/serde
  • bincode(结构体与字节之间相互转换的二进制序列化反序列化工具):https://github.com/bincode-org/bincode
  • flate2(基于DEFLATE stream的streaming压缩解压缩库):https://github.com/rust-lang/flate2-rs
  • bitvec(以bits来对内存寻址,即逐bit管理内存):https://github.com/ferrilab/bitvec
  • byteorder(按big-endian或little-endian对数字进行编解码):https://github.com/BurntSushi/byteorder
  • thiserror(derive(Error) 派生宏):https://github.com/dtolnay/thiserror

2. 基本类型定义

基本类型定义见traits/mod.rs

  • Base:某group的base域内元素。
  • Scalar:某group的scalar域内元素。
  • CompressedGroupElement:某group元素的压缩表示。
  • GroupElement:对压缩group元素的解压缩表示。
  • PreprocessedGroupElement:表示preprocessed group元素。
  • RO:表示某电路友好的sponge类型:其消耗base域元素,挤出scalar域元素。【实际采用了Poseidon哈希函数】
  • ROCircuit:将RO表示为电路模式。
  • TE:外化proof时所使用的通用Fiat-Shamir transcript。【实际采用了SHA-3(Keccak)哈希函数】
  • CE:基于group scalar值的承诺机制。【实际采用了Pedersen承诺机制】
  • ROConstants:与RO相关的哈希函数常量值。
  • ROConstantsCircuit:与ROCircuit相关的哈希函数常量值。

在这里插入图片描述
相关结构定义见:src/r1cs.rs中:

  • 1)标准R1CS结构定义:
    • 矩阵A、B、C的列数为:num_vars + num_io + 1,与向量 Z = ( W , u , x ) Z=(W,u,x) Z=(W,u,x)的长度一致,即列号的取值范围为0~(num_vars + num_io)。
    • 矩阵A、B、C的行数num_cons:即对应为总约束数。
    /// A type that holds the shape of the R1CS matrices
    #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
    pub struct R1CSShape<G: Group> {
      pub(crate) num_cons: usize, // 矩阵A、B、C的行数,即行号取值范围为0~num_cons-1
      pub(crate) num_vars: usize, // witness $W$ 向量长度
      pub(crate) num_io: usize, // public input/output $x$ 向量长度
      pub(crate) A: Vec<(usize, usize, G::Scalar)>, // 矩阵A以一维向量表示,其中每个元素的格式为(行号,列号,值)
      pub(crate) B: Vec<(usize, usize, G::Scalar)>,
      pub(crate) C: Vec<(usize, usize, G::Scalar)>,
    }
    
  • 2)R1CS instance-witness定义为:【对应Az * Bz = Cz】
    /// A type that holds a witness for a given R1CS instance
    #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
    pub struct R1CSWitness<G: Group> {
      W: Vec<G::Scalar>,
    }
    
    /// A type that holds an R1CS instance
    #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
    #[serde(bound = "")]
    pub struct R1CSInstance<G: Group> {
      pub(crate) comm_W: Commitment<G>,
      pub(crate) X: Vec<G::Scalar>,
    }
    
  • 3)relaxed R1CS instance-witness定义为:【对应Az * Bz = u*Cz + E】
    /// A type that holds a witness for a given Relaxed R1CS instance
    #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
    pub struct RelaxedR1CSWitness<G: Group> {
      pub(crate) W: Vec<G::Scalar>,
      pub(crate) E: Vec<G::Scalar>,
    }
    
    /// A type that holds a Relaxed R1CS instance
    #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
    #[serde(bound = "")]
    pub struct RelaxedR1CSInstance<G: Group> {
      pub(crate) comm_W: Commitment<G>,
      pub(crate) comm_E: Commitment<G>,
      pub(crate) X: Vec<G::Scalar>,
      pub(crate) u: G::Scalar,
    }
    

在这里插入图片描述

当采用Spartan来压缩最终的IVC proof时,需将 ( u , x ) ~ \widetilde{(u,x)} (u,x) 以multilinear多项式表示,则要求 ( u , x ) (u,x) (u,x)填充后的长度为power of two,同时要求未填充的 x x x向量的长度为偶数:

	// We require the number of public inputs/outputs to be even
    if num_io % 2 != 0 {
      return Err(NovaError::OddInputLength);
    }

在这里插入图片描述

2.1 R1CSShape中关键函数

R1CSShape中关键函数有:

  • 1)new():明确创建特定的R1CS矩阵,会对矩阵向量的行列号做是否越界判断。
  • 2)multiply_vec():计算AZ、BZ、CZ矩阵与向量乘积,结果为三个向量值。
  • 3)is_sat_relaxed(ck, U, W):判断一组relaxed R1CS instance-witness是否satisfiable,即需同时满足以下条件:
    • 3.1)witness 中的W.W、W.E向量长度应分别为num_vars和num_cons,instance中的U.X向量长度应为num_io。
    • 3.2)满足Az * Bz = u*Cz + E,其中z=(W.W, U.u, U.X)
    • 3.3)承诺值匹配,即U.comm_W== commit(ck, W.W) 且 U.comm_E== commit(ck, W.E)。
  • 4)is_sat(ck, U, W):判断一组标准 R1CS instance-witness是否satisfiable,即需同时满足以下条件:
    • 4.1)witness 中的W.W向量长度应为num_vars,instance中的U.X向量长度应为num_io。
    • 4.2)满足Az * Bz = Cz,其中z=(W.W, 1, U.X)
    • 4.3)承诺值匹配,即U.comm_W== commit(ck, W.W)。
  • 5)commit_T(ck, U1, W1, U2, W2):计算committed relaxed R1CS folding scheme中的交叉项T的承诺值。其中(U1, W1)为relaxed R1CS instance-witness,(U2, W2)为标准R1CS instance-witness,即有U2.u=1且W2.E为零向量。
    • 5.1)计算: T = A Z 1 ∘ B Z 2 + A Z 2 ∘ B Z 1 − u 1 ⋅ C Z 2 − u 2 ⋅ C Z 1 T=AZ_1\circ BZ_2+AZ_2\circ BZ_1-u_1\cdot CZ_2-u_2\cdot CZ_1 T=AZ1BZ2+AZ2BZ1u1CZ2u2CZ1
    • 5.2)计算T的承诺值commit(ck, T)。
  • 6)pad():当采用Spartan来压缩最终的IVC proof时,需将 W ~ ( ⋅ ) 、 A ~ ( ⋅ , ⋅ ) 、 B ~ ( ⋅ , ⋅ ) 、 C ~ ( ⋅ , ⋅ ) 、 ( u , x ) ~ \widetilde{W}(\cdot)、\widetilde{A}(\cdot,\cdot)、\widetilde{B}(\cdot,\cdot)、\widetilde{C}(\cdot,\cdot)、\widetilde{(u,x)} W ()A (,)B (,)C (,)(u,x) 以multilinear多项式表示,要求将A、B、C矩阵的行列数均填充为power of two;要求将W向量的长度填充为power of two;要求将 ( u , x ) (u,x) (u,x)的长度填充为power of two。为便于表示,实际填充时,取 A、B、C矩阵行数 与 W向量长度 的最大值的next_power_of_two() 为m。
    本pad()函数仅对R1CSShape即A、B、C矩阵的行列进行填充。若只需做行填充,则直接改变num_cons参数值即可;若需做列填充,则将A、B、C 第 “c > (num_vars-1)” 列之后的值的列号调整为"c + m - num_vars"。

2.2 RelaxedR1CSWitness中关键函数

RelaxedR1CSWitness中关键函数有:

  • 1)default():设置RelaxedR1CSWitness中W和E均为零向量。
  • 2)from_r1cs_witness():根据R1CSWitness设置RelaxedR1CSWitness,其中E为零向量。
  • 3)commit():分别对W和E向量进行承诺。
  • 4)fold(W2, T, r):

Nova系列博客

  • Nova: Recursive Zero-Knowledge Arguments from Folding Schemes学习笔记
  • Nova 和 SuperNova:无需通用电路的通用机器执行证明系统
  • Sangria:类似Nova folding scheme的relaxed PLONK for PLONK
  • 基于Nova/SuperNova的zkVM
  • SuperNova:为多指令虚拟机执行提供递归证明
  • Lurk——Recursive zk-SNARKs编程语言
  • Research Day 2023:Succinct ZKP最新进展
  • 2023年 ZK Hack以及ZK Summit 亮点记
  • 基于cycle of curves的Nova证明系统(1)
  • 基于cycle of curves的Nova证明系统(2)

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

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

相关文章

警惕2本期刊被剔除!2023年6月EI目录已更新!(附全目录下载)

2023年6月EI期刊目录更新 爱思唯尔官网近日更新了EI期刊目录&#xff0c;此次更新是2023年6月1日&#xff0c;与上次更新&#xff08;2023年2月&#xff09;相比&#xff0c;有3本期刊名称在Serials&#xff08;连续出版&#xff09;列表中搜索不到&#xff0c;其中&#xff0…

【前端|HTML系列第2篇】HTML零基础入门之标签元素

大家好&#xff0c;欢迎来到前端入门系列的第二篇博客。在这个系列中&#xff0c;我们将一起学习前端开发的基础知识&#xff0c;从零开始构建网页和Web应用程序。本篇博客将为大家介绍HTML&#xff08;超文本标记语言&#xff09;常用标签元素&#xff0c;帮助零基础小白快速入…

Upload靶场通关笔记(更新中)

文章目录 一、Pass-011.抓包上传2.获取上传路径3.工具验证 二、Pass-02三、Pass-031.使用httpd.conf自定义后缀2.提取上传文件名3.工具测试4.注意点四、Pass-041.上传.htaccess2.上传图片3.工具测试 五、Pass-05六、Pass-061.空格.号绕过2.工具测试 七、Pass-07八、Pass-081.特…

电气工程师日常工作常遇到的41种接线方法(一)

01 电动机接线 一般常用三相交流电动机接线架上都引出6个接线柱&#xff0c;当电动机铭牌上标为Y形接法时&#xff0c;D6、D4、D5相连接&#xff0c;D1-D3接电源&#xff1b;为△形接法时&#xff0c;D6与D1连接&#xff0c;D4与D2连接&#xff0c;D5与D3连接&#xff0c;然后…

报表软件测评|如何选择一款简单易用的报表开发工具

报表业务的稳定性天生较差&#xff0c;随着业务的推进&#xff0c;会不断产生新的查询统计需求&#xff0c;报表也必须相应地不断增加、修改。这导致报表的数量似乎没有止境。通常情况下&#xff0c;企业信息系统的主要功能模块在上线后相对稳定&#xff0c;不再变化&#xff0…

文心一言 VS 讯飞星火 VS chatgpt (48)-- 算法导论6.1 6题

值为<23&#xff0c;17&#xff0c;14&#xff0c;6&#xff0c;13&#xff0c;10&#xff0c;1&#xff0c;5&#xff0c;7&#xff0c;12>的数组是一个最大堆吗? 文心一言&#xff1a; 是的&#xff0c;这个数组是一个最大堆。 最大堆是一种特殊的二叉树&#xff0…

第十六届CISCN复现MISC——国粹

国粹 不是我说&#xff0c;我当时比赛的时候&#xff0c;在那里叭叭叭的数的老用心了结果他是一道非常不常规的图片密码题&#xff0c;又是一种我没见过的题型 看了一些大佬的解题&#xff0c;知道他是一个坐标类型的图片拼凑 发现很多都提到了opencv&#xff0c;又是一个知识…

Hadoop生态之Mapreduce

今天给大家带来的是Hadoop生态中的Mapreduce&#xff0c;看到这里诸佬们可能就有疑惑了呢&#xff0c;啥是Mapreduce&#xff1f;小小的脑袋大大的疑惑。 在上篇博客中博主使用了王者来举例子&#xff0c;如果把Hadoop当作王者的话&#xff0c;HDFS是后台存储点券数据的系统的…

元宇宙:在虚拟世界里遨游星辰大海

元宇宙是我们探索内心世界需求的一种可能路径&#xff0c;寄托着我们对智慧社会生活的一种向往。针对当前元宇宙热潮产生的一系列问题&#xff0c;我们需要以积极审慎的态度&#xff0c;稳步推动元宇宙产业健康有序发展。 元宇宙总在前进的路上发展 其实&#xff0c;早在几十年…

6.Mysql主从复制

文章目录 Mysql主从复制读写分离概念&#xff1a;读写分离的作用&#xff1a;读写分离的作用条件&#xff1a;主从复制与读写分离mysq支持的复制类型主从复制的工作过程配置时间同步主服务器配置从服务器配置 读写分离MySQL 读写分离原理目前较为常见的 MySQL 读写分离分为以下…

java 影像资料管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 影像资料管理系统 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发。 研究的基本内容是基于Web的影像资料管理系…

http 网络库 flyio 如何使用?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言Flyio 简介安装 Fl…

apache doris数据库搭建(一)

1.Doris 介绍 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场景。…

活动打卡报名小程序开源版开发

活动打卡报名小程序开源版开发 活动打卡报名小程序开源版的功能可以包括以下几个方面&#xff1a; 活动列表展示&#xff1a;展示所有的活动信息&#xff0c;包括活动名称、时间、地点、报名人数等。活动详情展示&#xff1a;点击活动列表中的某个活动&#xff0c;可以查看该…

Unity3D 连接MySQL数据库

1、MySQL下载安装运行 详见&#xff1a;MySQL下载安装运行 2、使用mysql-connector-net &#xff08;1&#xff09;官方下载地址&#xff1a;https://downloads.mysql.com/archives/c-net/&#xff0c;下载后直接双击安装即可。 提示&#xff1a;不要使用版本过高的connect…

【FAQ】关于华为地图服务定位存在偏差的原因及解决办法(二)——仅适用于Location 6.7.0.300及之后的版本

一、 问题描述&#xff1a; 华为地图服务“我的位置”能力&#xff0c;在中国大陆地区&#xff0c;向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差。 具体差别可以查看下方的图片&#xff1a; 二、 偏差较大的原因&#xff1a; 华为Map SDK在中国大陆使用的…

【YOLO系列】YOLOX(含代码解析)

文章目录 环境配置demo测试转换成onnx YOLOX数据增广decoupled headAnchor-free标签分配get_geometry_constraintSimOTA 总结参考 【YOLO系列】YOLO v3&#xff08;网络结构图代码&#xff09; 【YOLO 系列】YOLO v4-v5先验知识 【YOLO系列】YOLO v4&#xff08;网络结构图代码…

2023年MathorCup 高校数学建模挑战赛-A 题 量子计算机在信用评分卡组合优化中的应用-思路详解(模型代码答案)

一、题目简析 运筹优化类题目&#xff0c;不同于目标规划&#xff0c;该题限制了必须使用量子退火算法QUBO来进行建模与求解。本身题目并不难&#xff0c;但是该模型较生僻&#xff0c;给出的参考文献需要耗费大量时间去钻研。建议擅长运筹类题目且建模能力强的队伍选择。 二…

用C语言进行学生成绩排序(插入排序算法)

一.排序算法 1.排序 从今天开始我们就要开始学习排序算法啦&#xff01; 排序&#xff0c;就是重新排列表中的元素&#xff0c;使表中的元素满足按关键字有序的过程。为了查找方便,通常希望计算机中的表是按关键字有序的。 2.稳定性 除了我们之前了解的时间复杂度和空间复…

基于springboot+Redis的前后端分离项目之分布式锁(四)-【黑马点评】

&#x1f381;&#x1f381;资源文件分享 链接&#xff1a;https://pan.baidu.com/s/1189u6u4icQYHg_9_7ovWmA?pwdeh11 提取码&#xff1a;eh11 分布式锁 分布式锁1 、基本原理和实现方式对比2 、Redis分布式锁的实现核心思路3 、实现分布式锁版本一4 、Redis分布式锁误删情况…