use super::*;
use crate::*;
#[derive(Default)]
pub struct TransparentInnerProdNIZKArg<E: RingElement> {
pub wtns_hash: [u8; 32], pub wtns_args: HashMap<u64, TransparentInnerProd<10, E>>,
pub constraints: Vec<TransparentInnerProdBuilderConstraint>,
}
impl<E: RingElement> TransparentInnerProdNIZKArg<E> {
pub fn builder() -> TransparentInnerProdSystemBuilder<E> {
TransparentInnerProdSystemBuilder::default()
}
pub fn verify(&self) -> Result<()> {
let transcript = Transcript::<E>::from(&self.wtns_hash);
for constraint in &self.constraints {
match constraint {
TransparentInnerProdBuilderConstraint::Mul(a_i, b_i, c_i) => {
if let Some(c) = self.wtns_args.get(c_i)
&& let Some(a) = self.wtns_args.get(a_i)
&& let Some(b) = self.wtns_args.get(b_i)
{
let a = a.eval(transcript.clone())?;
let b = b.eval(transcript.clone())?;
let c = c.eval(transcript.clone())?;
for ((a, b), c) in a.into_iter().zip(b.into_iter()).zip(c.into_iter()) {
println!("{a} * {b} = {c}");
if a * b != c {
anyhow::bail!("mul constraint failed");
}
}
} else {
anyhow::bail!("non-existent witness index");
}
}
TransparentInnerProdBuilderConstraint::Add(a_i, b_i, c_i) => {
if let Some(c) = self.wtns_args.get(c_i)
&& let Some(a) = self.wtns_args.get(a_i)
&& let Some(b) = self.wtns_args.get(b_i)
{
let a = a.eval(transcript.clone())?;
let b = b.eval(transcript.clone())?;
let c = c.eval(transcript.clone())?;
for ((a, b), c) in a.into_iter().zip(b.into_iter()).zip(c.into_iter()) {
if a + b != c {
anyhow::bail!("add constraint failed");
}
}
} else {
anyhow::bail!("non-existent witness index");
}
}
}
}
Ok(())
}
}