// Copyright (c) 2022 Espresso Systems (espressosys.com)
// This file is part of the Jellyfish library.
// You should have received a copy of the MIT License
// along with the Jellyfish library. If not, see .
use ark_bls12_381::{Bls12_381, Fr as Fr381};
use ark_ec::{
PairingEngine,
};
use ark_ff::PrimeField;
use ark_std::{UniformRand};
use jf_plonk::{
circuit::{Arithmetization, Circuit, PlonkCircuit},
errors::PlonkError,
proof_system::{PlonkKzgSnark, Snark},
transcript::StandardTranscript,
};
use rand_chacha::ChaCha20Rng;
use ark_std::rand::SeedableRng;
#[allow(non_snake_case)]
fn main() -> Result<(), PlonkError> {
let mut rng = ChaCha20Rng::from_seed([0u8; 32]);
let x = Fr381::rand(&mut rng);
let circuit = range_circuit::(x)?;
let srs_size = circuit.srs_size()?;
let srs = PlonkKzgSnark::::universal_setup(srs_size, &mut rng)?;
let (pk, vk) = PlonkKzgSnark::::preprocess(&srs, &circuit)?;
let proof = PlonkKzgSnark::::prove::<_, _, StandardTranscript>(
&mut rng, &circuit, &pk, None,
)?;
let public_inputs = circuit.public_input().unwrap();
let extra_transcript_init_msg = None;
assert!(PlonkKzgSnark::::verify::(
&vk,
&public_inputs,
&proof,
extra_transcript_init_msg,
)
.is_ok());
Ok(())
}
#[allow(non_snake_case)]
fn range_circuit(
x: F,
) -> Result, PlonkError>
{
let mut circuit: PlonkCircuit = PlonkCircuit::new_turbo_plonk();
let x_var = circuit.create_variable(x)?;
circuit.range_gate(x_var, 10)?;
circuit.finalize_for_arithmetization()?;
Ok(circuit)
}