ZKP Understanding Nova (2) Relaxed R1CS

2023-12-08 03:28

本文主要是介绍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,}}
}

这篇关于ZKP Understanding Nova (2) Relaxed R1CS的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/468374

相关文章

OpenStack Victoria版——6.2计算节点-Nova计算服务组件

6.2计算节点-Nova计算服务组件 更多步骤:OpenStack Victoria版安装部署系列教程 OpenStack部署系列文章 OpenStack Victoria版 安装部署系列教程 OpenStack Ussuri版 离线安装部署系列教程(全) OpenStack Train版 离线安装部署系列教程(全) 欢迎留言沟通,共同进步。 文章目录 Nova相关软件

OpenStack:Glance共享与上传、Nova操作选项解释、Cinder操作技巧

目录 Glance member task Nova lock shelve rescue Cinder manage local-attach transfer backup-export 总结 原作者:int32bit,参考内容 从2013年开始折腾OpenStack也有好几年的时间了。在使用过程中,我发现有很多很有用的操作,但是却很少被提及。这里我暂不直接

Understanding the GitHub Flow

这里看下Github的入门介绍    --链接 GitHub Flow is a lightweight, branch-based workflow that supports teams and projects where deployments are made regularly. This guide explains how and why GitHub Flow works

Nova Club Cointelegraph 酒会:以最别样的方式认识Etalonium

如果说最近有什么活动是惹人瞩目,大咖云集的话,那一定非即将举行的Nova Club & Cointelegraph联合酒会莫属。这场云集了一众世界名模,时尚翘楚,国际领航人,行业大咖的盛会必将成为诸多业内人士眼中的高光时刻。 【世链财经原创】 本次私密酒会将于8月21日晚上在北京举行,由Nova Club携手Cointelegraph,同时联合CBE与Biki共同举办。 具有全球影响力的知名区块链

可以根据手机的折叠状态改变播放音效:nova Flip 的妙趣音效

由于折叠机最基础的“可折叠”属性,导致折叠机的扬声器相对于人的位置来说会存在更多的变化,在不同的折叠状态下,听感方面可能就会大有不同。 nova Flip手机利用这一特性,首次根据折叠形态差异,自适应了不同形态的音效氛围。 展开态:当手机是类似于直板机的展开态时,搭配首发的histen9.3音频算法,nova Flip拥有更具清晰度和更自然的音质效果,打造更具还原度的音效体验。   悬

论文阅读:VideoMamba: State Space Model for Efficient Video Understanding

论文地址:arxiv 摘要 为了解决视频理解中的局部冗余与全局依赖性的双重挑战。作者将 Mamba 模型应用于视频领域。所提出的 VideoMamba 克服了现有的 3D 卷积神经网络与视频 Transformer 的局限性。 经过广泛的评估提示了 VideoMamba 的能力: 在视觉领域有可扩展性,无需大规模数据集来预训练。对于短期动作也有敏感性,即使是细微的动作差异也可以识别到在长期视

华为nova Flip这么轻薄的机身还能这么卷?

近年来,小折叠手机备受关注,随着各大厂商纷纷布局小折叠赛道,行业内卷现象也让小折叠的创新程度再上一个新的高度。而对拥有庞大的年轻用户基础的小折叠来说,简约大方的设计风格,轻薄小巧的精致外观,以及超大的电池容量仍然是大家选择一款小折叠的几个重要因素。 最新发布的华为nova Flip,就在6.88mm极致轻薄的厚度下,植入了4400mAh的大电池容量。那么,华为nova Flip究竟是如何做到

后置人像主题2.0首现nova Flip,前后置都超能打!

继华为nova12系列的前置人像美颜主题上线后,nova Flip小折叠手机,首次实现在后置自拍场景下,支持nova品牌人像主题2.0功能。 全新升级的华为达芬奇人像引擎 2.0,带来“形、质、色、光、画”智能人像优化,脸型立体,肤质细腻,肤色清透,明暗有致,虚化唯美自然,全面提升人像质感。后置原生、质感、妆感三种人像美颜主题,为用户提供三种不同的美颜质感。 原生主题:高清原相机质感,清爽

Awesome-LLMs-for-Video-Understanding - 基于大型语言模型的视频理解研究

Awesome-LLMs-for-Video-Understanding 是 基于大型语言模型的视频理解研究 github : https://github.com/yunlong10/Awesome-LLMs-for-Video-Understandingpaper:Video Understanding with Large Language Models: A Survey https:/

深入浅出OpenStack云计算平台管理(nova-compute/network)

各位网友,我这里有套课程想和大家分享,是来自明义(robby)老师的一套关于云计算平台管理的课程, 需要的朋友可以加我qq和我联系。QQ2059055336.     1.1、 课程的背景       OpenStack是 一个由Rackspace发起、全球开发者共同参与的开源项目,旨在打造易于部署、功能丰富且易于扩展的云计算平台。OpenStack企图成为数据中心