mirror of
https://github.com/arnaucube/hyperplonk.git
synced 2026-01-11 16:41:28 +01:00
PCS crate moved to other repository.
This commit is contained in:
@@ -7,7 +7,6 @@ edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
poly-iop = { path = "../poly-iop" }
|
||||
pcs = { path = "../pcs" }
|
||||
|
||||
ark-std = { version = "^0.3.0", default-features = false }
|
||||
ark-ec = { version = "^0.3.0", default-features = false }
|
||||
@@ -19,6 +18,7 @@ displaydoc = { version = "0.2.3", default-features = false }
|
||||
transcript = { path = "../transcript" }
|
||||
arithmetic = { path = "../arithmetic" }
|
||||
|
||||
jf-primitives = { git = "https://github.com/EspressoSystems/jellyfish" }
|
||||
|
||||
[dev-dependencies]
|
||||
ark-bls12-381 = { version = "0.3.0", default-features = false, features = [ "curve" ] }
|
||||
@@ -36,12 +36,12 @@ parallel = [
|
||||
"ark-poly/parallel",
|
||||
"ark-ec/parallel",
|
||||
"poly-iop/parallel",
|
||||
"pcs/parallel",
|
||||
"arithmetic/parallel",
|
||||
"jf-primitives/parallel",
|
||||
]
|
||||
print-trace = [
|
||||
"ark-std/print-trace",
|
||||
"poly-iop/print-trace",
|
||||
"pcs/print-trace",
|
||||
"arithmetic/print-trace",
|
||||
"jf-primitives/print-trace",
|
||||
]
|
||||
@@ -4,7 +4,7 @@ use arithmetic::ArithErrors;
|
||||
use ark_serialize::SerializationError;
|
||||
use ark_std::string::String;
|
||||
use displaydoc::Display;
|
||||
use pcs::prelude::PCSErrors;
|
||||
use jf_primitives::pcs::prelude::PCSError;
|
||||
use poly_iop::prelude::PolyIOPErrors;
|
||||
use transcript::TranscriptErrors;
|
||||
|
||||
@@ -24,7 +24,7 @@ pub enum HyperPlonkErrors {
|
||||
/// PolyIOP error {0}
|
||||
PolyIOPErrors(PolyIOPErrors),
|
||||
/// PCS error {0}
|
||||
PCSErrors(PCSErrors),
|
||||
PCSError(PCSError),
|
||||
/// Transcript error {0}
|
||||
TranscriptError(TranscriptErrors),
|
||||
/// Arithmetic Error: {0}
|
||||
@@ -43,9 +43,9 @@ impl From<PolyIOPErrors> for HyperPlonkErrors {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<PCSErrors> for HyperPlonkErrors {
|
||||
fn from(e: PCSErrors) -> Self {
|
||||
Self::PCSErrors(e)
|
||||
impl From<PCSError> for HyperPlonkErrors {
|
||||
fn from(e: PCSError) -> Self {
|
||||
Self::PCSError(e)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,14 +4,17 @@ use crate::utils::{eval_f, prove_sanity_check};
|
||||
use arithmetic::VPAuxInfo;
|
||||
use ark_ec::PairingEngine;
|
||||
use ark_poly::{DenseMultilinearExtension, MultilinearExtension};
|
||||
use ark_std::{end_timer, log2, start_timer, One, Zero};
|
||||
use ark_std::{
|
||||
borrow::Borrow, end_timer, log2, marker::PhantomData, rc::Rc, start_timer, One, Zero,
|
||||
};
|
||||
use errors::HyperPlonkErrors;
|
||||
use pcs::prelude::{compute_qx_degree, merge_polynomials, PCSErrors, PolynomialCommitmentScheme};
|
||||
use jf_primitives::pcs::prelude::{
|
||||
compute_qx_degree, merge_polynomials, PCSError, PolynomialCommitmentScheme,
|
||||
};
|
||||
use poly_iop::{
|
||||
prelude::{identity_permutation_mle, PermutationCheck, ZeroCheck},
|
||||
PolyIOP,
|
||||
};
|
||||
use std::{marker::PhantomData, rc::Rc};
|
||||
use structs::{HyperPlonkIndex, HyperPlonkProof, HyperPlonkProvingKey, HyperPlonkVerifyingKey};
|
||||
use transcript::IOPTranscript;
|
||||
use utils::{build_f, gen_eval_point};
|
||||
@@ -47,7 +50,7 @@ where
|
||||
/// polynomial commitments
|
||||
fn preprocess(
|
||||
index: &Self::Index,
|
||||
pcs_srs: &PCS::SRS,
|
||||
pcs_srs: impl Borrow<PCS::SRS>,
|
||||
) -> Result<(Self::ProvingKey, Self::VerifyingKey), HyperPlonkErrors>;
|
||||
|
||||
/// Generate HyperPlonk SNARK proof.
|
||||
@@ -59,7 +62,7 @@ where
|
||||
/// Outputs:
|
||||
/// - The HyperPlonk SNARK proof.
|
||||
fn prove(
|
||||
pk: &Self::ProvingKey,
|
||||
pk: impl Borrow<Self::ProvingKey>,
|
||||
pub_input: &[E::Fr],
|
||||
witnesses: &[WitnessColumn<E::Fr>],
|
||||
) -> Result<Self::Proof, HyperPlonkErrors>;
|
||||
@@ -73,7 +76,7 @@ where
|
||||
/// Outputs:
|
||||
/// - Return a boolean on whether the verification is successful
|
||||
fn verify(
|
||||
vk: &Self::VerifyingKey,
|
||||
vk: impl Borrow<Self::VerifyingKey>,
|
||||
pub_input: &[E::Fr],
|
||||
proof: &Self::Proof,
|
||||
) -> Result<bool, HyperPlonkErrors>;
|
||||
@@ -99,7 +102,7 @@ where
|
||||
|
||||
fn preprocess(
|
||||
index: &Self::Index,
|
||||
pcs_srs: &PCS::SRS,
|
||||
pcs_srs: impl Borrow<PCS::SRS>,
|
||||
) -> Result<(Self::ProvingKey, Self::VerifyingKey), HyperPlonkErrors> {
|
||||
let num_vars = index.params.nv;
|
||||
let log_num_witness_polys = index.params.log_n_wires;
|
||||
@@ -133,7 +136,7 @@ where
|
||||
let selector_com = selector_oracles
|
||||
.iter()
|
||||
.map(|poly| PCS::commit(&pcs_prover_param, poly))
|
||||
.collect::<Result<Vec<PCS::Commitment>, PCSErrors>>()?;
|
||||
.collect::<Result<Vec<PCS::Commitment>, PCSError>>()?;
|
||||
|
||||
Ok((
|
||||
Self::ProvingKey {
|
||||
@@ -186,10 +189,11 @@ where
|
||||
///
|
||||
/// TODO: this function is gigantic -- refactor it to smaller ones
|
||||
fn prove(
|
||||
pk: &Self::ProvingKey,
|
||||
pk: impl Borrow<Self::ProvingKey>,
|
||||
pub_input: &[E::Fr],
|
||||
witnesses: &[WitnessColumn<E::Fr>],
|
||||
) -> Result<Self::Proof, HyperPlonkErrors> {
|
||||
let pk = pk.borrow();
|
||||
let start = start_timer!(|| "hyperplonk proving");
|
||||
let mut transcript = IOPTranscript::<E::Fr>::new(b"hyperplonk");
|
||||
|
||||
@@ -219,7 +223,7 @@ where
|
||||
// transcript
|
||||
// =======================================================================
|
||||
let step = start_timer!(|| "commit witnesses");
|
||||
let w_merged = merge_polynomials(&witness_polys)?;
|
||||
let w_merged = Rc::new(merge_polynomials(&witness_polys)?);
|
||||
if w_merged.num_vars != merged_nv {
|
||||
return Err(HyperPlonkErrors::InvalidParameters(format!(
|
||||
"merged witness poly has a different num_vars ({}) from expected ({})",
|
||||
@@ -590,10 +594,11 @@ where
|
||||
/// - check zero check evaluations
|
||||
/// - public input consistency checks
|
||||
fn verify(
|
||||
vk: &Self::VerifyingKey,
|
||||
vk: impl Borrow<Self::VerifyingKey>,
|
||||
pub_input: &[E::Fr],
|
||||
proof: &Self::Proof,
|
||||
) -> Result<bool, HyperPlonkErrors> {
|
||||
let vk = vk.borrow();
|
||||
let start = start_timer!(|| "hyperplonk verification");
|
||||
|
||||
let mut transcript = IOPTranscript::<E::Fr>::new(b"hyperplonk");
|
||||
@@ -925,7 +930,7 @@ mod tests {
|
||||
};
|
||||
use ark_bls12_381::Bls12_381;
|
||||
use ark_std::test_rng;
|
||||
use pcs::prelude::KZGMultilinearPCS;
|
||||
use jf_primitives::pcs::prelude::MultilinearKzgPCS;
|
||||
use poly_iop::prelude::random_permutation_mle;
|
||||
|
||||
#[test]
|
||||
@@ -957,7 +962,7 @@ mod tests {
|
||||
gate_func: CustomizedGates,
|
||||
) -> Result<(), HyperPlonkErrors> {
|
||||
let mut rng = test_rng();
|
||||
let pcs_srs = KZGMultilinearPCS::<E>::gen_srs_for_testing(&mut rng, 15)?;
|
||||
let pcs_srs = MultilinearKzgPCS::<E>::gen_srs_for_testing(&mut rng, 15)?;
|
||||
let merged_nv = nv + log_n_wires;
|
||||
|
||||
// generate index
|
||||
@@ -977,7 +982,7 @@ mod tests {
|
||||
};
|
||||
|
||||
// generate pk and vks
|
||||
let (pk, vk) = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::preprocess(
|
||||
let (pk, vk) = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::preprocess(
|
||||
&index, &pcs_srs,
|
||||
)?;
|
||||
|
||||
@@ -999,13 +1004,13 @@ mod tests {
|
||||
let pi = w1.clone();
|
||||
|
||||
// generate a proof and verify
|
||||
let proof = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::prove(
|
||||
let proof = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::prove(
|
||||
&pk,
|
||||
&pi.0,
|
||||
&[w1.clone(), w2.clone()],
|
||||
)?;
|
||||
|
||||
let _verify = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::verify(
|
||||
let _verify = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::verify(
|
||||
&vk, &pi.0, &proof,
|
||||
)?;
|
||||
|
||||
@@ -1013,24 +1018,24 @@ mod tests {
|
||||
let rand_perm: Vec<E::Fr> = random_permutation_mle(merged_nv, &mut rng)
|
||||
.evaluations
|
||||
.clone();
|
||||
let mut bad_index = index.clone();
|
||||
let mut bad_index = index;
|
||||
bad_index.permutation = rand_perm;
|
||||
// generate pk and vks
|
||||
let (_, bad_vk) = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::preprocess(
|
||||
let (_, bad_vk) = <PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::preprocess(
|
||||
&bad_index, &pcs_srs,
|
||||
)?;
|
||||
assert!(
|
||||
<PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::verify(
|
||||
<PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::verify(
|
||||
&bad_vk, &pi.0, &proof,
|
||||
)
|
||||
.is_err()
|
||||
);
|
||||
|
||||
// bad path 2: wrong witness
|
||||
let mut w1_bad = w1.clone();
|
||||
let mut w1_bad = w1;
|
||||
w1_bad.0[0] = E::Fr::one();
|
||||
assert!(
|
||||
<PolyIOP<E::Fr> as HyperPlonkSNARK<E, KZGMultilinearPCS<E>>>::prove(
|
||||
<PolyIOP<E::Fr> as HyperPlonkSNARK<E, MultilinearKzgPCS<E>>>::prove(
|
||||
&pk,
|
||||
&pi.0,
|
||||
&[w1_bad, w2],
|
||||
|
||||
@@ -5,7 +5,7 @@ use ark_ec::PairingEngine;
|
||||
use ark_ff::PrimeField;
|
||||
use ark_poly::DenseMultilinearExtension;
|
||||
use ark_std::cmp::max;
|
||||
use pcs::PolynomialCommitmentScheme;
|
||||
use jf_primitives::pcs::PolynomialCommitmentScheme;
|
||||
use poly_iop::prelude::{PermutationCheck, ZeroCheck};
|
||||
use std::rc::Rc;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user