Skip to content

Commit

Permalink
Merge pull request #6 from PayneJoe/ark-nifs
Browse files Browse the repository at this point in the history
protostar style cross term
  • Loading branch information
PayneJoe authored Dec 14, 2023
2 parents f1ec968 + 1be1038 commit 08fefc5
Show file tree
Hide file tree
Showing 7 changed files with 705 additions and 72 deletions.
8 changes: 8 additions & 0 deletions src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,12 @@ pub enum MyError {
/// commitment error
#[error("commitment error")]
CommitmentError,
/// witness error
#[error("witness erro")]
WitnessError,
/// public intput error
#[error("public input error")]
PublicIntputError,
#[error("Selector error")]
SelectorError,
}
1 change: 0 additions & 1 deletion src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
pub mod error;
pub mod nifs;
pub mod plonk;
pub mod poseidon;
pub mod primary;
pub mod secondary;
78 changes: 9 additions & 69 deletions src/nifs.rs
Original file line number Diff line number Diff line change
@@ -1,73 +1,13 @@
use ark_ec::{pairing::Pairing, scalar_mul::fixed_base::FixedBase, CurveGroup};
use ark_ff::PrimeField;
use ark_poly::{univariate::DensePolynomial, DenseUVPolynomial};
use ark_std::{
end_timer,
rand::{CryptoRng, RngCore},
start_timer, vec, One, UniformRand,
};

use jf_primitives::pcs::{
prelude::{PCSError, UnivariateKzgPCS, UnivariateUniversalParams},
PolynomialCommitmentScheme, StructuredReferenceString,
};

pub(crate) fn gen_srs_for_testing<E: Pairing, R: RngCore + CryptoRng>(
rng: &mut R,
prover_degree: usize,
verifier_degree: usize,
) -> Result<UnivariateUniversalParams<E>, PCSError> {
let setup_time = start_timer!(|| ark_std::format!(
"KZG10::Setup with prover degree {} and verifier degree {}",
prover_degree,
verifier_degree
));
let beta = E::ScalarField::rand(rng);
let g = E::G1::rand(rng);
let h = E::G2::rand(rng);

let mut powers_of_beta = vec![E::ScalarField::one()];

let mut cur = beta;
let max_degree = ark_std::cmp::max(prover_degree, verifier_degree);
for _ in 0..max_degree {
powers_of_beta.push(cur);
cur *= &beta;
}

let window_size = FixedBase::get_mul_window_size(prover_degree + 1);

let scalar_bits = E::ScalarField::MODULUS_BIT_SIZE as usize;
let g_time = start_timer!(|| "Generating powers of G");
// TODO: parallelization
let g_table = FixedBase::get_window_table(scalar_bits, window_size, g);
let powers_of_g = FixedBase::msm::<E::G1>(scalar_bits, window_size, &g_table, &powers_of_beta);
end_timer!(g_time);

let powers_of_g = E::G1::normalize_batch(&powers_of_g);

let h = h.into_affine();
let beta_h = (h * beta).into_affine();

let powers_of_h = powers_of_beta
.iter()
.take(verifier_degree + 1)
.map(|x| (h * x).into_affine())
.collect();

let pp = UnivariateUniversalParams {
powers_of_g,
h,
beta_h,
powers_of_h,
};
end_timer!(setup_time);
Ok(pp)
}

#[cfg(test)]
mod tests {
use super::*;
use ark_ec::pairing::Pairing;
use ark_poly::{univariate::DensePolynomial, DenseUVPolynomial};
use jf_primitives::pcs::{
prelude::{UnivariateKzgPCS, UnivariateUniversalParams},
PolynomialCommitmentScheme, StructuredReferenceString,
};

use crate::primary::kzg::gen_srs_for_testing;
use ark_bn254::Bn254;
use jf_utils::test_rng;

Expand All @@ -83,8 +23,8 @@ mod tests {
degree, rng,
);
let comm = UnivariateKzgPCS::<E>::commit(&ck, &p).unwrap();
assert!(comm == comm, "");
}

#[test]
fn test_pcs() {
test_pcs_end_to_end_template::<Bn254>();
Expand Down
1 change: 0 additions & 1 deletion src/plonk.rs

This file was deleted.

65 changes: 64 additions & 1 deletion src/primary/kzg.rs
Original file line number Diff line number Diff line change
@@ -1 +1,64 @@
// kzg commitment scheme for bn254 curve which is pairing-friendly
/// kzg commitment scheme for bn254 curve which is pairing-friendly
///
use ark_ec::{pairing::Pairing, scalar_mul::fixed_base::FixedBase, CurveGroup};
use ark_ff::PrimeField;
use ark_std::{
end_timer,
rand::{CryptoRng, RngCore},
start_timer, vec, One, UniformRand,
};

use jf_primitives::pcs::prelude::{PCSError, UnivariateUniversalParams};

pub fn gen_srs_for_testing<E: Pairing, R: RngCore + CryptoRng>(
rng: &mut R,
prover_degree: usize,
verifier_degree: usize,
) -> Result<UnivariateUniversalParams<E>, PCSError> {
let setup_time = start_timer!(|| ark_std::format!(
"KZG10::Setup with prover degree {} and verifier degree {}",
prover_degree,
verifier_degree
));
let beta = E::ScalarField::rand(rng);
let g = E::G1::rand(rng);
let h = E::G2::rand(rng);

let mut powers_of_beta = vec![E::ScalarField::one()];

let mut cur = beta;
let max_degree = ark_std::cmp::max(prover_degree, verifier_degree);
for _ in 0..max_degree {
powers_of_beta.push(cur);
cur *= &beta;
}

let window_size = FixedBase::get_mul_window_size(prover_degree + 1);

let scalar_bits = E::ScalarField::MODULUS_BIT_SIZE as usize;
let g_time = start_timer!(|| "Generating powers of G");
// TODO: parallelization
let g_table = FixedBase::get_window_table(scalar_bits, window_size, g);
let powers_of_g = FixedBase::msm::<E::G1>(scalar_bits, window_size, &g_table, &powers_of_beta);
end_timer!(g_time);

let powers_of_g = E::G1::normalize_batch(&powers_of_g);

let h = h.into_affine();
let beta_h = (h * beta).into_affine();

let powers_of_h = powers_of_beta
.iter()
.take(verifier_degree + 1)
.map(|x| (h * x).into_affine())
.collect();

let pp = UnivariateUniversalParams {
powers_of_g,
h,
beta_h,
powers_of_h,
};
end_timer!(setup_time);
Ok(pp)
}
1 change: 1 addition & 0 deletions src/primary/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
pub mod bn254_curve;
pub mod bn254_field;
pub mod kzg;
pub mod plonk;
Loading

0 comments on commit 08fefc5

Please sign in to comment.