p3_commit/adapters/
extension_mmcs.rs

1use alloc::vec::Vec;
2use core::marker::PhantomData;
3
4use p3_field::{ExtensionField, Field};
5use p3_matrix::extension::FlatMatrixView;
6use p3_matrix::{Dimensions, Matrix};
7
8use crate::Mmcs;
9
10#[derive(Clone, Debug)]
11pub struct ExtensionMmcs<F, EF, InnerMmcs> {
12    inner: InnerMmcs,
13    _phantom: PhantomData<(F, EF)>,
14}
15
16impl<F, EF, InnerMmcs> ExtensionMmcs<F, EF, InnerMmcs> {
17    pub const fn new(inner: InnerMmcs) -> Self {
18        Self {
19            inner,
20            _phantom: PhantomData,
21        }
22    }
23}
24
25impl<F, EF, InnerMmcs> Mmcs<EF> for ExtensionMmcs<F, EF, InnerMmcs>
26where
27    F: Field,
28    EF: ExtensionField<F>,
29    InnerMmcs: Mmcs<F>,
30{
31    type ProverData<M> = InnerMmcs::ProverData<FlatMatrixView<F, EF, M>>;
32    type Commitment = InnerMmcs::Commitment;
33    type Proof = InnerMmcs::Proof;
34    type Error = InnerMmcs::Error;
35
36    fn commit<M: Matrix<EF>>(&self, inputs: Vec<M>) -> (Self::Commitment, Self::ProverData<M>) {
37        self.inner
38            .commit(inputs.into_iter().map(FlatMatrixView::new).collect())
39    }
40
41    fn open_batch<M: Matrix<EF>>(
42        &self,
43        index: usize,
44        prover_data: &Self::ProverData<M>,
45    ) -> (Vec<Vec<EF>>, Self::Proof) {
46        let (opened_base_values, proof) = self.inner.open_batch(index, prover_data);
47        let opened_ext_values = opened_base_values
48            .into_iter()
49            .map(|row| row.chunks(EF::D).map(EF::from_base_slice).collect())
50            .collect();
51        (opened_ext_values, proof)
52    }
53
54    fn get_matrices<'a, M: Matrix<EF>>(&self, prover_data: &'a Self::ProverData<M>) -> Vec<&'a M> {
55        self.inner
56            .get_matrices(prover_data)
57            .into_iter()
58            .map(|mat| mat.inner_ref())
59            .collect()
60    }
61
62    fn verify_batch(
63        &self,
64        commit: &Self::Commitment,
65        dimensions: &[Dimensions],
66        index: usize,
67        opened_values: &[Vec<EF>],
68        proof: &Self::Proof,
69    ) -> Result<(), Self::Error> {
70        let opened_base_values: Vec<Vec<F>> = opened_values
71            .iter()
72            .map(|row| {
73                row.iter()
74                    .flat_map(|el| el.as_base_slice())
75                    .copied()
76                    .collect()
77            })
78            .collect();
79        let base_dimensions = dimensions
80            .iter()
81            .map(|dim| Dimensions {
82                width: dim.width * EF::D,
83                height: dim.height,
84            })
85            .collect::<Vec<_>>();
86        self.inner
87            .verify_batch(commit, &base_dimensions, index, &opened_base_values, proof)
88    }
89}