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)]
12pub struct ExtensionMmcs<F, EF, InnerMmcs> {
13 inner: InnerMmcs,
14 _phantom: PhantomData<(F, EF)>,
15}
16
17impl<F, EF, InnerMmcs> ExtensionMmcs<F, EF, InnerMmcs> {
18 pub const fn new(inner: InnerMmcs) -> Self {
19 Self {
20 inner,
21 _phantom: PhantomData,
22 }
23 }
24}
25
26impl<F, EF, InnerMmcs> Mmcs<EF> for ExtensionMmcs<F, EF, InnerMmcs>
27where
28 F: Field,
29 EF: ExtensionField<F>,
30 InnerMmcs: Mmcs<F>,
31{
32 type ProverData<M> = InnerMmcs::ProverData<FlatMatrixView<F, EF, M>>;
33 type Commitment = InnerMmcs::Commitment;
34 type Proof = InnerMmcs::Proof;
35 type Error = InnerMmcs::Error;
36
37 fn commit<M: Matrix<EF>>(&self, inputs: Vec<M>) -> (Self::Commitment, Self::ProverData<M>) {
38 self.inner
39 .commit(inputs.into_iter().map(FlatMatrixView::new).collect())
40 }
41
42 fn open_batch<M: Matrix<EF>>(
43 &self,
44 index: usize,
45 prover_data: &Self::ProverData<M>,
46 ) -> BatchOpening<EF, Self> {
47 let (inner_opened_values, inner_proof) = self.inner.open_batch(index, prover_data).unpack();
48 let opened_ext_values = inner_opened_values
49 .into_iter()
50 .map(EF::reconstitute_from_base)
51 .collect();
52 BatchOpening::new(opened_ext_values, inner_proof)
53 }
54
55 fn get_matrices<'a, M: Matrix<EF>>(&self, prover_data: &'a Self::ProverData<M>) -> Vec<&'a M> {
56 self.inner
57 .get_matrices(prover_data)
58 .into_iter()
59 .map(|mat| mat.deref())
60 .collect()
61 }
62
63 fn verify_batch(
64 &self,
65 commit: &Self::Commitment,
66 dimensions: &[Dimensions],
67 index: usize,
68 batch_opening: BatchOpeningRef<EF, Self>,
69 ) -> Result<(), Self::Error> {
70 let opened_base_values: Vec<Vec<F>> = batch_opening
71 .opened_values
72 .iter()
73 .cloned()
74 .map(EF::flatten_to_base)
75 .collect();
76 let base_dimensions = dimensions
77 .iter()
78 .map(|dim| Dimensions {
79 width: dim.width * EF::DIMENSION,
80 height: dim.height,
81 })
82 .collect::<Vec<_>>();
83 self.inner.verify_batch(
84 commit,
85 &base_dimensions,
86 index,
87 BatchOpeningRef::new(&opened_base_values, batch_opening.opening_proof),
88 )
89 }
90}