From 2e1039e05a415fd6a656d62fa4d9b3a96ff4c8c4 Mon Sep 17 00:00:00 2001 From: arnaucube Date: Thu, 3 Oct 2024 09:44:17 +0200 Subject: [PATCH] small polishing & rebase to latest `main` branch updates --- folding-schemes/src/folding/nova/circuits.rs | 20 ++++++++++++------- folding-schemes/src/folding/nova/decider.rs | 2 +- .../src/folding/nova/decider_circuits.rs | 2 +- .../src/folding/nova/decider_eth_circuit.rs | 4 ++-- folding-schemes/src/folding/nova/mod.rs | 2 +- folding-schemes/src/folding/nova/nifs.rs | 8 +++++++- folding-schemes/src/folding/nova/ova.rs | 10 ++++------ folding-schemes/src/folding/nova/zk.rs | 6 +++++- 8 files changed, 34 insertions(+), 20 deletions(-) diff --git a/folding-schemes/src/folding/nova/circuits.rs b/folding-schemes/src/folding/nova/circuits.rs index 51199c37..b657b61e 100644 --- a/folding-schemes/src/folding/nova/circuits.rs +++ b/folding-schemes/src/folding/nova/circuits.rs @@ -183,12 +183,15 @@ where pp_hash: C::ScalarField, // public params hash U_i: &CI, u_i: &CI, - cmT: &C, + cmT: Option<&C>, ) -> Vec { transcript.absorb(&pp_hash); transcript.absorb(&U_i); transcript.absorb(&u_i); - transcript.absorb_nonnative(cmT); + // in the Nova case we absorb the cmT, in Ova case we don't since it is not used. + if let Some(cmT_value) = cmT { + transcript.absorb_nonnative(cmT_value); + } transcript.squeeze_bits(NOVA_N_BITS_RO) } @@ -198,12 +201,15 @@ where pp_hash: FpVar>, // public params hash U_i_vec: Vec>>, // apready processed input, so we don't have to recompute these values u_i: CommittedInstanceVar, - cmT: NonNativeAffineVar, + cmT: Option>, ) -> Result>, SynthesisError> { transcript.absorb(&pp_hash)?; transcript.absorb(&U_i_vec)?; transcript.absorb(&u_i)?; - transcript.absorb_nonnative(&cmT)?; + // in the Nova case we absorb the cmT, in Ova case we don't since it is not used. + if let Some(cmT_value) = cmT { + transcript.absorb_nonnative(&cmT_value)?; + } transcript.squeeze_bits(NOVA_N_BITS_RO) } } @@ -382,7 +388,7 @@ where pp_hash.clone(), U_i_vec, u_i.clone(), - cmT.clone(), + Some(cmT.clone()), )?; let r = Boolean::le_bits_to_fp_var(&r_bits)?; // Also convert r_bits to a `NonNativeFieldVar` @@ -692,7 +698,7 @@ pub mod tests { pp_hash, &U_i, &u_i, - &cmT, + Some(&cmT), ); let r = Fr::from_bigint(BigInteger::from_bits_le(&r_bits)).unwrap(); @@ -721,7 +727,7 @@ pub mod tests { pp_hashVar, U_iVar_vec, u_iVar, - cmTVar, + Some(cmTVar), ) .unwrap(); assert!(cs.is_satisfied().unwrap()); diff --git a/folding-schemes/src/folding/nova/decider.rs b/folding-schemes/src/folding/nova/decider.rs index 11e864b0..901f152a 100644 --- a/folding-schemes/src/folding/nova/decider.rs +++ b/folding-schemes/src/folding/nova/decider.rs @@ -13,7 +13,7 @@ use ark_std::{One, Zero}; use core::marker::PhantomData; use super::decider_circuits::{DeciderCircuit1, DeciderCircuit2}; -use super::{nifs::NIFS, CommittedInstance, Nova}; +use super::{nifs::NIFS, traits::NIFSTrait, CommittedInstance, Nova}; use crate::commitment::CommitmentScheme; use crate::folding::circuits::{ cyclefold::CycleFoldCommittedInstance, diff --git a/folding-schemes/src/folding/nova/decider_circuits.rs b/folding-schemes/src/folding/nova/decider_circuits.rs index 6cc2888c..6e84fc03 100644 --- a/folding-schemes/src/folding/nova/decider_circuits.rs +++ b/folding-schemes/src/folding/nova/decider_circuits.rs @@ -288,7 +288,7 @@ where pp_hash, U_i_vec, u_i.clone(), - cmT.clone(), + Some(cmT.clone()), )?; // 5.1. let (incircuit_c_W, incircuit_c_E) = diff --git a/folding-schemes/src/folding/nova/decider_eth_circuit.rs b/folding-schemes/src/folding/nova/decider_eth_circuit.rs index 1d6548ca..18abfe86 100644 --- a/folding-schemes/src/folding/nova/decider_eth_circuit.rs +++ b/folding-schemes/src/folding/nova/decider_eth_circuit.rs @@ -260,7 +260,7 @@ where nova.pp_hash, &nova.U_i, &nova.u_i, - &cmT, + Some(&cmT), ); let r_Fr = C1::ScalarField::from_bigint(BigInteger::from_bits_le(&r_bits)) .ok_or(Error::OutOfBounds)?; @@ -490,7 +490,7 @@ where pp_hash, U_i_vec, u_i.clone(), - cmT.clone(), + Some(cmT), )?; // 5.1. let (incircuit_c_W, incircuit_c_E) = diff --git a/folding-schemes/src/folding/nova/mod.rs b/folding-schemes/src/folding/nova/mod.rs index e7ff6d90..45ee51ac 100644 --- a/folding-schemes/src/folding/nova/mod.rs +++ b/folding-schemes/src/folding/nova/mod.rs @@ -689,7 +689,7 @@ where self.pp_hash, &self.U_i, &self.u_i, - &cmT, + Some(&cmT), ); let r_Fr = C1::ScalarField::from_bigint(BigInteger::from_bits_le(&r_bits)) .ok_or(Error::OutOfBounds)?; diff --git a/folding-schemes/src/folding/nova/nifs.rs b/folding-schemes/src/folding/nova/nifs.rs index b9bf85a7..0a2d807e 100644 --- a/folding-schemes/src/folding/nova/nifs.rs +++ b/folding-schemes/src/folding/nova/nifs.rs @@ -98,10 +98,16 @@ where aux: &Self::VerifierAux, // cmT ) -> Vec { ChallengeGadget::::get_challenge_native( - transcript, pp_hash, U_i, u_i, aux, + transcript, + pp_hash, + U_i, + u_i, + Some(aux), ) } + // Notice: `prove` method is implemented at the trait level. + fn verify( // r comes from the transcript, and is a n-bit (N_BITS_CHALLENGE) element r: C::ScalarField, diff --git a/folding-schemes/src/folding/nova/ova.rs b/folding-schemes/src/folding/nova/ova.rs index a8674407..95bd91ac 100644 --- a/folding-schemes/src/folding/nova/ova.rs +++ b/folding-schemes/src/folding/nova/ova.rs @@ -169,14 +169,12 @@ where ) -> Vec { // reuse Nova's get_challenge method ChallengeGadget::::get_challenge_native( - transcript, - pp_hash, - U_i, - u_i, - &C::zero(), // empty in Ova's case + transcript, pp_hash, U_i, u_i, None, // empty in Ova's case ) } + // Notice: `prove` method is implemented at the trait level. + fn verify( // r comes from the transcript, and is a n-bit (N_BITS_CHALLENGE) element r: C::ScalarField, @@ -184,7 +182,7 @@ where u_i: &Self::CommittedInstance, _aux: &Self::VerifierAux, ) -> Self::CommittedInstance { - // recall that r <==> alpha, and u <==} mu between Nova and Ova respectively + // recall that r <==> alpha, and u <==> mu between Nova and Ova respectively let u = U_i.u + r; // u_i.u is always 1 IN ova as we just can do sequential IVC. let cmWE = U_i.cmWE + u_i.cmWE.mul(r); let x = U_i diff --git a/folding-schemes/src/folding/nova/zk.rs b/folding-schemes/src/folding/nova/zk.rs index 3ecdb44b..33f30cde 100644 --- a/folding-schemes/src/folding/nova/zk.rs +++ b/folding-schemes/src/folding/nova/zk.rs @@ -86,7 +86,11 @@ where cmT: C1, ) -> Result { let r_bits = ChallengeGadget::>::get_challenge_native( - sponge, pp_hash, &U_i, &u_i, &cmT, + sponge, + pp_hash, + &U_i, + &u_i, + Some(&cmT), ); C1::ScalarField::from_bigint(BigInteger::from_bits_le(&r_bits)).ok_or(Error::OutOfBounds) }