ZKP Understanding Nova (2) Relaxed R1CS

Understanding Nova

Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022.

Nova: Paper Code

2. Understanding Relaxed R1CS

  • R1CS
    在这里插入图片描述
/// A type that holds a witness for a given R1CS instance
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct R1CSWitness<E: Engine> {W: Vec<E::Scalar>,
}/// A type that holds an R1CS instance
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "")]
pub struct R1CSInstance<E: Engine> {pub(crate) comm_W: Commitment<E>,pub(crate) X: Vec<E::Scalar>,
}impl<E: Engine> R1CSWitness<E> {/// A method to create a witness object using a vector of scalarspub fn new(S: &R1CSShape<E>, W: &[E::Scalar]) -> Result<R1CSWitness<E>, NovaError> {if S.num_vars != W.len() {Err(NovaError::InvalidWitnessLength)} else {Ok(R1CSWitness { W: W.to_owned() })}}/// Commits to the witness using the supplied generatorspub fn commit(&self, ck: &CommitmentKey<E>) -> Commitment<E> {CE::<E>::commit(ck, &self.W)}
}impl<E: Engine> R1CSInstance<E> {/// A method to create an instance object using consitituent elementspub fn new(S: &R1CSShape<E>,comm_W: &Commitment<E>,X: &[E::Scalar],) -> Result<R1CSInstance<E>, NovaError> {if S.num_io != X.len() {Err(NovaError::InvalidInputLength)} else {Ok(R1CSInstance {comm_W: *comm_W,X: X.to_owned(),})}}
}
  • Relaxed R1CS
    在这里插入图片描述
/// A type that holds a witness for a given Relaxed R1CS instance
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelaxedR1CSWitness<E: Engine> {pub(crate) W: Vec<E::Scalar>,pub(crate) E: Vec<E::Scalar>,
}/// A type that holds a Relaxed R1CS instance
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(bound = "")]
pub struct RelaxedR1CSInstance<E: Engine> {pub(crate) comm_W: Commitment<E>,pub(crate) comm_E: Commitment<E>,pub(crate) X: Vec<E::Scalar>,pub(crate) u: E::Scalar,
}impl<E: Engine> RelaxedR1CSWitness<E> {/// Produces a default `RelaxedR1CSWitness` given an `R1CSShape`pub fn default(S: &R1CSShape<E>) -> RelaxedR1CSWitness<E> {RelaxedR1CSWitness {W: vec![E::Scalar::ZERO; S.num_vars],E: vec![E::Scalar::ZERO; S.num_cons],}}/// Initializes a new `RelaxedR1CSWitness` from an `R1CSWitness`pub fn from_r1cs_witness(S: &R1CSShape<E>, witness: &R1CSWitness<E>) -> RelaxedR1CSWitness<E> {RelaxedR1CSWitness {W: witness.W.clone(),E: vec![E::Scalar::ZERO; S.num_cons],}}/// Commits to the witness using the supplied generatorspub fn commit(&self, ck: &CommitmentKey<E>) -> (Commitment<E>, Commitment<E>) {(CE::<E>::commit(ck, &self.W), CE::<E>::commit(ck, &self.E))}/// Folds an incoming `R1CSWitness` into the current onepub fn fold(&self,W2: &R1CSWitness<E>,T: &[E::Scalar],r: &E::Scalar,) -> Result<RelaxedR1CSWitness<E>, NovaError> {let (W1, E1) = (&self.W, &self.E);let W2 = &W2.W;if W1.len() != W2.len() {return Err(NovaError::InvalidWitnessLength);}let W = W1.par_iter().zip(W2).map(|(a, b)| *a + *r * *b).collect::<Vec<E::Scalar>>();let E = E1.par_iter().zip(T).map(|(a, b)| *a + *r * *b).collect::<Vec<E::Scalar>>();Ok(RelaxedR1CSWitness { W, E })}/// Pads the provided witness to the correct lengthpub fn pad(&self, S: &R1CSShape<E>) -> RelaxedR1CSWitness<E> {let mut W = self.W.clone();W.extend(vec![E::Scalar::ZERO; S.num_vars - W.len()]);let mut E = self.E.clone();E.extend(vec![E::Scalar::ZERO; S.num_cons - E.len()]);Self { W, E }}
}impl<E: Engine> RelaxedR1CSInstance<E> {/// Produces a default `RelaxedR1CSInstance` given `R1CSGens` and `R1CSShape`pub fn default(_ck: &CommitmentKey<E>, S: &R1CSShape<E>) -> RelaxedR1CSInstance<E> {let (comm_W, comm_E) = (Commitment::<E>::default(), Commitment::<E>::default());RelaxedR1CSInstance {comm_W,comm_E,u: E::Scalar::ZERO,X: vec![E::Scalar::ZERO; S.num_io],}}/// Initializes a new `RelaxedR1CSInstance` from an `R1CSInstance`pub fn from_r1cs_instance(ck: &CommitmentKey<E>,S: &R1CSShape<E>,instance: &R1CSInstance<E>,) -> RelaxedR1CSInstance<E> {let mut r_instance = RelaxedR1CSInstance::default(ck, S);r_instance.comm_W = instance.comm_W;r_instance.u = E::Scalar::ONE;r_instance.X = instance.X.clone();r_instance}/// Initializes a new `RelaxedR1CSInstance` from an `R1CSInstance`pub fn from_r1cs_instance_unchecked(comm_W: &Commitment<E>,X: &[E::Scalar],) -> RelaxedR1CSInstance<E> {RelaxedR1CSInstance {comm_W: *comm_W,comm_E: Commitment::<E>::default(),u: E::Scalar::ONE,X: X.to_vec(),}}/// Folds an incoming `RelaxedR1CSInstance` into the current onepub fn fold(&self,U2: &R1CSInstance<E>,comm_T: &Commitment<E>,r: &E::Scalar,) -> RelaxedR1CSInstance<E> {let (X1, u1, comm_W_1, comm_E_1) =(&self.X, &self.u, &self.comm_W.clone(), &self.comm_E.clone());let (X2, comm_W_2) = (&U2.X, &U2.comm_W);// weighted sum of X, comm_W, comm_E, and ulet X = X1.par_iter().zip(X2).map(|(a, b)| *a + *r * *b).collect::<Vec<E::Scalar>>();let comm_W = *comm_W_1 + *comm_W_2 * *r;let comm_E = *comm_E_1 + *comm_T * *r;let u = *u1 + *r;RelaxedR1CSInstance {comm_W,comm_E,X,u,}}
}

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

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

相关文章

安装TensorFlow2.12.0

文章目录 一、安装Anaconda步骤 1: 下载Anaconda步骤 2: 运行安装程序步骤 3: 选择安装路径步骤 4: 完成安装步骤 5: 启动Anaconda Navigator步骤 6: 创建和管理环境二、安装TensorFlow​(一)Anaconda修改国内镜像源(二)安装CPU版TensorFlow2.12.0(三)查看TensorFlow版本…

openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump

文章目录 openGauss学习笔记-147 openGauss 数据库运维-备份与恢复-逻辑备份与恢复之gs_dump147.1 背景信息147.2 注意事项147.3 语法147.4 参数说明147.4.1 通用参数&#xff1a;147.4.2 转储参数&#xff1a;147.4.3 连接参数&#xff1a; 147.5 说明147.6 示例 openGauss学习…

HTTP、HTTPS、SSL协议以及报文讲解

目录 HTTP/HTTPS介绍 HTTP/HTTPS基本信息 HTTP请求与应答报文 HTTP请求报文 HTTP响应报文 SSL协议 SSL单向认证 SSL双向认证 HTTP连接建立与传输步骤 HTTP访问全过程相关报文&#xff08;以访问www.download.cucdccom为例子&#xff09; DNS报文解析 TCP三次握手连…

【Flink系列六】Flink里面的状态一致性

状态一致性 有状态的流处理&#xff0c;内部每个算子任务都可以有自己的状态&#xff0c;对于流处理器内部来说&#xff0c;所谓的状态一致性&#xff0c;其实就是我们所说的计算结果要保证准确。一条数据不应该丢失&#xff0c;也不应该重复计算。再遇到有故障时可以恢复状态…

RabbitMQ 常见面试题

目录 1.前置知识1.1.什么是 MQ&#xff1f;它有什么作用&#xff1f;1.2.什么是消费者生产者模型&#xff1f;1.3.AMQP 是什么&#xff1f; 2.RabbitMQ 入门2.1.什么是 RabbitMQ&#xff1f;有什么特点&#xff1f;2.2.RabbitMQ 的核心概念有哪些&#xff1f;2.2.1.生产者 (Pro…

css 元素前后添加图标(::before 和 ::after 的妙用)

<template><div class"container"><div class"label">猜你喜欢</div></div> </template><style lang"scss" scoped> .label {display: flex;&::before,&::after {content: "";widt…

《实战:如何使用Vue2.0开发一个npm组件库》- 6、Vue2.x 组件 webpack3 升 webpack5

升级 package.json 删除冗余依赖 "extract-text-webpack-plugin": "^3.0.2","vue-loader": "^13.0.5", "vue-template-compiler": "^2.4.4", "webpack": "^3.6.0", "webpack-dev-serv…

LLM之RAG实战(二):使用LlamaIndex + Metaphor实现知识工作自动化

最先进的大型语言模型&#xff08;LLM&#xff09;&#xff0c;如ChatGPT、GPT-4、Claude 2&#xff0c;具有令人难以置信的推理能力&#xff0c;可以解锁各种用例——从洞察力提取到问答&#xff0c;再到通用工作流自动化。然而&#xff0c;他们检索上下文相关信息的能力有限。…

[论文阅读]BEVFusion

BEVFusion BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework BEVFusion&#xff1a;简单而强大的激光雷达相机融合框架 论文网址&#xff1a;BEVFusion 论文代码&#xff1a;BEVFusion 简读论文 论文背景&#xff1a;激光雷达和摄像头是自动驾驶系统中常用的两…

UE Http笔记

c参考链接 UE4 开发如何使用 Http 请求_wx61ae2f5191643的技术博客_51CTO博客 虚幻引擎:UEC如何对JSON文件进行读写?-CSDN博客 UE4 HTTP使用 官方免费插件 VaRest 在代码插件创建的VaRest - 虚幻引擎商城 UE5在蓝图中使用Varest插件Get&#xff0c;Post两种常见请求方式…

webpack学习-3.管理输出

webpack学习-3.管理输出 1.简单练手2.设置 HtmlWebpackPlugin3.清理 /dist 文件夹4.manifest5.总结 1.简单练手 官网的第一个预先准备&#xff0c;是多入口的。 const path require(path);module.exports {entry: {index: ./src/index.js,print: ./src/print.js,},output: …

axios调接口传参特殊字符丢失的问题(encodeURI 和 encodeURIComponent)

1、axios调接口特殊字符丢失的问题 项目开发过程中遇到一个接口传参&#xff0c;参数带特殊字符&#xff0c;axios调接口特殊字符丢失的问题 例如接口&#xff1a; get/user/detail/{name} name是个参数直接调接口的时候拼到接口上&#xff0c;get/user/detail/test123#$%&am…

计算机网络中的通信子网:架构、协议与技术简介

在计算机网络中&#xff0c;通信子网是负责实现主机之间以及主机与终端之间数据传输的核心部分。它由一系列硬件设备和通信协议组成&#xff0c;为上层应用提供可靠、高效和透明的数据传输服务。本文将详细介绍通信子网的架构、协议与技术。 一、通信子网的架构 星型拓扑 星…

华为配置Smart Link负载分担示例

Smart Link基本概念 Smart Link通过两个端口相互配合工作来实现功能。这样的一对端口组成了一个Smart Link组。为了区别一个Smart Link组中的两个端口&#xff0c;我们将其中的一个叫做主端口&#xff0c;另一个叫做从端口。同时我们利用Flush报文、Smart Link实例和控制VLAN等…

Matlab 点云曲线探测(算法不稳定,仅用于学习)

文章目录 一、简介二、实现代码三、实现效果参考文献一、简介 这是一个很有趣的曲线探测的方法,不过我没有复现出论文中那样的效果,可能是理解有误,但这个算法仍然是很有意思,故这里也对其进行记录。 按照论文中的思路,首先我们需要通过一种线性强度图来计算确定每个点的法…

js事件流模型

js 事件流模型js 事件循环 js 事件流模型 JavaScript的事件流模型可以被概括为三个阶段&#xff1a;捕获阶段&#xff0c;目标阶段和冒泡阶段。这个模型是在DOM&#xff08;文档对象模型&#xff09;中定义的&#xff0c;用于描述事件如何在DOM元素中传播。 捕获阶段&#xf…

C语言实现水仙花

水仙花定义&#xff1a;指一个3位数&#xff0c;其各位数字立方和等于改数本身。若&#xff1a;153 1* 1* 1 5 * 5* 53* 3* 3 依次类推&#xff0c;四 、五 … 十全十美呀。 解题思路 从这句&#xff1a;其各位数字立方和等于改数本身 我们将这位数拆分出来: num num1 ^3 n…

提高图片分辨率的方法与实践

引言 在图像处理和计算机视觉领域&#xff0c;提高图片分辨率是一个常见的问题。随着高分辨率显示设备的普及&#xff0c;如4K、8K电视以及高像素手机摄像头的应用&#xff0c;用户对高质量图片的需求也越来越高。本文将介绍使用Golang语言提高图片分辨率的方法与实践。 1. 图…

服务器如何修改密码

首先先远程登录服务器。 1、右键我的电脑&#xff0c;点击“管理”。 2、在“本地用户和组”中打开“用户”&#xff0c;在右侧找到 Administrator 账户。 3、在 Administrator 账户上点击右键&#xff0c;选择“修改密码”设置您的新密码。 4、修改后请牢记您的系统管理员密…

Java网络编程,使用UDP实现TCP(一), 基本实现三次握手

简介&#xff1a; 首先我们需要知道TCP传输和UDP传输的区别&#xff0c;UDP相当于只管发送不管对方是否接收到了&#xff0c;而TCP相当于打电话&#xff0c;需要进行3次握手&#xff0c;4次挥手&#xff0c;所以我们就需要在应用层上做一些功能添加&#xff0c;如&#xff1a;…