Feature/traits (#3)

* feat: draft traits `FoldingScheme` and `Decider`

Co-authored-by: arnaucube <root@arnaucube.com>

* Add Transcript trait, with PoseidonTranscript impl (#1)

Add also the PoseidonTranscriptVar (gadget).

* Update FoldingScheme trait to take C1 & C2 as params (#2)

* Update FoldingScheme trait to take C1 & C2 as params

Update FoldingScheme trait to take C1 & C2 as params which are used by
the diverse folding schemes as a cycle of curves.

* Add constraint to FoldingScheme C1,C2 fields swap.

Co-authored-by: Han <tinghan0110@gmail.com>

---------

Co-authored-by: Han <tinghan0110@gmail.com>

* move transcript to it's own mod

---------

Co-authored-by: han0110 <tinghan0110@gmail.com>
This commit is contained in:
arnaucube
2023-08-17 10:32:26 +02:00
committed by GitHub
parent eea9bf2a88
commit 16e261bbed
5 changed files with 240 additions and 0 deletions

85
src/lib.rs Normal file
View File

@@ -0,0 +1,85 @@
#![allow(non_snake_case)]
#![allow(non_upper_case_globals)]
use ark_ec::CurveGroup;
use ark_ff::PrimeField;
use ark_std::{fmt::Debug, rand::RngCore};
use thiserror::Error;
pub mod transcript;
use transcript::Transcript;
#[derive(Debug, Error)]
pub enum Error {
#[error("Relation not satisfied")]
NotSatisfied,
}
/// FoldingScheme defines trait that is implemented by the diverse folding schemes. It is defined
/// over a cycle of curves (C1, C2), where:
/// - C1 is the main curve, which ScalarField we use as our F for al the field operations
/// - C2 is the auxiliary curve, which we use for the commitments, whose BaseField (for point
/// coordinates) are in the C1::ScalarField
pub trait FoldingScheme<C1: CurveGroup, C2: CurveGroup>: Clone + Debug
where
C1: CurveGroup<BaseField = C2::ScalarField, ScalarField = C2::BaseField>,
C2::BaseField: PrimeField,
{
// type PCS: PolynomialCommitmentScheme<C>; // maybe not needed, just PedersenCommitment
type PreprocessorParam: Debug;
type ProverParam: Debug;
type VerifierParam: Debug;
type FreshInstance: Debug;
type PublicInput: Debug;
type CommittedInstanceWithWitness: Debug;
type CommittedInstance: Clone + Debug;
fn preprocess(
// pcs_param: &<Self::CS as PolynomialCommitmentScheme<C>>::Param,
prep_param: &Self::PreprocessorParam,
) -> Result<(Self::ProverParam, Self::VerifierParam), Error>;
fn init_accumulator(
pp: &Self::ProverParam,
) -> Result<Self::CommittedInstanceWithWitness, Error>;
fn prove(
pp: &Self::ProverParam,
running_instance: &mut Self::CommittedInstanceWithWitness,
incomming_instances: &[Self::FreshInstance],
transcript: &mut impl Transcript<C1::ScalarField>,
rng: impl RngCore,
) -> Result<(), Error>;
fn verify(
vp: &Self::VerifierParam,
running_instance: &mut Self::CommittedInstance,
incomming_instances: &[Self::PublicInput],
transcript: &mut impl Transcript<C1::ScalarField>,
rng: impl RngCore,
) -> Result<(), Error>;
}
pub trait Decider<C: CurveGroup>: Clone + Debug {
type PreprocessorParam: Debug;
type ProverParam: Debug;
type VerifierParam: Debug;
type FreshInstance: Debug;
type PublicInput: Debug;
type CommittedInstanceWithWitness: Debug;
type CommittedInstance: Clone + Debug;
fn prove(
pp: &Self::ProverParam,
running_instance: &Self::CommittedInstanceWithWitness,
transcript: &mut impl Transcript<C::ScalarField>,
rng: impl RngCore,
) -> Result<(), Error>;
fn verify(
vp: &Self::VerifierParam,
running_instance: &Self::CommittedInstance,
transcript: &mut impl Transcript<C::ScalarField>,
rng: impl RngCore,
) -> Result<(), Error>;
}