use plonky2::field::extension_field::Extendable; use plonky2::fri::oracle::PolynomialBatch; use plonky2::fri::proof::{CompressedFriProof, FriChallenges, FriProof, FriProofTarget}; use plonky2::fri::structure::{FriOpeningBatch, FriOpenings}; use plonky2::hash::hash_types::{MerkleCapTarget, RichField}; use plonky2::hash::merkle_tree::MerkleCap; use plonky2::iop::ext_target::ExtensionTarget; use plonky2::iop::target::Target; use plonky2::plonk::config::GenericConfig; use rayon::prelude::*; pub struct StarkProof, C: GenericConfig, const D: usize> { /// Merkle cap of LDEs of trace values. pub trace_cap: MerkleCap, /// Merkle cap of LDEs of trace values. pub quotient_polys_cap: MerkleCap, /// Purported values of each polynomial at the challenge point. pub openings: StarkOpeningSet, /// A batch FRI argument for all openings. pub opening_proof: FriProof, } pub struct StarkProofTarget { pub trace_cap: MerkleCapTarget, pub quotient_polys_cap: MerkleCapTarget, pub openings: StarkOpeningSetTarget, pub opening_proof: FriProofTarget, } pub struct StarkProofWithPublicInputs< F: RichField + Extendable, C: GenericConfig, const D: usize, > { pub proof: StarkProof, // TODO: Maybe make it generic over a `S: Stark` and replace with `[F; S::PUBLIC_INPUTS]`. pub public_inputs: Vec, } pub struct StarkProofWithPublicInputsTarget { pub proof: StarkProofTarget, pub public_inputs: Vec, } pub struct CompressedStarkProof< F: RichField + Extendable, C: GenericConfig, const D: usize, > { /// Merkle cap of LDEs of trace values. pub trace_cap: MerkleCap, /// Purported values of each polynomial at the challenge point. pub openings: StarkOpeningSet, /// A batch FRI argument for all openings. pub opening_proof: CompressedFriProof, } pub struct CompressedStarkProofWithPublicInputs< F: RichField + Extendable, C: GenericConfig, const D: usize, > { pub proof: CompressedStarkProof, pub public_inputs: Vec, } pub(crate) struct StarkProofChallenges, const D: usize> { /// Random values used to combine STARK constraints. pub stark_alphas: Vec, /// Point at which the STARK polynomials are opened. pub stark_zeta: F::Extension, pub fri_challenges: FriChallenges, } /// Purported values of each polynomial at the challenge point. pub struct StarkOpeningSet, const D: usize> { pub local_values: Vec, pub next_values: Vec, pub permutation_zs: Vec, pub permutation_zs_right: Vec, pub quotient_polys: Vec, } impl, const D: usize> StarkOpeningSet { pub fn new>( zeta: F::Extension, g: F::Extension, trace_commitment: &PolynomialBatch, quotient_commitment: &PolynomialBatch, ) -> Self { let eval_commitment = |z: F::Extension, c: &PolynomialBatch| { c.polynomials .par_iter() .map(|p| p.to_extension().eval(z)) .collect::>() }; Self { local_values: eval_commitment(zeta, trace_commitment), next_values: eval_commitment(zeta * g, trace_commitment), permutation_zs: vec![/*TODO*/], permutation_zs_right: vec![/*TODO*/], quotient_polys: eval_commitment(zeta, quotient_commitment), } } pub(crate) fn to_fri_openings(&self) -> FriOpenings { let zeta_batch = FriOpeningBatch { values: [ self.local_values.as_slice(), self.quotient_polys.as_slice(), self.permutation_zs.as_slice(), ] .concat(), }; let zeta_right_batch = FriOpeningBatch { values: [ self.next_values.as_slice(), self.permutation_zs_right.as_slice(), ] .concat(), }; FriOpenings { batches: vec![zeta_batch, zeta_right_batch], } } } pub struct StarkOpeningSetTarget { pub local_values: Vec>, pub next_values: Vec>, pub permutation_zs: Vec>, pub permutation_zs_right: Vec>, pub quotient_polys: Vec>, }