Skip to content

Commit 10aba15

Browse files
Proofs and claims merged
1 parent 65387a2 commit 10aba15

10 files changed

Lines changed: 62 additions & 116 deletions

File tree

benches/multi_stark.rs

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ fn build_witness(num_adds: usize, system: &System<U32CS>) -> SystemWitness {
176176
}
177177

178178
/// Build claims for the first `num_adds` additions (same PRNG seed as `build_witness`).
179-
fn build_claims(num_adds: usize) -> Vec<[Val; 4]> {
179+
fn build_claims(num_adds: usize) -> Vec<Vec<Val>> {
180180
let f = Val::from_u32;
181181
let mut a: u32 = 0xdead_beef;
182182
let mut b: u32 = 0xcafe_babe;
@@ -191,7 +191,7 @@ fn build_claims(num_adds: usize) -> Vec<[Val; 4]> {
191191
let x = a;
192192
let y = b;
193193
let (z, _carry) = x.overflowing_add(y);
194-
claims.push([f(1), f(x), f(y), f(z)]);
194+
claims.push(vec![f(1), f(x), f(y), f(z)]);
195195
}
196196
claims
197197
}
@@ -223,15 +223,12 @@ fn bench_prove(c: &mut Criterion) {
223223
for log_height in [12, 13, 14] {
224224
let num_adds = 1 << log_height;
225225
let claims = build_claims(num_adds);
226-
let claim_refs: Vec<&[Val]> = claims.iter().map(|c| c.as_slice()).collect();
227226
group.bench_function(
228227
BenchmarkId::new("u32_add", format!("2^{log_height}")),
229228
|b| {
230229
b.iter_batched(
231-
|| build_witness(num_adds, &system),
232-
|witness| {
233-
system.prove_multiple_claims(fri_parameters, &key, &claim_refs, witness)
234-
},
230+
|| (build_witness(num_adds, &system), claims.clone()),
231+
|(witness, claims)| system.prove(fri_parameters, &key, claims, witness),
235232
criterion::BatchSize::LargeInput,
236233
);
237234
},
@@ -263,17 +260,12 @@ fn bench_verify(c: &mut Criterion) {
263260
for log_height in [12, 13, 14] {
264261
let num_adds = 1 << log_height;
265262
let claims = build_claims(num_adds);
266-
let claim_refs: Vec<&[Val]> = claims.iter().map(|c| c.as_slice()).collect();
267263
let witness = build_witness(num_adds, &system);
268-
let proof = system.prove_multiple_claims(fri_parameters, &key, &claim_refs, witness);
264+
let proof = system.prove(fri_parameters, &key, claims, witness);
269265
group.bench_function(
270266
BenchmarkId::new("u32_add", format!("2^{log_height}")),
271267
|b| {
272-
b.iter(|| {
273-
system
274-
.verify_multiple_claims(fri_parameters, &claim_refs, &proof)
275-
.unwrap()
276-
});
268+
b.iter(|| system.verify(fri_parameters, &proof).unwrap());
277269
},
278270
);
279271
}

examples/lookup_proof.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ fn main() {
141141
);
142142

143143
// Claim: [even_index=0, input=4, expected_output=1] — is_even(4) should be 1
144-
let claim = &[f(0), f(4), f(1)];
144+
let claim = vec![f(0), f(4), f(1)];
145145
let fri_parameters = FriParameters {
146146
log_final_poly_len: 0,
147147
max_log_arity: 1,
@@ -150,8 +150,8 @@ fn main() {
150150
query_proof_of_work_bits: 0,
151151
};
152152

153-
let proof = system.prove(fri_parameters, &key, claim, witness);
154-
system.verify(fri_parameters, claim, &proof).unwrap();
153+
let proof = system.prove(fri_parameters, &key, vec![claim], witness);
154+
system.verify(fri_parameters, &proof).unwrap();
155155
println!("Lookup proof verified successfully!");
156156

157157
let bytes = proof.to_bytes().expect("serialization failed");

examples/preprocessed_proof.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -125,11 +125,8 @@ fn main() {
125125
query_proof_of_work_bits: 0,
126126
};
127127

128-
let no_claims: &[&[Val]] = &[];
129-
let proof = system.prove_multiple_claims(fri_parameters, &key, no_claims, witness);
130-
system
131-
.verify_multiple_claims(fri_parameters, no_claims, &proof)
132-
.unwrap();
128+
let proof = system.prove(fri_parameters, &key, vec![], witness);
129+
system.verify(fri_parameters, &proof).unwrap();
133130
println!("Preprocessed proof verified successfully!");
134131

135132
let bytes = proof.to_bytes().expect("serialization failed");

examples/simple_proof.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,10 @@ fn main() {
8383
};
8484

8585
// Prove
86-
let no_claims = &[];
87-
let proof = system.prove_multiple_claims(fri_parameters, &key, no_claims, witness);
86+
let proof = system.prove(fri_parameters, &key, vec![], witness);
8887

8988
// Verify
90-
system
91-
.verify_multiple_claims(fri_parameters, no_claims, &proof)
92-
.unwrap();
89+
system.verify(fri_parameters, &proof).unwrap();
9390
println!("Proof verified successfully!");
9491

9592
// Show proof size

src/lookup.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -409,15 +409,15 @@ mod tests {
409409
],
410410
&system,
411411
);
412-
let claim = &[f(0), f(4), f(1)];
412+
let claims = vec![vec![f(0), f(4), f(1)]];
413413
let fri_parameters = FriParameters {
414414
log_final_poly_len: 0,
415415
max_log_arity: 1,
416416
num_queries: 64,
417417
commit_proof_of_work_bits: 0,
418418
query_proof_of_work_bits: 0,
419419
};
420-
let proof = system.prove(fri_parameters, &key, claim, witness);
421-
system.verify(fri_parameters, claim, &proof).unwrap();
420+
let proof = system.prove(fri_parameters, &key, claims, witness);
421+
system.verify(fri_parameters, &proof).unwrap();
422422
}
423423
}

src/prover.rs

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ pub struct Proof {
203203
pub preprocessed_opened_values: Option<OpenedValuesForRound<ExtVal>>,
204204
pub stage_1_opened_values: OpenedValuesForRound<ExtVal>,
205205
pub stage_2_opened_values: OpenedValuesForRound<ExtVal>,
206+
/// Claims bound to this proof, observed into the Fiat-Shamir transcript before
207+
/// lookup challenges are sampled. The verifier reads claims directly from here.
208+
pub claims: Vec<Vec<Val>>,
206209
}
207210

208211
impl Proof {
@@ -223,28 +226,15 @@ impl Proof {
223226
}
224227

225228
impl<A: BaseAir<Val> + for<'a> Air<ProverConstraintFolder<'a>>> System<A> {
226-
/// Generates a STARK proof for the system with a single claim.
229+
/// Generates a STARK proof for the system.
227230
///
228-
/// This is a convenience wrapper around [`Self::prove_multiple_claims`].
231+
/// Each claim is a vector of field elements observed by the challenger before
232+
/// lookup challenges are sampled, binding the proof to the claimed values.
229233
pub fn prove(
230234
&self,
231235
fri_parameters: FriParameters,
232236
key: &ProverKey,
233-
claim: &[Val],
234-
witness: SystemWitness,
235-
) -> Proof {
236-
self.prove_multiple_claims(fri_parameters, key, &[claim], witness)
237-
}
238-
239-
/// Generates a STARK proof for the system with multiple claims.
240-
///
241-
/// Each claim is a slice of field elements that is observed by the challenger
242-
/// before lookup challenges are sampled, binding the proof to the claimed values.
243-
pub fn prove_multiple_claims(
244-
&self,
245-
fri_parameters: FriParameters,
246-
key: &ProverKey,
247-
claims: &[&[Val]],
237+
claims: Vec<Vec<Val>>,
248238
witness: SystemWitness,
249239
) -> Proof {
250240
// initialize pcs and challenger
@@ -279,7 +269,7 @@ impl<A: BaseAir<Val> + for<'a> Air<ProverConstraintFolder<'a>>> System<A> {
279269
// observe the claims
280270
// this has to be done before generating the lookup argument challenge
281271
// otherwise the lookup argument can be attacked
282-
for claim in claims {
272+
for claim in &claims {
283273
challenger.observe_slice(claim);
284274
}
285275

@@ -291,7 +281,7 @@ impl<A: BaseAir<Val> + for<'a> Air<ProverConstraintFolder<'a>>> System<A> {
291281

292282
// construct the accumulator from the claims
293283
let mut acc = ExtVal::ZERO;
294-
for claim in claims {
284+
for claim in &claims {
295285
let message = lookup_argument_challenge
296286
+ fingerprint(&fingerprint_challenge, claim.iter().cloned());
297287
acc += message.inverse();
@@ -465,6 +455,7 @@ impl<A: BaseAir<Val> + for<'a> Air<ProverConstraintFolder<'a>>> System<A> {
465455
preprocessed_opened_values,
466456
stage_1_opened_values,
467457
stage_2_opened_values,
458+
claims,
468459
}
469460
}
470461
}

src/test_circuits/blake3.rs

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,9 +2321,6 @@ mod tests {
23212321

23222322
let (_traces, witness) = claims.witness(&system);
23232323

2324-
let claims_slice: Vec<&[Val]> = claims.claims.iter().map(|v| v.as_slice()).collect();
2325-
let claims_slice: &[&[Val]] = &claims_slice;
2326-
23272324
let fri_parameters = FriParameters {
23282325
log_final_poly_len: 0,
23292326
max_log_arity: 1,
@@ -2332,10 +2329,9 @@ mod tests {
23322329
query_proof_of_work_bits: 0,
23332330
};
23342331

2335-
let proof =
2336-
system.prove_multiple_claims(fri_parameters, &prover_key, claims_slice, witness);
2332+
let proof = system.prove(fri_parameters, &prover_key, claims.claims, witness);
23372333
system
2338-
.verify_multiple_claims(fri_parameters, claims_slice, &proof)
2334+
.verify(fri_parameters, &proof)
23392335
.expect("verification issue");
23402336
}
23412337

@@ -2495,9 +2491,7 @@ mod tests {
24952491
);
24962492

24972493
let (_traces, witness) = claims.witness(&system);
2498-
2499-
let claims_slice: Vec<&[Val]> = claims.claims.iter().map(|v| v.as_slice()).collect();
2500-
let claims_slice: &[&[Val]] = &claims_slice;
2494+
let claim_vecs = claims.claims.clone();
25012495

25022496
let fri_parameters = FriParameters {
25032497
log_final_poly_len: 0,
@@ -2507,10 +2501,9 @@ mod tests {
25072501
query_proof_of_work_bits: 0,
25082502
};
25092503

2510-
let proof =
2511-
system.prove_multiple_claims(fri_parameters, &prover_key, claims_slice, witness);
2504+
let proof = system.prove(fri_parameters, &prover_key, claim_vecs, witness);
25122505
system
2513-
.verify_multiple_claims(fri_parameters, claims_slice, &proof)
2506+
.verify(fri_parameters, &proof)
25142507
.expect("verification issue");
25152508
}
25162509

src/test_circuits/byte_operations.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,21 +139,20 @@ mod tests {
139139
};
140140
let witness = calls.witness(&system);
141141
let f = Val::from_u32;
142-
let claim1 = &[f(0), f(10), f(5), f(10 ^ 5)];
143-
let claim2 = &[f(1), f(30), f(20), f(30 & 20)];
144-
let claim3 = &[f(2), f(100), f(40), f(100 | 40)];
145-
let claim4 = &[f(3), f(200), f(100)];
146-
let claims: &[&[Val]] = &[claim1, claim2, claim3, claim4];
142+
let claims = vec![
143+
vec![f(0), f(10), f(5), f(10 ^ 5)],
144+
vec![f(1), f(30), f(20), f(30 & 20)],
145+
vec![f(2), f(100), f(40), f(100 | 40)],
146+
vec![f(3), f(200), f(100)],
147+
];
147148
let fri_parameters = FriParameters {
148149
log_final_poly_len: 0,
149150
max_log_arity: 1,
150151
num_queries: 64,
151152
commit_proof_of_work_bits: 0,
152153
query_proof_of_work_bits: 0,
153154
};
154-
let proof = system.prove_multiple_claims(fri_parameters, &key, claims, witness);
155-
system
156-
.verify_multiple_claims(fri_parameters, claims, &proof)
157-
.unwrap();
155+
let proof = system.prove(fri_parameters, &key, claims, witness);
156+
system.verify(fri_parameters, &proof).unwrap();
158157
}
159158
}

src/test_circuits/u32_add.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -197,21 +197,20 @@ mod tests {
197197
};
198198
let witness = calls.witness(&system);
199199
let f = Val::from_u32;
200-
let claim1 = &[f(1), f(10), f(5), f(15)];
201-
let claim2 = &[f(1), f(30), f(20), f(50)];
202-
let claim3 = &[f(1), f(100), f(100), f(200)];
203-
let claim4 = &[f(1), f(8000), f(10000), f(18000)];
204-
let claims: &[&[Val]] = &[claim1, claim2, claim3, claim4];
200+
let claims = vec![
201+
vec![f(1), f(10), f(5), f(15)],
202+
vec![f(1), f(30), f(20), f(50)],
203+
vec![f(1), f(100), f(100), f(200)],
204+
vec![f(1), f(8000), f(10000), f(18000)],
205+
];
205206
let fri_parameters = FriParameters {
206207
log_final_poly_len: 0,
207208
max_log_arity: 1,
208209
num_queries: 64,
209210
commit_proof_of_work_bits: 0,
210211
query_proof_of_work_bits: 0,
211212
};
212-
let proof = system.prove_multiple_claims(fri_parameters, &key, claims, witness);
213-
system
214-
.verify_multiple_claims(fri_parameters, claims, &proof)
215-
.unwrap();
213+
let proof = system.prove(fri_parameters, &key, claims, witness);
214+
system.verify(fri_parameters, &proof).unwrap();
216215
}
217216
}

0 commit comments

Comments
 (0)