pub trait Mmcs<T: Send + Sync>: Clone {
type ProverData<M>;
type Commitment: Clone + Serialize + DeserializeOwned;
type Proof: Clone + Serialize + DeserializeOwned;
type Error: Debug;
// Required methods
fn commit<M: Matrix<T>>(
&self,
inputs: Vec<M>,
) -> (Self::Commitment, Self::ProverData<M>);
fn open_batch<M: Matrix<T>>(
&self,
index: usize,
prover_data: &Self::ProverData<M>,
) -> (Vec<Vec<T>>, Self::Proof);
fn get_matrices<'a, M: Matrix<T>>(
&self,
prover_data: &'a Self::ProverData<M>,
) -> Vec<&'a M>;
fn verify_batch(
&self,
commit: &Self::Commitment,
dimensions: &[Dimensions],
index: usize,
opened_values: &[Vec<T>],
proof: &Self::Proof,
) -> Result<(), Self::Error>;
// Provided methods
fn commit_matrix<M: Matrix<T>>(
&self,
input: M,
) -> (Self::Commitment, Self::ProverData<M>) { ... }
fn commit_vec(
&self,
input: Vec<T>,
) -> (Self::Commitment, Self::ProverData<RowMajorMatrix<T>>)
where T: Clone + Send + Sync { ... }
fn get_matrix_heights<M: Matrix<T>>(
&self,
prover_data: &Self::ProverData<M>,
) -> Vec<usize> { ... }
fn get_max_height<M: Matrix<T>>(
&self,
prover_data: &Self::ProverData<M>,
) -> usize { ... }
}
Expand description
A “Mixed Matrix Commitment Scheme” (MMCS) is a generalization of a vector commitment scheme; it supports committing to matrices and then opening rows. It is also batch-oriented; one can commit to a batch of matrices at once even if their widths and heights differ.
When a particular row index is opened, it is interpreted directly as a row index for matrices
with the largest height. For matrices with smaller heights, some bits of the row index are
removed (from the least-significant side) to get the effective row index. These semantics are
useful in the FRI protocol. See the documentation for open_batch
for more details.
Required Associated Types§
type ProverData<M>
type Commitment: Clone + Serialize + DeserializeOwned
type Proof: Clone + Serialize + DeserializeOwned
type Error: Debug
Required Methods§
fn commit<M: Matrix<T>>( &self, inputs: Vec<M>, ) -> (Self::Commitment, Self::ProverData<M>)
sourcefn open_batch<M: Matrix<T>>(
&self,
index: usize,
prover_data: &Self::ProverData<M>,
) -> (Vec<Vec<T>>, Self::Proof)
fn open_batch<M: Matrix<T>>( &self, index: usize, prover_data: &Self::ProverData<M>, ) -> (Vec<Vec<T>>, Self::Proof)
Opens a batch of rows from committed matrices
returns (openings, proof)
where openings
is a vector whose i
th element is the j
th row of the ith matrix M[i]
,
and j = index >> (log2_ceil(max_height) - log2_ceil(M[i].height))
.
sourcefn get_matrices<'a, M: Matrix<T>>(
&self,
prover_data: &'a Self::ProverData<M>,
) -> Vec<&'a M>
fn get_matrices<'a, M: Matrix<T>>( &self, prover_data: &'a Self::ProverData<M>, ) -> Vec<&'a M>
Get the matrices that were committed to.
sourcefn verify_batch(
&self,
commit: &Self::Commitment,
dimensions: &[Dimensions],
index: usize,
opened_values: &[Vec<T>],
proof: &Self::Proof,
) -> Result<(), Self::Error>
fn verify_batch( &self, commit: &Self::Commitment, dimensions: &[Dimensions], index: usize, opened_values: &[Vec<T>], proof: &Self::Proof, ) -> Result<(), Self::Error>
Verify a batch opening.
index
is the row index we’re opening for each matrix, following the same
semantics as open_batch
.
dimensions
is a slice whose ith element is the dimensions of the matrix being opened
in the ith opening
Provided Methods§
fn commit_matrix<M: Matrix<T>>( &self, input: M, ) -> (Self::Commitment, Self::ProverData<M>)
fn commit_vec( &self, input: Vec<T>, ) -> (Self::Commitment, Self::ProverData<RowMajorMatrix<T>>)
fn get_matrix_heights<M: Matrix<T>>( &self, prover_data: &Self::ProverData<M>, ) -> Vec<usize>
sourcefn get_max_height<M: Matrix<T>>(
&self,
prover_data: &Self::ProverData<M>,
) -> usize
fn get_max_height<M: Matrix<T>>( &self, prover_data: &Self::ProverData<M>, ) -> usize
Get the largest height of any committed matrix.