|
7 | 7 | mod instance_validation { |
8 | 8 | use crate::linear_relation::{CanonicalLinearRelation, LinearRelation}; |
9 | 9 | use bls12_381::{G1Projective as G, Scalar}; |
| 10 | + use ff::Field; |
| 11 | + use group::Group; |
10 | 12 |
|
11 | 13 | #[test] |
12 | 14 | fn test_unassigned_group_vars() { |
@@ -67,8 +69,6 @@ mod instance_validation { |
67 | 69 | #[test] |
68 | 70 | #[allow(non_snake_case)] |
69 | 71 | pub fn test_degenerate_equation() { |
70 | | - use ff::Field; |
71 | | - |
72 | 72 | // This relation should fail for two reasons: |
73 | 73 | // 1. because var_B is not assigned |
74 | 74 | let mut relation = LinearRelation::<G>::new(); |
@@ -137,57 +137,70 @@ mod instance_validation { |
137 | 137 | let mut linear_relation = LinearRelation::<G>::new(); |
138 | 138 | let B_var = linear_relation.allocate_element(); |
139 | 139 | let C_var = linear_relation.allocate_eq(B_var); |
140 | | - linear_relation.set_element(B_var, B); |
141 | | - linear_relation.set_element(C_var, C); |
| 140 | + linear_relation.set_elements([(B_var, B), (C_var, C)]); |
142 | 141 | assert!(linear_relation.canonical().is_ok()); |
143 | 142 |
|
144 | 143 | // Also in this case, we know that no witness will ever satisfy the relation. |
145 | 144 | // Also here, the relation is built even though the prover will never be able to give a valid proof for it. |
146 | 145 | // X != B * pub_scalar + A * 3 |
147 | 146 | let mut linear_relation = LinearRelation::<G>::new(); |
148 | | - let B_var = linear_relation.allocate_element(); |
149 | | - let A_var = linear_relation.allocate_element(); |
| 147 | + let [B_var, A_var] = linear_relation.allocate_elements(); |
150 | 148 | let X_var = linear_relation.allocate_eq(B_var * pub_scalar + A_var * Scalar::from(3)); |
151 | | - |
152 | | - linear_relation.set_element(B_var, B); |
153 | | - linear_relation.set_element(A_var, A); |
154 | | - linear_relation.set_element(X_var, X); |
| 149 | + linear_relation.set_elements([(B_var, B), (A_var, A), (X_var, X)]); |
155 | 150 | assert!(linear_relation.canonical().is_ok()); |
156 | 151 |
|
157 | 152 | // The following relation is valid and should pass. |
158 | 153 | let mut linear_relation = LinearRelation::<G>::new(); |
159 | 154 | let B_var = linear_relation.allocate_element(); |
160 | 155 | let C_var = linear_relation.allocate_eq(B_var); |
161 | | - linear_relation.set_element(B_var, B); |
162 | | - linear_relation.set_element(C_var, B); |
| 156 | + linear_relation.set_elements([(B_var, B), (C_var, B)]); |
163 | 157 | assert!(linear_relation.canonical().is_ok()); |
164 | 158 |
|
165 | 159 | // The following relation is valid and should pass. |
166 | 160 | // C = B * pub_scalar + A * 3 |
167 | 161 | let mut linear_relation = LinearRelation::<G>::new(); |
168 | | - let B_var = linear_relation.allocate_element(); |
169 | | - let A_var = linear_relation.allocate_element(); |
| 162 | + let [B_var, A_var] = linear_relation.allocate_elements(); |
170 | 163 | let C_var = linear_relation.allocate_eq(B_var * pub_scalar + A_var * Scalar::from(3)); |
171 | | - |
172 | | - linear_relation.set_element(B_var, B); |
173 | | - linear_relation.set_element(A_var, A); |
174 | | - linear_relation.set_element(C_var, C); |
| 164 | + linear_relation.set_elements([(B_var, B), (A_var, A), (C_var, C)]); |
175 | 165 | assert!(linear_relation.canonical().is_ok()); |
176 | 166 |
|
177 | 167 | // The following relation is for |
178 | 168 | // X = B * x + B * pub_scalar + A * 3 |
179 | 169 | // and should be considered a valid instance. |
180 | 170 | let mut linear_relation = LinearRelation::<G>::new(); |
181 | | - |
182 | 171 | let x_var = linear_relation.allocate_scalar(); |
183 | | - let B_var = linear_relation.allocate_element(); |
184 | | - let A_var = linear_relation.allocate_element(); |
| 172 | + let [B_var, A_var] = linear_relation.allocate_elements(); |
185 | 173 | let X_var = linear_relation |
186 | 174 | .allocate_eq(B_var * x_var + B_var * pub_scalar + A_var * Scalar::from(3)); |
| 175 | + linear_relation.set_elements([(B_var, B), (A_var, A), (X_var, X)]); |
| 176 | + assert!(linear_relation.canonical().is_ok()); |
| 177 | + } |
| 178 | + |
| 179 | + // Create a relation with a zero image, such as |
| 180 | + // 0 = x*A + y*B + C |
| 181 | + // It should be accepted. |
| 182 | + #[test] |
| 183 | + fn test_statement_with_trivial_image() { |
| 184 | + let mut rng = rand::thread_rng(); |
| 185 | + let mut linear_relation = LinearRelation::new(); |
| 186 | + let [x_var, y_var] = linear_relation.allocate_scalars(); |
| 187 | + let [Z_var, A_var, B_var, C_var] = linear_relation.allocate_elements(); |
| 188 | + linear_relation.append_equation(Z_var, x_var * A_var + y_var * B_var + C_var); |
| 189 | + let [x, y] = [Scalar::random(&mut rng), Scalar::random(&mut rng)]; |
| 190 | + let Z = G::identity(); |
| 191 | + let A = G::random(&mut rng); |
| 192 | + let B = G::generator(); |
| 193 | + let C = -x * A - y * B; |
| 194 | + |
| 195 | + linear_relation.set_elements([(Z_var, Z), (A_var, A), (B_var, B), (C_var, C)]); |
| 196 | + assert!(linear_relation.canonical().is_ok()); |
187 | 197 |
|
188 | | - linear_relation.set_element(B_var, B); |
189 | | - linear_relation.set_element(A_var, A); |
190 | | - linear_relation.set_element(X_var, X); |
| 198 | + let F_var = linear_relation.allocate_element(); |
| 199 | + let f_var = linear_relation.allocate_scalar(); |
| 200 | + linear_relation.append_equation(F_var, f_var * A_var); |
| 201 | + let f = Scalar::random(&mut rng); |
| 202 | + let F = A * f; |
| 203 | + linear_relation.set_elements([(F_var, F), (A_var, A)]); |
191 | 204 | assert!(linear_relation.canonical().is_ok()); |
192 | 205 | } |
193 | 206 | } |
|
0 commit comments