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.hqwc.cn/news/256231.html

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

相关文章

软件测试面试题解析--什么题是必问的?

设计测试用例的主要方法有哪些&#xff1f; 简述一下缺陷的生命周期&#xff1f; 测试流程&#xff1f; 项目流程&#xff1f; 验收测试中和β测试区别&#xff1f; 如何维护测试用例&#xff1f; 每天测多少用例 怎么分配的测试的 一天能找多少bug 你在上一家公司&#xff0c;…

el-select的多选multible带全选组件二次封装(vue2,elementUI)

1.需求 Select 选择器 多选需要增加 全选 和 取消全选 功能&#xff0c;前端框架为vue2&#xff0c;UI组件为elementUI。 2. 代码 html部分 <template><el-tooltip effect"dark" :disabled"defaultValue.length < 0" :content"defaul…

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系&#xff0c;以及部分分析方法。   什么是信号完整性?通俗来讲&#xff0c;信号在互连线的…

MySQL数据库从小白到入门(二)

多表关系&#xff1a; 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构。由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种。 外键&#xff1a; 创…

BPM、ERP、OA 各自的功能和特点是什么?怎么配合使用?

OA、BPM、ERP几乎是任何一家企业都会接触到的信息管理系统及程序。 首先&#xff0c;我从定义上理清BPM、ERP和OA ERP(Enterprise Resource Planning,企业资源计划)&#xff0c;一般围绕供应链、生产制造和财务为核心。 BPM&#xff08;business process management&#xf…

低代码你需要了解一下

低代码的概念可以追溯到1980年代&#xff0c;当时IBM的快速应用程序开发工具&#xff08;RAD&#xff09;被冠以新的名称——低代码&#xff0c;由此&#xff0c;低代码的概念首次面向大众。然而&#xff0c;在近40年的历程中&#xff0c;低代码发展经历了两个阶段&#xff1a;…

阿里年薪50w和5w都是如何进行需求分析,过来围观!

工作中难免会遇到并不“完美”的需求文档&#xff0c;比如牵一发而动全身却不清晰的交互逻辑、子条目频繁的变更、交流缺失导致的歧义等&#xff0c;都会让测试在项目推进中手足无措。 一份好的需求文档&#xff0c;不止能够加速开发和测试的脚步&#xff0c;还能够提前发现风…

Android音视频开发入门学习路线(基础知识+硬解码+技术分享)

随着5G基站的不断建设&#xff0c;大家已经可以明确的感知到目前市场上各大企业对于音视频人才的需求&#xff0c;市场招聘音视频岗位薪资亦是水涨船高&#xff01; 但Android 音视频开发想要自学却难度很高&#xff0c;不仅需要掌握图像、音频、视频的基础知识&#xff0c;并…

docker 可视化工具操作说明 portainer

官网地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下载并安装容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

Django之admin后台页面功能详解

一&#xff09;对于admin的初了解 1.简介 Django是一种流行的Python Web开发框架&#xff0c;它提供了一个功能强大且易于使用的admin界面&#xff0c;用于管理网站的后台数据和功能。Django的admin界面是自动生成的&#xff0c;它根据你的模型类自动创建表单和列表视图。你只…

【科普】什么是电子印章? PS抠的印章能用吗?

各类扣章教程一搜一大堆&#xff0c;说明大家对于电子印章使用需求很高。不过要谨记&#xff0c;不要随便抠印章用于公文、证明书、合同协议、收据发票等电子文件&#xff0c;否则可能会吃牢饭。 单是一张电子化的图片是不具备合法性的。那有的人就要问了&#xff0c;我见到的…

掌汇云 | 全场景数据追踪,多维了解用户偏好,提高运营效率

掌汇云拥有黄金“三件套”&#xff1a;掌头条、汇互动、云品牌。群硕借助这些功能套件&#xff0c;面向细分领域如&#xff1a;会展&#xff0c;食品饮料、医药以及工业等&#xff0c;定制综合性信息服务平台&#xff0c;提供资讯、商机、企业人脉、上下游资源、活动等高质量服…