halo2_axiom/poly/kzg/multiopen/
gwc.rs
1mod prover;
2mod verifier;
3
4pub use prover::ProverGWC;
5pub use verifier::VerifierGWC;
6
7use crate::{poly::query::Query, transcript::ChallengeScalar};
8use ff::Field;
9use std::marker::PhantomData;
10
11#[derive(Clone, Copy, Debug)]
12struct U {}
13type ChallengeU<F> = ChallengeScalar<F, U>;
14
15#[derive(Clone, Copy, Debug)]
16struct V {}
17type ChallengeV<F> = ChallengeScalar<F, V>;
18
19struct CommitmentData<F: Field, Q: Query<F>> {
20 queries: Vec<Q>,
21 point: F,
22 _marker: PhantomData<F>,
23}
24
25fn construct_intermediate_sets<F: Field, I, Q: Query<F>>(queries: I) -> Vec<CommitmentData<F, Q>>
26where
27 I: IntoIterator<Item = Q> + Clone,
28{
29 let mut point_query_map: Vec<(F, Vec<Q>)> = Vec::new();
30 for query in queries {
31 if let Some(pos) = point_query_map
32 .iter()
33 .position(|(point, _)| *point == query.get_point())
34 {
35 let (_, queries) = &mut point_query_map[pos];
36 queries.push(query);
37 } else {
38 point_query_map.push((query.get_point(), vec![query]));
39 }
40 }
41
42 point_query_map
43 .into_iter()
44 .map(|(point, queries)| CommitmentData {
45 queries,
46 point,
47 _marker: PhantomData,
48 })
49 .collect()
50}