pub struct BatchPCS<P, FE, InnerPCS>where
P: PackedField,
FE: ExtensionField<P::Scalar> + TowerField,
InnerPCS: PolyCommitScheme<P, FE>,{ /* private fields */ }
Expand description
A block-box batching scheme for multilinear commitments, as explained in [Section 5.3, DP24].
In particular, the scheme allows us to open the evaluations of a collection of multilinear polynomials at a point $\vec{r}$.
Given a collection of $2^m$ multilinear $n$-variate polynomials $t_u$, jointly commit to them with the following functionality: jointly open the evaluations of the polynomials at a point $\vec{r}=(r_0,\ldots,r_{n-1})$.
Suppose we have a collection of $2^m$ multilinear polynomials $t_u$, each of which is $n$-variate, and we want to prove the evaluations at a point $\vec{r}=(r_0,\ldots ,r_{n-1})$ are $(s_u)$. Build the multilinear, $n+m$-variate polynomial T, whose values on $B_{m+n}$ are given as: $T(v||u) = t_u(v)$, for all u in ${0,1}^m$ and v in ${0,1}^n$. Sample random challenges $\vec{r’}:=(r’0,\ldots,r’{m-1})$. Finally, pass off the evaluation of $T$ at $(r_0,\ldots,r_{n-1}, r’0,\ldots,r’{m-1})$ to the inner polynomial commitment scheme.
If the prover is honest, $T(\vec{r}||\vec{r’})$ is the dot product of the tensor expansion of $\vec{r’}$ with $(s_u)$. Equivalently, it is the evaluation of the multilinear polynomial defined via MLE on the hypercube: $B_m\rightarrow \mathbb F$ by $u\mapsto s_u$ at the point $(r’0,\ldots, r’{m-1})$. Therefore, given the claimed evaluations $(s_u)$, the verifier can compute the desired mixing herself.
§Type parameters
P
- the packed coefficient subfieldFE
- an extension field ofP::Scalar
(used for the inner PCS)Inner
- the inner polynomial commitment scheme over the extension field
Implementations§
source§impl<F, FE, P, Inner> BatchPCS<P, FE, Inner>where
F: Field,
P: PackedField<Scalar = F>,
FE: ExtensionField<F> + TowerField,
Inner: PolyCommitScheme<P, FE>,
impl<F, FE, P, Inner> BatchPCS<P, FE, Inner>where
F: Field,
P: PackedField<Scalar = F>,
FE: ExtensionField<F> + TowerField,
Inner: PolyCommitScheme<P, FE>,
Trait Implementations§
source§impl<P, FE, InnerPCS> Debug for BatchPCS<P, FE, InnerPCS>where
P: PackedField + Debug,
FE: ExtensionField<P::Scalar> + TowerField + Debug,
InnerPCS: PolyCommitScheme<P, FE> + Debug,
impl<P, FE, InnerPCS> Debug for BatchPCS<P, FE, InnerPCS>where
P: PackedField + Debug,
FE: ExtensionField<P::Scalar> + TowerField + Debug,
InnerPCS: PolyCommitScheme<P, FE> + Debug,
source§impl<F, FE, P, Inner> PolyCommitScheme<P, FE> for BatchPCS<P, FE, Inner>where
F: Field,
P: PackedField<Scalar = F>,
FE: ExtensionField<F> + TowerField,
Inner: PolyCommitScheme<P, FE>,
impl<F, FE, P, Inner> PolyCommitScheme<P, FE> for BatchPCS<P, FE, Inner>where
F: Field,
P: PackedField<Scalar = F>,
FE: ExtensionField<F> + TowerField,
Inner: PolyCommitScheme<P, FE>,
type Commitment = <Inner as PolyCommitScheme<P, FE>>::Commitment
type Committed = <Inner as PolyCommitScheme<P, FE>>::Committed
type Proof = Proof<<Inner as PolyCommitScheme<P, FE>>::Proof>
type Error = Error
fn n_vars(&self) -> usize
source§fn commit<Data>(
&self,
polys: &[MultilinearExtension<P, Data>],
) -> Result<(Self::Commitment, Self::Committed), Self::Error>
fn commit<Data>( &self, polys: &[MultilinearExtension<P, Data>], ) -> Result<(Self::Commitment, Self::Committed), Self::Error>
source§fn prove_evaluation<Data, Transcript, Backend>(
&self,
transcript: &mut Transcript,
committed: &Self::Committed,
polys: &[MultilinearExtension<P, Data>],
query: &[FE],
backend: &Backend,
) -> Result<Self::Proof, Self::Error>where
Data: Deref<Target = [P]> + Send + Sync,
Transcript: CanObserve<FE> + CanObserve<Self::Commitment> + CanSample<FE> + CanSampleBits<usize> + CanWrite,
Backend: ComputationBackend,
fn prove_evaluation<Data, Transcript, Backend>(
&self,
transcript: &mut Transcript,
committed: &Self::Committed,
polys: &[MultilinearExtension<P, Data>],
query: &[FE],
backend: &Backend,
) -> Result<Self::Proof, Self::Error>where
Data: Deref<Target = [P]> + Send + Sync,
Transcript: CanObserve<FE> + CanObserve<Self::Commitment> + CanSample<FE> + CanSampleBits<usize> + CanWrite,
Backend: ComputationBackend,
source§fn verify_evaluation<Transcript, Backend>(
&self,
transcript: &mut Transcript,
commitment: &Self::Commitment,
query: &[FE],
proof: Self::Proof,
values: &[FE],
backend: &Backend,
) -> Result<(), Self::Error>where
Transcript: CanObserve<FE> + CanObserve<Self::Commitment> + CanSample<FE> + CanSampleBits<usize> + CanRead,
Backend: ComputationBackend,
fn verify_evaluation<Transcript, Backend>(
&self,
transcript: &mut Transcript,
commitment: &Self::Commitment,
query: &[FE],
proof: Self::Proof,
values: &[FE],
backend: &Backend,
) -> Result<(), Self::Error>where
Transcript: CanObserve<FE> + CanObserve<Self::Commitment> + CanSample<FE> + CanSampleBits<usize> + CanRead,
Backend: ComputationBackend,
source§fn proof_size(&self, _n_polys: usize) -> usize
fn proof_size(&self, _n_polys: usize) -> usize
Auto Trait Implementations§
impl<P, FE, InnerPCS> Freeze for BatchPCS<P, FE, InnerPCS>
impl<P, FE, InnerPCS> RefUnwindSafe for BatchPCS<P, FE, InnerPCS>where
<FE as WithUnderlier>::Underlier: Sized,
InnerPCS: RefUnwindSafe,
P: RefUnwindSafe,
FE: RefUnwindSafe,
impl<P, FE, InnerPCS> Send for BatchPCS<P, FE, InnerPCS>
impl<P, FE, InnerPCS> Sync for BatchPCS<P, FE, InnerPCS>
impl<P, FE, InnerPCS> Unpin for BatchPCS<P, FE, InnerPCS>
impl<P, FE, InnerPCS> UnwindSafe for BatchPCS<P, FE, InnerPCS>
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
source§impl<T> IntoEither for T
impl<T> IntoEither for T
source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moresource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read more