| 292 | |
| 293 | #[test] |
| 294 | fn amortization() { |
| 295 | fn check(max_size: u32) { |
| 296 | let mut rng = StdRng::seed_from_u64(0u64); |
| 297 | let linear_form_1 = TestLinearForm1 {}; |
| 298 | let linear_form_2 = TestLinearForm2 { |
| 299 | constants: (0..max_size) |
| 300 | .map(|_| Fr::rand(&mut rng)) |
| 301 | .collect::<Vec<_>>(), |
| 302 | }; |
| 303 | |
| 304 | let x1 = (0..max_size - 2) |
| 305 | .map(|_| Fr::rand(&mut rng)) |
| 306 | .collect::<Vec<_>>(); |
| 307 | let gamma1 = Fr::rand(&mut rng); |
| 308 | let x2 = (0..max_size - 1) |
| 309 | .map(|_| Fr::rand(&mut rng)) |
| 310 | .collect::<Vec<_>>(); |
| 311 | let gamma2 = Fr::rand(&mut rng); |
| 312 | let x3 = (0..max_size) |
| 313 | .map(|_| Fr::rand(&mut rng)) |
| 314 | .collect::<Vec<_>>(); |
| 315 | let gamma3 = Fr::rand(&mut rng); |
| 316 | |
| 317 | let g = (0..max_size) |
| 318 | .map(|_| <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine()) |
| 319 | .collect::<Vec<_>>(); |
| 320 | let h = <Bls12_381 as Pairing>::G1::rand(&mut rng).into_affine(); |
| 321 | |
| 322 | let comm1 = (<Bls12_381 as Pairing>::G1::msm_unchecked(&g, &x1) |
| 323 | + h.mul_bigint(gamma1.into_bigint())) |
| 324 | .into_affine(); |
| 325 | let eval1 = linear_form_1.eval(&x1); |
| 326 | let eval12 = linear_form_2.eval(&x1); |
| 327 | |
| 328 | let comm2 = (<Bls12_381 as Pairing>::G1::msm_unchecked(&g, &x2) |
| 329 | + h.mul_bigint(gamma2.into_bigint())) |
| 330 | .into_affine(); |
| 331 | let eval2 = linear_form_1.eval(&x2); |
| 332 | let eval22 = linear_form_2.eval(&x2); |
| 333 | |
| 334 | let comm3 = (<Bls12_381 as Pairing>::G1::msm_unchecked(&g, &x3) |
| 335 | + h.mul_bigint(gamma3.into_bigint())) |
| 336 | .into_affine(); |
| 337 | let eval3 = linear_form_1.eval(&x3); |
| 338 | let eval32 = linear_form_2.eval(&x3); |
| 339 | |
| 340 | let rand_comm = |
| 341 | RandomCommitment::new(&mut rng, &g, &h, max_size, &linear_form_1, None).unwrap(); |
| 342 | assert_eq!(rand_comm.r.len(), max_size as usize); |
| 343 | let challenge = Fr::rand(&mut rng); |
| 344 | let response = rand_comm |
| 345 | .response(vec![&x1, &x2, &x3], &[gamma1, gamma2, gamma3], &challenge) |
| 346 | .unwrap(); |
| 347 | assert_eq!(response.z_tilde.len(), max_size as usize); |
| 348 | response |
| 349 | .is_valid( |
| 350 | &g, |
| 351 | &h, |