w3f-pcs 0.0.7

Collection of tools for augmenting polynomial commitment schemes
Documentation
use ark_poly::Polynomial;
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
use ark_std::vec::Vec;

use crate::pcs::*;
use crate::utils::poly;
use crate::Poly;

#[derive(Clone, PartialEq, Eq, Debug, CanonicalSerialize, CanonicalDeserialize)]
pub struct WrappedPolynomial<F: PrimeField>(pub Poly<F>);

impl<F: PrimeField> WrappedPolynomial<F> {
    fn evaluate(&self, x: &F) -> F {
        self.0.evaluate(x)
    }
}

impl<F: PrimeField> Add<Self> for WrappedPolynomial<F> {
    type Output = WrappedPolynomial<F>;

    fn add(self, other: WrappedPolynomial<F>) -> Self::Output {
        WrappedPolynomial(self.0 + other.0)
    }
}

impl<F: PrimeField> Sub<Self> for WrappedPolynomial<F> {
    type Output = WrappedPolynomial<F>;

    fn sub(self, other: WrappedPolynomial<F>) -> Self::Output {
        WrappedPolynomial(self.0 - other.0)
    }
}

impl<F: PrimeField> Sum<Self> for WrappedPolynomial<F> {
    fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
        iter.reduce(|a, b| a + b).unwrap()
    }
}

impl<F: PrimeField> Mul<F> for WrappedPolynomial<F> {
    type Output = WrappedPolynomial<F>;

    fn mul(self, by: F) -> Self {
        (&self).mul(by)
    }
}

impl<F: PrimeField> Commitment<F> for WrappedPolynomial<F> {
    fn mul(&self, by: F) -> Self {
        WrappedPolynomial(&self.0 * by)
    }

    fn combine(coeffs: &[F], commitments: &[Self]) -> Self {
        let polys = commitments
            .to_vec()
            .into_iter()
            .map(|c| c.0)
            .collect::<Vec<_>>();
        let combined = poly::sum_with_coeffs(coeffs.to_vec(), &polys);
        WrappedPolynomial(combined)
    }
}

impl CommitterKey for () {
    fn max_degree(&self) -> usize {
        usize::MAX >> 1
    }
}

impl VerifierKey for () {
    fn max_points(&self) -> usize {
        1
    }
}

impl RawVerifierKey for () {
    type VK = ();

    fn prepare(&self) -> () {
        ()
    }
}

impl PcsParams for () {
    type CK = ();
    type VK = ();
    type RVK = ();

    fn ck(&self) -> () {
        ()
    }

    fn vk(&self) -> () {
        ()
    }

    fn raw_vk(&self) -> () {
        ()
    }
}

#[derive(Clone)]
pub struct IdentityCommitment {}

impl<F: PrimeField> PCS<F> for IdentityCommitment {
    type C = WrappedPolynomial<F>;
    type Proof = ();
    type CK = ();
    type VK = ();
    type Params = ();

    fn setup<R: Rng>(_max_degree: usize, _rng: &mut R) -> Self::Params {
        ()
    }

    fn commit(_ck: &(), p: &Poly<F>) -> Result<Self::C, ()> {
        Ok(WrappedPolynomial(p.clone()))
    }

    fn open(_ck: &(), _p: &Poly<F>, _x: F) -> Result<Self::Proof, ()> {
        Ok(())
    }

    fn verify(_vk: &(), c: Self::C, x: F, z: F, _proof: Self::Proof) -> Result<(), ()> {
        (c.evaluate(&x) == z).then(|| ()).ok_or(())
    }
}