diff --git a/src/plonk.rs b/src/plonk.rs index e0accee..244d205 100644 --- a/src/plonk.rs +++ b/src/plonk.rs @@ -91,6 +91,10 @@ impl VerifyingKey { } } +#[derive(Clone, Copy, Debug)] +struct Theta; +type ChallengeTheta = ChallengeScalar; + #[derive(Clone, Copy, Debug)] struct Beta; type ChallengeBeta = ChallengeScalar; diff --git a/src/plonk/prover.rs b/src/plonk/prover.rs index bce29c1..3c5830f 100644 --- a/src/plonk/prover.rs +++ b/src/plonk/prover.rs @@ -3,7 +3,8 @@ use std::iter; use super::{ circuit::{Advice, Assignment, Circuit, Column, ConstraintSystem, Fixed}, - permutation, ChallengeBeta, ChallengeGamma, ChallengeX, ChallengeY, Error, Proof, ProvingKey, + permutation, ChallengeBeta, ChallengeGamma, ChallengeTheta, ChallengeX, ChallengeY, Error, + Proof, ProvingKey, }; use crate::arithmetic::{eval_polynomial, Curve, CurveAffine, FieldExt}; use crate::poly::{ @@ -168,6 +169,9 @@ impl Proof { }) .collect(); + // Sample theta challenge for keeping lookup columns linearly independent + let theta = ChallengeTheta::::get(&mut transcript); + // Sample beta challenge let beta = ChallengeBeta::get(&mut transcript); diff --git a/src/plonk/verifier.rs b/src/plonk/verifier.rs index 4925dbd..c005c9d 100644 --- a/src/plonk/verifier.rs +++ b/src/plonk/verifier.rs @@ -1,7 +1,10 @@ use ff::Field; use std::iter; -use super::{ChallengeBeta, ChallengeGamma, ChallengeX, ChallengeY, Error, Proof, VerifyingKey}; +use super::{ + ChallengeBeta, ChallengeGamma, ChallengeTheta, ChallengeX, ChallengeY, Error, Proof, + VerifyingKey, +}; use crate::arithmetic::{CurveAffine, FieldExt}; use crate::poly::{ commitment::{Guard, Params, MSM}, @@ -45,6 +48,9 @@ impl<'a, C: CurveAffine> Proof { .map_err(|_| Error::TranscriptError)?; } + // Sample theta challenge for keeping lookup columns linearly independent + let theta = ChallengeTheta::get(&mut transcript); + // Sample beta challenge let beta = ChallengeBeta::get(&mut transcript); @@ -72,7 +78,7 @@ impl<'a, C: CurveAffine> Proof { // This check ensures the circuit is satisfied so long as the polynomial // commitments open to the correct values. - self.check_hx(params, vk, beta, gamma, y, x)?; + self.check_hx(params, vk, theta, beta, gamma, y, x)?; for eval in self .advice_evals @@ -189,6 +195,7 @@ impl<'a, C: CurveAffine> Proof { &self, params: &'a Params, vk: &VerifyingKey, + theta: ChallengeTheta, beta: ChallengeBeta, gamma: ChallengeGamma, y: ChallengeY,