p3_commit/adapters/
extension_mmcs.rs1use alloc::vec::Vec;
2use core::marker::PhantomData;
3use core::ops::Deref;
4
5use p3_field::{ExtensionField, Field};
6use p3_matrix::extension::FlatMatrixView;
7use p3_matrix::{Dimensions, Matrix};
8
9use crate::{BatchOpening, BatchOpeningRef, Mmcs};
10
11#[derive(Clone, Debug)]
17pub struct ExtensionMmcs<F, EF, InnerMmcs> {
18 pub(crate) inner: InnerMmcs,
20
21 pub(crate) _phantom: PhantomData<(F, EF)>,
22}
23
24impl<F, EF, InnerMmcs> ExtensionMmcs<F, EF, InnerMmcs> {
25 pub const fn new(inner: InnerMmcs) -> Self {
26 Self {
27 inner,
28 _phantom: PhantomData,
29 }
30 }
31}
32
33impl<F, EF, InnerMmcs> Mmcs<EF> for ExtensionMmcs<F, EF, InnerMmcs>
34where
35 F: Field,
36 EF: ExtensionField<F>,
37 InnerMmcs: Mmcs<F>,
38{
39 type ProverData<M> = InnerMmcs::ProverData<FlatMatrixView<F, EF, M>>;
40 type Commitment = InnerMmcs::Commitment;
41 type Proof = InnerMmcs::Proof;
42 type Error = InnerMmcs::Error;
43
44 fn commit<M: Matrix<EF>>(&self, inputs: Vec<M>) -> (Self::Commitment, Self::ProverData<M>) {
45 self.inner
46 .commit(inputs.into_iter().map(FlatMatrixView::new).collect())
47 }
48
49 fn open_batch<M: Matrix<EF>>(
50 &self,
51 index: usize,
52 prover_data: &Self::ProverData<M>,
53 ) -> BatchOpening<EF, Self> {
54 let (inner_opened_values, inner_proof) = self.inner.open_batch(index, prover_data).unpack();
55 let opened_ext_values = inner_opened_values
56 .into_iter()
57 .map(EF::reconstitute_from_base)
58 .collect();
59 BatchOpening::new(opened_ext_values, inner_proof)
60 }
61
62 fn get_matrices<'a, M: Matrix<EF>>(&self, prover_data: &'a Self::ProverData<M>) -> Vec<&'a M> {
63 self.inner
64 .get_matrices(prover_data)
65 .into_iter()
66 .map(|mat| mat.deref())
67 .collect()
68 }
69
70 fn verify_batch(
71 &self,
72 commit: &Self::Commitment,
73 dimensions: &[Dimensions],
74 index: usize,
75 batch_opening: BatchOpeningRef<'_, EF, Self>,
76 ) -> Result<(), Self::Error> {
77 let opened_base_values: Vec<Vec<F>> = batch_opening
78 .opened_values
79 .iter()
80 .cloned()
81 .map(EF::flatten_to_base)
82 .collect();
83 let base_dimensions = dimensions
84 .iter()
85 .map(|dim| Dimensions {
86 width: dim.width * EF::DIMENSION,
87 height: dim.height,
88 })
89 .collect::<Vec<_>>();
90 self.inner.verify_batch(
91 commit,
92 &base_dimensions,
93 index,
94 BatchOpeningRef::new(&opened_base_values, batch_opening.opening_proof),
95 )
96 }
97}