Skip to content

Commit b719c67

Browse files
committed
stage 6
1 parent faffabf commit b719c67

File tree

9 files changed

+373
-445
lines changed

9 files changed

+373
-445
lines changed

jolt-core/src/subprotocols/booleanity.rs

Lines changed: 45 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,55 @@ use crate::{
2424
},
2525
transcripts::Transcript,
2626
utils::{expanding_table::ExpandingTable, thread::drop_in_background_thread},
27-
zkvm::witness::{CommittedPolynomial, VirtualPolynomial},
27+
zkvm::witness::CommittedPolynomial,
2828
};
2929

3030
/// Degree bound of the sumcheck round polynomials in [`BooleanitySumcheckVerifier`].
3131
const DEGREE_BOUND: usize = 3;
3232

33+
pub struct BooleanitySumcheckParams<F: JoltField> {
34+
/// Number of address chunks
35+
pub d: usize,
36+
/// Log of chunk size
37+
pub log_k_chunk: usize,
38+
/// Log of trace length
39+
pub log_t: usize,
40+
/// Batching challenges
41+
pub gammas: Vec<F::Challenge>,
42+
/// Address binding point
43+
pub r_address: Vec<F::Challenge>,
44+
/// Cycle binding point
45+
pub r_cycle: Vec<F::Challenge>,
46+
/// Polynomial types for opening accumulator
47+
pub polynomial_types: Vec<CommittedPolynomial>,
48+
/// Sumcheck ID for opening accumulator
49+
pub sumcheck_id: SumcheckId,
50+
}
51+
52+
impl<F: JoltField> SumcheckInstanceParams<F> for BooleanitySumcheckParams<F> {
53+
fn degree(&self) -> usize {
54+
DEGREE_BOUND
55+
}
56+
57+
fn num_rounds(&self) -> usize {
58+
self.log_k_chunk + self.log_t
59+
}
60+
61+
fn input_claim(&self, _accumulator: &dyn OpeningAccumulator<F>) -> F {
62+
F::zero()
63+
}
64+
65+
fn normalize_opening_point(
66+
&self,
67+
sumcheck_challenges: &[F::Challenge],
68+
) -> OpeningPoint<BIG_ENDIAN, F> {
69+
let mut opening_point = sumcheck_challenges.to_vec();
70+
opening_point[..self.log_k_chunk].reverse();
71+
opening_point[self.log_k_chunk..].reverse();
72+
opening_point.into()
73+
}
74+
}
75+
3376
/// Unified Booleanity Sumcheck implementation for RAM, Bytecode, and Instruction lookups
3477
#[derive(Allocative)]
3578
pub struct BooleanitySumcheckProver<F: JoltField> {
@@ -280,15 +323,13 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T> for BooleanityS
280323
})
281324
.collect::<Vec<F>>();
282325

283-
let r_cycle = self.params.get_r_cycle(accumulator);
284-
285326
let combined_r: Vec<F::Challenge> = self
286327
.params
287328
.r_address
288329
.iter()
289330
.cloned()
290331
.rev()
291-
.chain(r_cycle.iter().cloned().rev())
332+
.chain(self.params.r_cycle.iter().cloned().rev())
292333
.collect();
293334

294335
EqPolynomial::<F>::mle(sumcheck_challenges, &combined_r)
@@ -312,69 +353,3 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T> for BooleanityS
312353
);
313354
}
314355
}
315-
316-
impl<F: JoltField> SumcheckInstanceParams<F> for BooleanitySumcheckParams<F> {
317-
fn degree(&self) -> usize {
318-
DEGREE_BOUND
319-
}
320-
321-
fn num_rounds(&self) -> usize {
322-
self.log_k_chunk + self.log_t
323-
}
324-
325-
fn input_claim(&self, _accumulator: &dyn OpeningAccumulator<F>) -> F {
326-
F::zero()
327-
}
328-
329-
fn normalize_opening_point(
330-
&self,
331-
sumcheck_challenges: &[F::Challenge],
332-
) -> OpeningPoint<BIG_ENDIAN, F> {
333-
let mut opening_point = sumcheck_challenges.to_vec();
334-
opening_point[..self.log_k_chunk].reverse();
335-
opening_point[self.log_k_chunk..].reverse();
336-
opening_point.into()
337-
}
338-
}
339-
340-
pub struct BooleanitySumcheckParams<F: JoltField> {
341-
/// Number of address chunks
342-
pub d: usize,
343-
/// Log of chunk size
344-
pub log_k_chunk: usize,
345-
/// Log of trace length
346-
pub log_t: usize,
347-
/// Batching challenges
348-
pub gammas: Vec<F::Challenge>,
349-
/// Address binding point
350-
pub r_address: Vec<F::Challenge>,
351-
/// Cycle binding point
352-
pub r_cycle: Vec<F::Challenge>,
353-
/// Polynomial types for opening accumulator
354-
pub polynomial_types: Vec<CommittedPolynomial>,
355-
/// Sumcheck ID for opening accumulator
356-
pub sumcheck_id: SumcheckId,
357-
/// Optional virtual polynomial for r_cycle
358-
pub virtual_poly: Option<VirtualPolynomial>,
359-
}
360-
361-
impl<F: JoltField> BooleanitySumcheckParams<F> {
362-
pub fn num_rounds(&self) -> usize {
363-
self.log_k_chunk + self.log_t
364-
}
365-
366-
fn get_r_cycle(&self, accumulator: &dyn OpeningAccumulator<F>) -> Vec<F::Challenge> {
367-
if !self.r_cycle.is_empty() {
368-
self.r_cycle.clone()
369-
} else {
370-
let virtual_poly = self
371-
.virtual_poly
372-
.expect("virtual_poly must be set when r_cycle is empty");
373-
accumulator
374-
.get_virtual_polynomial_opening(virtual_poly, SumcheckId::SpartanOuter)
375-
.0
376-
.r
377-
.clone()
378-
}
379-
}
380-
}

jolt-core/src/subprotocols/hamming_weight.rs

Lines changed: 50 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ use crate::{
1616
unipoly::UniPoly,
1717
},
1818
subprotocols::{
19-
sumcheck_prover::SumcheckInstanceProver, sumcheck_verifier::SumcheckInstanceVerifier,
19+
sumcheck_prover::SumcheckInstanceProver,
20+
sumcheck_verifier::{SumcheckInstanceParams, SumcheckInstanceVerifier},
2021
},
2122
transcripts::Transcript,
2223
zkvm::witness::{CommittedPolynomial, VirtualPolynomial},
@@ -25,6 +26,44 @@ use crate::{
2526
/// Degree bound of the sumcheck round polynomials in [`HammingWeightSumcheckVerifier`].
2627
const DEGREE_BOUND: usize = 1;
2728

29+
pub struct HammingWeightSumcheckParams<F: JoltField> {
30+
pub d: usize,
31+
pub num_rounds: usize,
32+
pub gamma_powers: Vec<F>,
33+
pub polynomial_types: Vec<CommittedPolynomial>,
34+
pub sumcheck_id: SumcheckId,
35+
pub r_cycle: Vec<F::Challenge>,
36+
}
37+
38+
impl<F: JoltField> SumcheckInstanceParams<F> for HammingWeightSumcheckParams<F> {
39+
fn num_rounds(&self) -> usize {
40+
self.num_rounds
41+
}
42+
43+
fn input_claim(&self, accumulator: &dyn OpeningAccumulator<F>) -> F {
44+
if self.sumcheck_id == SumcheckId::RamHammingWeight {
45+
let (_, hamming_booleanity_claim) = accumulator.get_virtual_polynomial_opening(
46+
VirtualPolynomial::RamHammingWeight,
47+
SumcheckId::RamHammingBooleanity,
48+
);
49+
hamming_booleanity_claim * self.gamma_powers.iter().sum::<F>()
50+
} else {
51+
self.gamma_powers.iter().sum()
52+
}
53+
}
54+
55+
fn degree(&self) -> usize {
56+
DEGREE_BOUND
57+
}
58+
59+
fn normalize_opening_point(
60+
&self,
61+
challenges: &[<F as JoltField>::Challenge],
62+
) -> OpeningPoint<BIG_ENDIAN, F> {
63+
OpeningPoint::<LITTLE_ENDIAN, F>::new(challenges.to_vec()).match_endianness()
64+
}
65+
}
66+
2867
#[derive(Allocative)]
2968
pub struct HammingWeightSumcheckProver<F: JoltField> {
3069
ra: Vec<MultilinearPolynomial<F>>,
@@ -40,16 +79,8 @@ impl<F: JoltField> HammingWeightSumcheckProver<F> {
4079
}
4180

4281
impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T> for HammingWeightSumcheckProver<F> {
43-
fn degree(&self) -> usize {
44-
DEGREE_BOUND
45-
}
46-
47-
fn num_rounds(&self) -> usize {
48-
self.params.num_rounds
49-
}
50-
51-
fn input_claim(&self, accumulator: &ProverOpeningAccumulator<F>) -> F {
52-
self.params.input_claim(accumulator)
82+
fn get_params(&self) -> Box<&dyn SumcheckInstanceParams<F>> {
83+
Box::new(&self.params)
5384
}
5485

5586
#[tracing::instrument(skip_all, name = "HammingWeightProver::compute_message")]
@@ -87,17 +118,15 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T> for HammingWeight
87118
transcript: &mut T,
88119
sumcheck_challenges: &[F::Challenge],
89120
) {
90-
let opening_point = get_opening_point::<F>(sumcheck_challenges);
121+
let opening_point = self.params.normalize_opening_point(sumcheck_challenges);
91122
let claims: Vec<F> = self.ra.iter().map(|ra| ra.final_sumcheck_claim()).collect();
92123

93-
let r_cycle = self.params.get_r_cycle(accumulator);
94-
95124
accumulator.append_sparse(
96125
transcript,
97126
self.params.polynomial_types.clone(),
98127
self.params.sumcheck_id,
99128
opening_point.r,
100-
r_cycle,
129+
self.params.r_cycle.clone(),
101130
claims,
102131
);
103132
}
@@ -121,16 +150,8 @@ impl<F: JoltField> HammingWeightSumcheckVerifier<F> {
121150
impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
122151
for HammingWeightSumcheckVerifier<F>
123152
{
124-
fn degree(&self) -> usize {
125-
DEGREE_BOUND
126-
}
127-
128-
fn num_rounds(&self) -> usize {
129-
self.params.num_rounds
130-
}
131-
132-
fn input_claim(&self, accumulator: &VerifierOpeningAccumulator<F>) -> F {
133-
self.params.input_claim(accumulator)
153+
fn get_params(&self) -> Box<&dyn SumcheckInstanceParams<F>> {
154+
Box::new(&self.params)
134155
}
135156

136157
fn expected_output_claim(
@@ -159,12 +180,13 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
159180
transcript: &mut T,
160181
sumcheck_challenges: &[F::Challenge],
161182
) {
162-
let r_cycle = self.params.get_r_cycle(accumulator);
163-
let r = get_opening_point::<F>(sumcheck_challenges)
183+
let r = self
184+
.params
185+
.normalize_opening_point(sumcheck_challenges)
164186
.r
165187
.iter()
166188
.cloned()
167-
.chain(r_cycle.iter().cloned())
189+
.chain(self.params.r_cycle.iter().cloned())
168190
.collect::<Vec<_>>();
169191

170192
accumulator.append_sparse(
@@ -175,47 +197,3 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
175197
);
176198
}
177199
}
178-
179-
pub struct HammingWeightSumcheckParams<F: JoltField> {
180-
pub d: usize,
181-
pub num_rounds: usize,
182-
pub gamma_powers: Vec<F>,
183-
pub polynomial_types: Vec<CommittedPolynomial>,
184-
pub sumcheck_id: SumcheckId,
185-
pub virtual_poly: Option<VirtualPolynomial>,
186-
pub r_cycle_sumcheck_id: SumcheckId,
187-
}
188-
189-
impl<F: JoltField> HammingWeightSumcheckParams<F> {
190-
pub fn num_rounds(&self) -> usize {
191-
self.num_rounds
192-
}
193-
194-
pub fn input_claim(&self, accumulator: &dyn OpeningAccumulator<F>) -> F {
195-
if self.sumcheck_id == SumcheckId::RamHammingWeight {
196-
let (_, hamming_booleanity_claim) = accumulator.get_virtual_polynomial_opening(
197-
VirtualPolynomial::RamHammingWeight,
198-
SumcheckId::RamHammingBooleanity,
199-
);
200-
hamming_booleanity_claim * self.gamma_powers.iter().sum::<F>()
201-
} else {
202-
self.gamma_powers.iter().sum()
203-
}
204-
}
205-
206-
fn get_r_cycle(&self, accumulator: &dyn OpeningAccumulator<F>) -> Vec<F::Challenge> {
207-
let virtual_poly = self
208-
.virtual_poly
209-
.expect("virtual_poly must be set for hamming weight");
210-
accumulator
211-
.get_virtual_polynomial_opening(virtual_poly, self.r_cycle_sumcheck_id)
212-
.0
213-
.r
214-
}
215-
}
216-
217-
fn get_opening_point<F: JoltField>(
218-
sumcheck_challenges: &[F::Challenge],
219-
) -> OpeningPoint<BIG_ENDIAN, F> {
220-
OpeningPoint::<LITTLE_ENDIAN, F>::new(sumcheck_challenges.to_vec()).match_endianness()
221-
}

0 commit comments

Comments
 (0)