arnaucube
arnaucube/ipa-rsPublic Self-hosted repository
small interface update, add example in readme
arnaucube root@arnaucube.com
Sun, 10 Jul 2022 19:24:12 +0200
commit

0dce0668ce51a43d79fee9f180859ef494f8f272

parent

4f9b0a4bafe81e18426bcb918665f878f469796c

2 files changed, 57 insertions(+), 11 deletions(-)

jump to
M README.md → README.md

@@ -4,3 +4,45 @@ Inner Product Argument (IPA) version from Halo paper (https://eprint.iacr.org/2019/1021.pdf) implementation done to get familiar with [arkworks](https://arkworks.rs) and the modified IPA scheme.

> Warning: do not use this code in production. + +### Example + +```rust +let mut ipa = IPA::new(8); + +let a = vec![ + F::from(1 as u32), + F::from(2 as u32), + F::from(3 as u32), + F::from(4 as u32), + F::from(5 as u32), + F::from(6 as u32), + F::from(7 as u32), + F::from(8 as u32), +]; + + +let r = F::rand(&mut ipa.rng); + +// prover commits +let P = ipa.commit(&a, r).unwrap(); + + +// verifier sets challenges +let U = EdwardsProjective::rand(&mut ipa.rng); +let k = (f64::from(ipa.d as u32).log2()) as usize; +let mut u: Vec<F> = vec![F::zero(); k]; +for j in 0..k { + u[j] = F::rand(&mut ipa.rng); +} +let x = F::from(3 as u32); + +// prover opens at the challenges +let b = powers_of(x, ipa.d); +let v = inner_product_field(&a, &b).unwrap(); +let proof = ipa.prove(&a, &b, &u, &U).unwrap(); + +// verifier +let verif = ipa.verify(&x, &v, &P, &proof, &r, &u, &U).unwrap(); +assert!(verif); +```
M src/lib.rs → src/lib.rs

@@ -44,7 +44,7 @@ pub fn commit(&self, a: &[Fr], r: Fr) -> Result<EdwardsProjective, String> {

Ok(inner_product_point(a, &self.Gs)? + self.H.mul(r.into_repr())) } - pub fn ipa( + pub fn prove( &mut self, a: &[Fr], b: &[Fr],

@@ -118,13 +118,16 @@ }

pub fn verify( &self, x: &Fr, + v: &Fr, P: &EdwardsProjective, p: &Proof, r: &Fr, u: &[Fr], U: &EdwardsProjective, ) -> Result<bool, String> { - let mut q_0 = *P; + let P = *P + U.mul(v.into_repr()); + + let mut q_0 = P; let mut r = *r; // compute b & G from s

@@ -333,26 +336,27 @@ Fr::from(7 as u32),

Fr::from(8 as u32), ]; - let x = Fr::from(3 as u32); - let b = powers_of(x, ipa.d); - let r = Fr::rand(&mut ipa.rng); - let mut P = ipa.commit(&a, r).unwrap(); - let v = inner_product_field(&a, &b).unwrap(); + // prover commits + let P = ipa.commit(&a, r).unwrap(); + // verifier sets challenges let U = EdwardsProjective::rand(&mut ipa.rng); - let k = (f64::from(ipa.d as u32).log2()) as usize; let mut u: Vec<Fr> = vec![Fr::zero(); k]; for j in 0..k { u[j] = Fr::rand(&mut ipa.rng); } + let x = Fr::from(3 as u32); - P = P + U.mul(v.into_repr()); + // prover opens at the challenges + let b = powers_of(x, ipa.d); + let v = inner_product_field(&a, &b).unwrap(); + let proof = ipa.prove(&a, &b, &u, &U).unwrap(); - let proof = ipa.ipa(&a, &b, &u, &U).unwrap(); - let verif = ipa.verify(&x, &P, &proof, &r, &u, &U).unwrap(); + // verifier + let verif = ipa.verify(&x, &v, &P, &proof, &r, &u, &U).unwrap(); assert!(verif); } }