ark_linear_sumcheck/ml_sumcheck/
mod.rs1use crate::ml_sumcheck::data_structures::{ListOfProductsOfPolynomials, PolynomialInfo};
4use crate::ml_sumcheck::protocol::prover::{ProverMsg, ProverState};
5use crate::ml_sumcheck::protocol::verifier::SubClaim;
6use crate::ml_sumcheck::protocol::IPForMLSumcheck;
7use crate::rng::{Blake2s512Rng, FeedableRNG};
8use ark_ff::Field;
9use ark_std::marker::PhantomData;
10use ark_std::vec::Vec;
11
12pub mod protocol;
13
14pub mod data_structures;
15#[cfg(test)]
16mod test;
17
18pub struct MLSumcheck<F: Field>(#[doc(hidden)] PhantomData<F>);
20
21pub type Proof<F> = Vec<ProverMsg<F>>;
23
24impl<F: Field> MLSumcheck<F> {
25 pub fn extract_sum(proof: &Proof<F>) -> F {
27 proof[0].evaluations[0] + proof[0].evaluations[1]
28 }
29
30 pub fn prove(polynomial: &ListOfProductsOfPolynomials<F>) -> Result<Proof<F>, crate::Error> {
43 let mut fs_rng = Blake2s512Rng::setup();
44 Self::prove_as_subprotocol(&mut fs_rng, polynomial).map(|r| r.0)
45 }
46
47 pub fn prove_as_subprotocol(
51 fs_rng: &mut impl FeedableRNG<Error = crate::Error>,
52 polynomial: &ListOfProductsOfPolynomials<F>,
53 ) -> Result<(Proof<F>, ProverState<F>), crate::Error> {
54 fs_rng.feed(&polynomial.info())?;
55
56 let mut prover_state = IPForMLSumcheck::prover_init(polynomial);
57 let mut verifier_msg = None;
58 let mut prover_msgs = Vec::with_capacity(polynomial.num_variables);
59 for _ in 0..polynomial.num_variables {
60 let prover_msg = IPForMLSumcheck::prove_round(&mut prover_state, &verifier_msg);
61 fs_rng.feed(&prover_msg)?;
62 prover_msgs.push(prover_msg);
63 verifier_msg = Some(IPForMLSumcheck::sample_round(fs_rng));
64 }
65
66 Ok((prover_msgs, prover_state))
67 }
68
69 pub fn verify(
71 polynomial_info: &PolynomialInfo,
72 claimed_sum: F,
73 proof: &Proof<F>,
74 ) -> Result<SubClaim<F>, crate::Error> {
75 let mut fs_rng = Blake2s512Rng::setup();
76 Self::verify_as_subprotocol(&mut fs_rng, polynomial_info, claimed_sum, proof)
77 }
78
79 pub fn verify_as_subprotocol(
82 fs_rng: &mut impl FeedableRNG<Error = crate::Error>,
83 polynomial_info: &PolynomialInfo,
84 claimed_sum: F,
85 proof: &Proof<F>,
86 ) -> Result<SubClaim<F>, crate::Error> {
87 fs_rng.feed(polynomial_info)?;
88 let mut verifier_state = IPForMLSumcheck::verifier_init(polynomial_info);
89 for i in 0..polynomial_info.num_variables {
90 let prover_msg = proof.get(i).expect("proof is incomplete");
91 fs_rng.feed(prover_msg)?;
92 let _verifier_msg =
93 IPForMLSumcheck::verify_round((*prover_msg).clone(), &mut verifier_state, fs_rng);
94 }
95
96 IPForMLSumcheck::check_and_generate_subclaim(verifier_state, claimed_sum)
97 }
98}