Skip to content

Commit 92d03a1

Browse files
authored
Merge pull request #33 from cryptonetlab/benchmarks
update benchmarks and add missing constraints to circuit
2 parents df9e890 + a49d598 commit 92d03a1

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

src/constraints.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ pub struct R1CSVerificationCircuit<F: PrimeField> {
229229
pub sc_phase1: SumcheckVerificationCircuit<F>,
230230
pub sc_phase2: SumcheckVerificationCircuit<F>,
231231
// The point on which the polynomial was evaluated by the prover.
232+
pub claimed_rx: Vec<F>,
232233
pub claimed_ry: Vec<F>,
233234
pub claimed_transcript_sat_state: F,
234235
}
@@ -251,6 +252,7 @@ impl<F: PrimeField> R1CSVerificationCircuit<F> {
251252
sc_phase2: SumcheckVerificationCircuit {
252253
polys: config.polys_sc2.clone(),
253254
},
255+
claimed_rx: config.rx.clone(),
254256
claimed_ry: config.ry.clone(),
255257
claimed_transcript_sat_state: config.transcript_sat_state,
256258
}
@@ -284,6 +286,12 @@ impl<F: PrimeField> ConstraintSynthesizer<F> for R1CSVerificationCircuit<F> {
284286
.map(|i| FpVar::<F>::new_variable(cs.clone(), || Ok(i), AllocationMode::Input).unwrap())
285287
.collect::<Vec<FpVar<F>>>();
286288

289+
let claimed_rx_vars = self
290+
.claimed_rx
291+
.iter()
292+
.map(|r| FpVar::<F>::new_variable(cs.clone(), || Ok(r), AllocationMode::Input).unwrap())
293+
.collect::<Vec<FpVar<F>>>();
294+
287295
let claimed_ry_vars = self
288296
.claimed_ry
289297
.iter()
@@ -304,6 +312,13 @@ impl<F: PrimeField> ConstraintSynthesizer<F> for R1CSVerificationCircuit<F> {
304312
.sc_phase1
305313
.verifiy_sumcheck(&poly_sc1_vars, &claim_phase1_var, &mut transcript_var)?;
306314

315+
// The prover sends (rx, ry) to the verifier for the evaluation proof so
316+
// the constraints need to ensure it is indeed the result from the first
317+
// round of sumcheck verification.
318+
for (i, r) in claimed_rx_vars.iter().enumerate() {
319+
rx_var[i].enforce_equal(r)?;
320+
}
321+
307322
let (Az_claim, Bz_claim, Cz_claim, prod_Az_Bz_claims) = &self.claims_phase2;
308323

309324
let Az_claim_var = FpVar::<F>::new_witness(cs.clone(), || Ok(Az_claim))?;
@@ -344,6 +359,7 @@ impl<F: PrimeField> ConstraintSynthesizer<F> for R1CSVerificationCircuit<F> {
344359
// claimed point, coming from the prover, is actually the point derived
345360
// inside the circuit. These additional checks will be removed
346361
// when the commitment verification is done inside the circuit.
362+
// Moreover, (rx, ry) will be used in the evaluation proof.
347363
for (i, r) in claimed_ry_vars.iter().enumerate() {
348364
ry_var[i].enforce_equal(r)?;
349365
}
@@ -401,6 +417,7 @@ pub struct VerifierConfig<E: Pairing> {
401417
pub eval_vars_at_ry: E::ScalarField,
402418
pub polys_sc1: Vec<UniPoly<E::ScalarField>>,
403419
pub polys_sc2: Vec<UniPoly<E::ScalarField>>,
420+
pub rx: Vec<E::ScalarField>,
404421
pub ry: Vec<E::ScalarField>,
405422
pub transcript_sat_state: E::ScalarField,
406423
}

src/r1csproof.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ pub struct R1CSVerifierProof<E: Pairing> {
5858
initial_state: E::ScalarField,
5959
transcript_sat_state: E::ScalarField,
6060
eval_vars_at_ry: E::ScalarField,
61-
ry: Vec<E::ScalarField>,
6261
proof_eval_vars_at_ry: Proof<E>,
6362
t: E::TargetField,
6463
mipp_proof: MippProof<E>,
@@ -138,6 +137,9 @@ where
138137
sc_phase2: SumcheckVerificationCircuit {
139138
polys: uni_polys_round2,
140139
},
140+
claimed_rx: (0..num_cons.log_2())
141+
.map(|_i| E::ScalarField::rand(&mut rng))
142+
.collect_vec(),
141143
claimed_ry: (0..num_vars.log_2() + 1)
142144
.map(|_i| E::ScalarField::rand(&mut rng))
143145
.collect_vec(),
@@ -407,6 +409,7 @@ where
407409
eval_vars_at_ry: self.eval_vars_at_ry,
408410
input_as_sparse_poly,
409411
comm: self.comm.clone(),
412+
rx: self.rx.clone(),
410413
ry: self.ry.clone(),
411414
transcript_sat_state: self.transcript_sat_state,
412415
};
@@ -423,7 +426,6 @@ where
423426
initial_state: self.initial_state,
424427
transcript_sat_state: self.transcript_sat_state,
425428
eval_vars_at_ry: self.eval_vars_at_ry,
426-
ry: self.ry.clone(),
427429
proof_eval_vars_at_ry: self.proof_eval_vars_at_ry.clone(),
428430
t: self.t,
429431
mipp_proof: self.mipp_proof.clone(),
@@ -439,15 +441,18 @@ where
439441
// commitment opening.
440442
pub fn verify(
441443
&self,
444+
r: (Vec<E::ScalarField>, Vec<E::ScalarField>),
442445
input: &[E::ScalarField],
443446
evals: &(E::ScalarField, E::ScalarField, E::ScalarField),
444447
transcript: &mut PoseidonTranscript<E::ScalarField>,
445448
gens: &R1CSGens<E>,
446449
) -> Result<bool, ProofVerifyError> {
450+
let (rx, ry) = &r;
447451
let (Ar, Br, Cr) = evals;
448452
let mut pubs = vec![self.initial_state];
449453
pubs.extend(input.clone());
450-
pubs.extend(self.ry.clone());
454+
pubs.extend(rx.clone());
455+
pubs.extend(ry.clone());
451456
pubs.extend(vec![
452457
self.eval_vars_at_ry,
453458
*Ar,
@@ -466,7 +471,7 @@ where
466471
transcript,
467472
&gens.gens_pc.vk,
468473
&self.comm,
469-
&self.ry[1..],
474+
&ry[1..],
470475
self.eval_vars_at_ry,
471476
&self.proof_eval_vars_at_ry,
472477
&self.mipp_proof,
@@ -616,7 +621,13 @@ mod tests {
616621

617622
let mut verifier_transcript = PoseidonTranscript::new(&params.clone());
618623
assert!(verifer_proof
619-
.verify(&input, &inst_evals, &mut verifier_transcript, &gens)
624+
.verify(
625+
(rx, ry),
626+
&input,
627+
&inst_evals,
628+
&mut verifier_transcript,
629+
&gens
630+
)
620631
.is_ok());
621632
}
622633
}

src/testudo_nizk.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ where
126126

127127
// Verifies the satisfiability proof for the R1CS instance. In NIZK mode, the
128128
// verifier evaluates matrices A, B and C themselves, which is a linear
129-
// operation and hence this is not a SNARK.
129+
// operation and hence this is not a SNARK.
130130
// However, for highly structured circuits this operation is fast.
131131
pub fn verify(
132132
&self,
@@ -141,6 +141,7 @@ where
141141
let inst_evals = inst.inst.evaluate(claimed_rx, claimed_ry);
142142

143143
let sat_verified = self.r1cs_verifier_proof.verify(
144+
(claimed_rx.clone(), claimed_ry.clone()),
144145
&input.assignment,
145146
&inst_evals,
146147
transcript,

src/testudo_snark.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,11 @@ where
202202
transcript: &mut PoseidonTranscript<E::ScalarField>,
203203
_poseidon: PoseidonConfig<E::ScalarField>,
204204
) -> Result<bool, ProofVerifyError> {
205+
let (rx, ry) = &self.r;
206+
205207
let timer_sat_verification = Timer::new("r1cs_sat_verification");
206208
let sat_verified = self.r1cs_verifier_proof.verify(
209+
(rx.clone(), ry.clone()),
207210
&input.assignment,
208211
&self.inst_evals,
209212
transcript,
@@ -217,7 +220,6 @@ where
217220
transcript.append_scalar(b"", Br);
218221
transcript.append_scalar(b"", Cr);
219222

220-
let (rx, ry) = &self.r;
221223
let timer_eval_verification = Timer::new("r1cs_eval_verification");
222224
let eval_verified = self.r1cs_eval_proof.verify(
223225
&comm.comm,

0 commit comments

Comments
 (0)