arnaucube
arnaucube/ipa-rsPublic Self-hosted repository
ipa-rs/README.md
README.mdRaw
 1# ipa-rs [![Test](https://github.com/arnaucube/ipa-rs/workflows/Test/badge.svg)](https://github.com/arnaucube/ipa-rs/actions?query=workflow%3ATest)
 2
 3Inner 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.
 4
 5
 6> Warning: do not use this code in production.
 7
 8### Example
 9
10```rust
11let mut ipa = IPA::new(8);
12
13let a = vec![
14    F::from(1 as u32),
15    F::from(2 as u32),
16    F::from(3 as u32),
17    F::from(4 as u32),
18    F::from(5 as u32),
19    F::from(6 as u32),
20    F::from(7 as u32),
21    F::from(8 as u32),
22];
23
24
25let r = F::rand(&mut ipa.rng);
26
27// prover commits
28let P = ipa.commit(&a, r).unwrap();
29
30
31// verifier sets challenges
32let U = EdwardsProjective::rand(&mut ipa.rng);
33let k = (f64::from(ipa.d as u32).log2()) as usize;
34let mut u: Vec<F> = vec![F::zero(); k];
35for j in 0..k {
36    u[j] = F::rand(&mut ipa.rng);
37}
38let x = F::from(3 as u32);
39
40// prover opens at the challenges
41let b = powers_of(x, ipa.d);
42let v = inner_product_field(&a, &b).unwrap();
43let proof = ipa.prove(&a, &b, &u, &U).unwrap();
44
45// verifier
46let verif = ipa.verify(&x, &v, &P, &proof, &r, &u, &U).unwrap();
47assert!(verif);
48```