pub mod key;
pub mod srs;
pub use key::{CommitKey, OpeningKey};
pub use srs::PublicParameters;
use crate::transcript::TranscriptProtocol;
use crate::util::powers_of;
use dusk_bls12_381::{BlsScalar, G1Affine, G1Projective};
use dusk_bytes::{DeserializableSlice, Serializable};
use merlin::Transcript;
#[derive(Copy, Clone, Debug)]
pub(crate) struct Proof {
commitment_to_witness: Commitment,
evaluated_point: BlsScalar,
commitment_to_polynomial: Commitment,
}
#[derive(Debug)]
pub(crate) struct AggregateProof {
commitment_to_witness: Commitment,
evaluated_points: Vec<BlsScalar>,
commitments_to_polynomials: Vec<Commitment>,
}
impl AggregateProof {
pub(crate) fn with_witness(witness: Commitment) -> AggregateProof {
AggregateProof {
commitment_to_witness: witness,
evaluated_points: Vec::new(),
commitments_to_polynomials: Vec::new(),
}
}
pub(crate) fn add_part(&mut self, part: (BlsScalar, Commitment)) {
self.evaluated_points.push(part.0);
self.commitments_to_polynomials.push(part.1);
}
pub(crate) fn flatten(&self, transcript: &mut Transcript) -> Proof {
let challenge = transcript.challenge_scalar(b"aggregate_witness");
let powers =
powers_of(&challenge, self.commitments_to_polynomials.len() - 1);
let flattened_poly_commitments: G1Projective = self
.commitments_to_polynomials
.iter()
.zip(powers.iter())
.map(|(poly, challenge)| poly.0 * challenge)
.sum();
let flattened_poly_evaluations: BlsScalar = self
.evaluated_points
.iter()
.zip(powers.iter())
.map(|(eval, challenge)| eval * challenge)
.fold(BlsScalar::zero(), |acc, current_val| acc + current_val);
Proof {
commitment_to_witness: self.commitment_to_witness,
evaluated_point: flattened_poly_evaluations,
commitment_to_polynomial: Commitment::from_projective(
flattened_poly_commitments,
),
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub(crate) struct Commitment(
pub(crate) G1Affine,
);
impl Serializable<{ G1Affine::SIZE }> for Commitment {
type Error = dusk_bytes::Error;
fn to_bytes(&self) -> [u8; Self::SIZE] {
self.0.to_bytes()
}
fn from_bytes(buf: &[u8; Self::SIZE]) -> Result<Self, Self::Error> {
let g1 = G1Affine::from_slice(buf)?;
Ok(Self(g1))
}
}
impl Commitment {
pub(crate) fn from_projective(g: G1Projective) -> Self {
Self(g.into())
}
fn empty() -> Self {
Commitment(G1Affine::identity())
}
}
impl Default for Commitment {
fn default() -> Self {
Commitment::empty()
}
}
#[cfg(test)]
mod commitment_tests {
use super::*;
#[test]
fn commitment_duks_bytes_serde() {
let commitment = Commitment(dusk_bls12_381::G1Affine::generator());
let bytes = commitment.to_bytes();
let obtained_comm = Commitment::from_slice(&bytes)
.expect("Error on the deserialization");
assert_eq!(commitment, obtained_comm);
}
}