kimchi_msm/test/
logup.rs

1#[cfg(test)]
2mod tests {
3    use crate::{
4        lookups::{Lookup, LookupTableIDs},
5        proof::ProofInputs,
6        prover::prove,
7        verifier::verify,
8        witness::Witness,
9        BaseSponge, Fp, OpeningProof, ScalarSponge, BN254,
10    };
11    use ark_ff::UniformRand;
12    use kimchi::circuits::domains::EvaluationDomains;
13    use poly_commitment::{kzg::PairingSRS, SRS as _};
14
15    // Number of columns
16    const LOOKUP_TEST_N_COL: usize = 10;
17
18    #[test]
19    #[ignore]
20    fn test_soundness_logup() {
21        let mut rng = o1_utils::tests::make_test_rng(None);
22
23        // We generate two different witness and two different proofs.
24        let domain_size = 1 << 8;
25        let domain = EvaluationDomains::<Fp>::create(domain_size).unwrap();
26
27        let srs: PairingSRS<BN254> = { PairingSRS::create(domain.d1.size as usize) };
28        srs.full_srs.get_lagrange_basis(domain.d1);
29
30        let mut inputs = ProofInputs::random(domain);
31        let constraints = vec![];
32        // Take one random f_i (FIXME: taking first one for now)
33        let test_table_id = *inputs.logups.first_key_value().unwrap().0;
34        let looked_up_values = inputs.logups.get_mut(&test_table_id).unwrap().f[0].clone();
35        // We change a random looked up element (FIXME: first one for now)
36        let wrong_looked_up_value = Lookup {
37            table_id: looked_up_values[0].table_id,
38            numerator: looked_up_values[0].numerator,
39            value: vec![Fp::rand(&mut rng)],
40        };
41        // Overwriting the first looked up value
42        inputs.logups.get_mut(&test_table_id).unwrap().f[0][0] = wrong_looked_up_value;
43        // generate the proof
44        let proof = prove::<
45            _,
46            OpeningProof,
47            BaseSponge,
48            ScalarSponge,
49            _,
50            LOOKUP_TEST_N_COL,
51            LOOKUP_TEST_N_COL,
52            0,
53            0,
54            LookupTableIDs,
55        >(domain, &srs, &constraints, Box::new([]), inputs, &mut rng)
56        .unwrap();
57        let verifies = verify::<
58            _,
59            OpeningProof,
60            BaseSponge,
61            ScalarSponge,
62            LOOKUP_TEST_N_COL,
63            LOOKUP_TEST_N_COL,
64            0,
65            0,
66            0,
67            LookupTableIDs,
68        >(
69            domain,
70            &srs,
71            &constraints,
72            Box::new([]),
73            &proof,
74            Witness::zero_vec(domain_size),
75        );
76        // FIXME: At the moment, it does verify. It should not. We are missing constraints.
77        assert!(!verifies);
78    }
79}