use super::TurboComposer;
use crate::commitment_scheme::PublicParameters;
use crate::constraint_system::Constraint;
use crate::error::Error;
use crate::plonkup::LookupTable;
use crate::proof_system::{Prover, Verifier};
use dusk_bls12_381::BlsScalar;
use rand_core::OsRng;
pub(crate) fn dummy_gadget(n: usize, composer: &mut TurboComposer) {
let one = BlsScalar::one();
let one = composer.append_witness(one);
for _ in 0..n {
let constraint = Constraint::new().left(1).right(1).a(one).b(one);
composer.gate_add(constraint);
}
}
pub(crate) fn dummy_gadget_plonkup(n: usize, composer: &mut TurboComposer) {
let one = BlsScalar::one();
let one = composer.append_witness(one);
for _ in 0..n {
let constraint = Constraint::new().left(1).right(1).a(one).b(one);
composer.gate_add(constraint);
}
}
pub(crate) fn gadget_tester(
gadget: fn(composer: &mut TurboComposer),
n: usize,
) -> Result<(), Error> {
let public_parameters = PublicParameters::setup(2 * n, &mut OsRng)?;
let (proof, public_inputs) = {
let mut prover = Prover::new(b"demo");
prover.key_transcript(b"key", b"additional seed information");
gadget(&mut prover.composer_mut());
let (ck, _) = public_parameters
.trim(2 * prover.cs.gates().next_power_of_two())?;
prover.preprocess(&ck)?;
let public_inputs = prover.cs.to_dense_public_inputs();
(prover.prove(&ck)?, public_inputs)
};
let mut verifier = Verifier::new(b"demo");
verifier.key_transcript(b"key", b"additional seed information");
gadget(&mut verifier.composer_mut());
let (ck, vk) =
public_parameters.trim(verifier.cs.gates().next_power_of_two())?;
verifier.preprocess(&ck)?;
verifier.verify(&proof, &vk, &public_inputs)
}
pub(crate) fn gadget_plonkup_tester(
gadget: fn(composer: &mut TurboComposer),
n: usize,
lookup_table: LookupTable,
) -> Result<(), Error> {
let public_parameters = PublicParameters::setup(2 * n, &mut OsRng)?;
let (proof, public_inputs) = {
let mut prover = Prover::new(b"demo");
prover.composer_mut().append_plonkup_table(&lookup_table);
prover.key_transcript(b"key", b"additional seed information");
gadget(&mut prover.composer_mut());
let (ck, _) = public_parameters
.trim(2 * prover.cs.gates().next_power_of_two())?;
prover.preprocess(&ck)?;
let public_inputs = prover.cs.to_dense_public_inputs();
(prover.prove(&ck)?, public_inputs)
};
let mut verifier = Verifier::new(b"demo");
verifier.composer_mut().append_plonkup_table(&lookup_table);
verifier.key_transcript(b"key", b"additional seed information");
gadget(&mut verifier.composer_mut());
let (ck, vk) =
public_parameters.trim(verifier.cs.gates().next_power_of_two())?;
verifier.preprocess(&ck)?;
verifier.verify(&proof, &vk, &public_inputs)
}