pub struct InnerProductProof { /* private fields */ }Expand description
InnerProductProof construct
Implementations§
Source§impl InnerProductProof
impl InnerProductProof
Sourcepub fn create(
transcript: &mut Transcript,
a: &[Scalar],
b: &[Scalar],
generators_offset: u64,
) -> InnerProductProof
pub fn create( transcript: &mut Transcript, a: &[Scalar], b: &[Scalar], generators_offset: u64, ) -> InnerProductProof
Creates an inner product proof.
The proof is created with respect to the base G, provided by:
let np = 1ull << ceil(log2(n));
let G = vec![RISTRETTO_BASEPOINT_POINT; np + 1];
crate::compute::get_curve25519_generators(G, generators_offset)The verifier transcript is passed in as a parameter so that the
challenges depend on the entire transcript (including parent
protocols).
Note that we don’t have any restriction to the n value, other than
it has to be non-zero.
§Algorithm description
Initially, we compute G and Q = G[np], where np = 1ull << ceil(log2(n))
and G is zero-indexed.
The protocol consists of k = ceil(lg_2(n)) rounds, indexed by j = k - 1 , ... , 0.
In the j-th round, the prover computes:
a_lo = {a[0], a[1], ..., a[n/2 - 1]}
a_hi = {a[n/2], a[n/2 + 1], ..., a[n - 1]}
b_lo = {b[0], b[1], ..., b[n/2 - 1]}
b_hi = {b[n/2], b[n/2 + 1], ..., b[n - 1]}
G_lo = {G[0], G[1], ..., G[n/2 - 1]}
G_hi = {G[n/2], G[n/2 + 1], ..., G[n-1]}
l_vector[j] = <a_lo, G_hi> + <a_lo, b_hi> * Q
r_vector[j] = <a_hi, G_lo> + <a_hi, b_lo> * QNote that if the a or b length is not a power of 2,
then a or b is padded with zeros until it has a power of 2.
G always has a power of 2 given how it is constructed.
Then the prover sends l_vector[j] and r_vector[j] to the verifier,
and the verifier responds with a
challenge value u[j] <- Z_p (finite field of order p),
which is non-interactively simulated by
the input strobe-based transcript.
transcript.append("L", l_vector[j]);
transcript.append("R", r_vector[j]);
u[j] = transcript.challenge_value("x");Then the prover uses u[j] to compute
a = a_lo * u[j] + (u[j]^(-1)) * a_hi;
b = b_lo * (u[j]^(-1)) + u[j] * b_hi;Then, the prover and verifier both compute
G = G_lo * (u[j]^(-1)) + u[j] * G_hi
n = n / 2;and use these vectors (all of length 2^j) for the next round.
After the last (j = 0) round, the prover sends ap_value = a[0] to the verifier.
§Arguments:
transcript(in/out): a single strobe-based transcripta(in): array with non-zero lengthnb(in): array with non-zero lengthngenerators_offset(in): offset used to fetch the bases
Sourcepub fn verify(
&self,
transcript: &mut Transcript,
a_commit: &RistrettoPoint,
product: &Scalar,
b: &[Scalar],
generators_offset: u64,
) -> Result<(), ProofError>
pub fn verify( &self, transcript: &mut Transcript, a_commit: &RistrettoPoint, product: &Scalar, b: &[Scalar], generators_offset: u64, ) -> Result<(), ProofError>
Verifies an inner product proof.
The proof is verified with respect to the base G, provided by:
let np = 1ull << ceil(log2(n));
let G = vec![RISTRETTO_BASEPOINT_POINT; np + 1];
crate::compute::get_curve25519_generators(G, generators_offset)`.Note that we don’t have any restriction to the n value, other than
it has to be non-zero.
§Arguments:
transcript(in/out): a single strobe-based transcripta_commit(in): a single Ristretto point, represented by<a, G>(the inner product of the two vectors)product(in): a single scalar, represented by<a, b>, the inner product of the two vectorsaandbused byInnerProductProof::create(...)b(in): array with non-zero lengthn, the same one used byInnerProductProof::create(...)generators_offset(in): offset used to fetch the bases
Trait Implementations§
Source§impl Clone for InnerProductProof
impl Clone for InnerProductProof
Source§fn clone(&self) -> InnerProductProof
fn clone(&self) -> InnerProductProof
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl CommitmentEvaluationProof for InnerProductProof
impl CommitmentEvaluationProof for InnerProductProof
Source§type Commitment = RistrettoPoint
type Commitment = RistrettoPoint
Source§type Error = ProofError
type Error = ProofError
Source§type ProverPublicSetup<'a> = ()
type ProverPublicSetup<'a> = ()
Source§type VerifierPublicSetup<'a> = ()
type VerifierPublicSetup<'a> = ()
Source§fn new(
transcript: &mut impl Transcript,
a: &[Self::Scalar],
b_point: &[Self::Scalar],
generators_offset: u64,
_setup: &Self::ProverPublicSetup<'_>,
) -> Self
fn new( transcript: &mut impl Transcript, a: &[Self::Scalar], b_point: &[Self::Scalar], generators_offset: u64, _setup: &Self::ProverPublicSetup<'_>, ) -> Self
Source§fn verify_batched_proof(
&self,
transcript: &mut impl Transcript,
commit_batch: &[Self::Commitment],
batching_factors: &[Self::Scalar],
product: &Self::Scalar,
b_point: &[Self::Scalar],
generators_offset: u64,
table_length: usize,
_setup: &Self::VerifierPublicSetup<'_>,
) -> Result<(), Self::Error>
fn verify_batched_proof( &self, transcript: &mut impl Transcript, commit_batch: &[Self::Commitment], batching_factors: &[Self::Scalar], product: &Self::Scalar, b_point: &[Self::Scalar], generators_offset: u64, table_length: usize, _setup: &Self::VerifierPublicSetup<'_>, ) -> Result<(), Self::Error>
Source§fn verify_proof(
&self,
transcript: &mut impl Transcript,
a_commit: &Self::Commitment,
product: &Self::Scalar,
b_point: &[Self::Scalar],
generators_offset: u64,
table_length: usize,
setup: &Self::VerifierPublicSetup<'_>,
) -> Result<(), Self::Error>
fn verify_proof( &self, transcript: &mut impl Transcript, a_commit: &Self::Commitment, product: &Self::Scalar, b_point: &[Self::Scalar], generators_offset: u64, table_length: usize, setup: &Self::VerifierPublicSetup<'_>, ) -> Result<(), Self::Error>
Source§impl Debug for InnerProductProof
impl Debug for InnerProductProof
Source§impl<'de> Deserialize<'de> for InnerProductProof
impl<'de> Deserialize<'de> for InnerProductProof
Source§fn deserialize<__D>(
__deserializer: __D,
) -> Result<InnerProductProof, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(
__deserializer: __D,
) -> Result<InnerProductProof, <__D as Deserializer<'de>>::Error>where
__D: Deserializer<'de>,
Source§impl Serialize for InnerProductProof
impl Serialize for InnerProductProof
Source§fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
fn serialize<__S>(
&self,
__serializer: __S,
) -> Result<<__S as Serializer>::Ok, <__S as Serializer>::Error>where
__S: Serializer,
Auto Trait Implementations§
impl Freeze for InnerProductProof
impl RefUnwindSafe for InnerProductProof
impl Send for InnerProductProof
impl Sync for InnerProductProof
impl Unpin for InnerProductProof
impl UnwindSafe for InnerProductProof
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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