Skip to content

Commit 46d2f1f

Browse files
committed
Stronger checks for linear relations
1 parent 7f0f9f5 commit 46d2f1f

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/linear_relation/mod.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -682,12 +682,12 @@ impl<G: PrimeGroup> TryFrom<&LinearRelation<G>> for CanonicalLinearRelation<G> {
682682
{
683683
return Err(Error::InvalidInstanceWitnessPair);
684684
}
685-
686685
// Empty relations (without constraints) cannot be proven
687686
if relation.linear_map.linear_combinations.is_empty() {
688687
return Err(Error::InvalidInstanceWitnessPair);
689688
}
690689

690+
// If any linear combination is empty, the relation is invalid
691691
if relation
692692
.linear_map
693693
.linear_combinations
@@ -697,6 +697,18 @@ impl<G: PrimeGroup> TryFrom<&LinearRelation<G>> for CanonicalLinearRelation<G> {
697697
return Err(Error::InvalidInstanceWitnessPair);
698698
}
699699

700+
// If any linear combination has no witness variables, the relation is invalid
701+
if relation
702+
.linear_map
703+
.linear_combinations
704+
.iter()
705+
.any(|lc| lc.0.iter().all(|weighted| matches!(weighted.term.scalar, ScalarTerm::Unit)))
706+
{
707+
return Err(Error::InvalidInstanceWitnessPair);
708+
}
709+
710+
711+
700712
let mut canonical = CanonicalLinearRelation::new();
701713
canonical.num_scalars = relation.linear_map.num_scalars;
702714

src/tests/test_validation_criteria.rs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,17 +136,41 @@ mod instance_validation {
136136
fn without_witness() {
137137
let B = G::generator();
138138
let A = G::generator() * Scalar::from(42);
139+
let X = G::generator() * Scalar::from(4);
139140
let pub_scalar = Scalar::from(42);
140141

141142
let mut linear_relation = LinearRelation::<G>::new();
143+
142144
let B_var = linear_relation.allocate_element();
143145
let A_var = linear_relation.allocate_element();
144-
let _X_var = linear_relation.allocate_eq(B_var * pub_scalar + A_var * Scalar::from(3));
146+
let X_var = linear_relation.allocate_eq(B_var * pub_scalar + A_var * Scalar::from(3));
147+
148+
linear_relation.set_element(B_var, B);
149+
linear_relation.set_element(A_var, A);
150+
linear_relation.set_element(X_var, X);
145151

146152
linear_relation.set_element(B_var, B);
147153
linear_relation.set_element(A_var, A);
148154
let result = CanonicalLinearRelation::try_from(&linear_relation);
149155
assert!(result.is_err());
156+
157+
158+
let mut linear_relation = LinearRelation::<G>::new();
159+
160+
let x_var = linear_relation.allocate_scalar();
161+
let B_var = linear_relation.allocate_element();
162+
let A_var = linear_relation.allocate_element();
163+
let X_var = linear_relation.allocate_eq(B_var * x_var + B_var * pub_scalar + A_var * Scalar::from(3));
164+
165+
linear_relation.set_element(B_var, B);
166+
linear_relation.set_element(A_var, A);
167+
linear_relation.set_element(X_var, X);
168+
169+
linear_relation.set_element(B_var, B);
170+
linear_relation.set_element(A_var, A);
171+
let result = CanonicalLinearRelation::try_from(&linear_relation);
172+
assert!(result.is_ok());
173+
150174
}
151175
}
152176

0 commit comments

Comments
 (0)