(n: usize, known_indices: BTreeSet<usize>)
| 415 | #[test] |
| 416 | fn create_homomorphisms() { |
| 417 | fn check_hom(n: usize, known_indices: BTreeSet<usize>) { |
| 418 | let mut rng = StdRng::seed_from_u64(0u64); |
| 419 | let k = known_indices.len(); |
| 420 | let g = <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine(); |
| 421 | let x = (0..n).map(|_| Fr::rand(&mut rng)).collect::<Vec<_>>(); |
| 422 | |
| 423 | let Ps = x |
| 424 | .iter() |
| 425 | .map(|x| g.mul_bigint(x.into_bigint()).into_affine()) |
| 426 | .collect::<Vec<_>>(); |
| 427 | |
| 428 | let known_x = known_indices |
| 429 | .iter() |
| 430 | .map(|i| (*i, &x[*i])) |
| 431 | .collect::<BTreeMap<_, _>>(); |
| 432 | let y = single::create_new_witnesses::<Fr>(n, known_x); |
| 433 | let fs = single::create_homomorphisms(g.clone(), Ps.clone(), n, k); |
| 434 | |
| 435 | assert_eq!(fs.len(), n); |
| 436 | for i in 0..n { |
| 437 | if !known_indices.contains(&i) { |
| 438 | assert!(y[n - k + i].is_zero()); |
| 439 | } |
| 440 | assert_eq!(fs[i].eval(&y).unwrap(), Ps[i]); |
| 441 | } |
| 442 | |
| 443 | let scalars = (0..fs.len()) |
| 444 | .map(|_| Fr::rand(&mut rng)) |
| 445 | .collect::<Vec<_>>(); |
| 446 | let f_rho = AmortizeHomomorphisms::<_, _>::new_homomorphism_from_given_randomness( |
| 447 | &fs, &scalars, |
| 448 | ); |
| 449 | assert_eq!( |
| 450 | f_rho.eval(&y).unwrap(), |
| 451 | <Bls12_381 as Pairing>::G1::msm_unchecked(&Ps, &scalars).into_affine() |
| 452 | ); |
| 453 | } |
| 454 | |
| 455 | check_hom(3, vec![0].into_iter().collect::<BTreeSet<_>>()); |
| 456 | check_hom(3, vec![1].into_iter().collect::<BTreeSet<_>>()); |
no test coverage detected