Skip to content

Commit 56d26b8

Browse files
committed
stage 5
1 parent bf9cdfb commit 56d26b8

File tree

5 files changed

+100
-90
lines changed

5 files changed

+100
-90
lines changed

jolt-core/src/zkvm/prover.rs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ use crate::{
1919
commitment_scheme::StreamingCommitmentScheme,
2020
dory::{DoryContext, DoryGlobals},
2121
},
22-
multilinear_polynomial::{MultilinearPolynomial, PolynomialEvaluation},
23-
opening_proof::{
24-
OpeningAccumulator, ProverOpeningAccumulator, ReducedOpeningProof, SumcheckId,
25-
},
22+
multilinear_polynomial::MultilinearPolynomial,
23+
opening_proof::{ProverOpeningAccumulator, ReducedOpeningProof},
2624
rlc_polynomial::RLCStreamingData,
2725
},
2826
pprof_scope,
@@ -35,6 +33,7 @@ use crate::{
3533
zkvm::{
3634
config::{get_log_k_chunk, OneHotParams},
3735
ram::{
36+
hamming_booleanity::HammingBooleanityParams,
3837
output_check::OutputSumcheckParams,
3938
populate_memory_states,
4039
raf_evaluation::RafEvaluationSumcheckParams,
@@ -45,7 +44,10 @@ use crate::{
4544
},
4645
val_final::{ValFinalSumcheckParams, ValFinalSumcheckProver},
4746
},
48-
registers::read_write_checking::RegistersReadWriteCheckingParams,
47+
registers::{
48+
read_write_checking::RegistersReadWriteCheckingParams,
49+
val_evaluation::RegistersValEvaluationSumcheckParams,
50+
},
4951
spartan::{instruction_input::InstructionInputParams, shift::ShiftSumcheckParams},
5052
verifier::JoltVerifierPreprocessing,
5153
},
@@ -80,7 +82,7 @@ use crate::{
8082
product::ProductVirtualRemainderProver, prove_stage1_uni_skip, prove_stage2_uni_skip,
8183
shift::ShiftSumcheckProver,
8284
},
83-
witness::{AllCommittedPolynomials, CommittedPolynomial, VirtualPolynomial},
85+
witness::{AllCommittedPolynomials, CommittedPolynomial},
8486
ProverDebugInfo, Serializable,
8587
},
8688
};
@@ -759,15 +761,19 @@ impl<'a, F: JoltField, PCS: StreamingCommitmentScheme<Field = F>, ProofTranscrip
759761
fn prove_stage5(&mut self) -> SumcheckInstanceProof<F, ProofTranscript> {
760762
#[cfg(not(target_arch = "wasm32"))]
761763
print_current_memory_usage("Stage 5 baseline");
764+
let registers_val_evaluation_params =
765+
RegistersValEvaluationSumcheckParams::new(&self.opening_accumulator);
766+
let ram_hamming_booleanity_params = HammingBooleanityParams::new(&self.opening_accumulator);
762767

763-
let registers_val_evaluation = RegistersValEvaluationSumcheckProver::gen(
768+
let registers_val_evaluation = RegistersValEvaluationSumcheckProver::initialize(
769+
registers_val_evaluation_params,
764770
&self.trace,
765771
&self.preprocessing.bytecode,
766772
&self.program_io.memory_layout,
767-
&self.opening_accumulator,
768773
);
769774
let ram_hamming_booleanity =
770-
HammingBooleanitySumcheckProver::gen(&self.trace, &self.opening_accumulator);
775+
HammingBooleanitySumcheckProver::initialize(ram_hamming_booleanity_params, &self.trace);
776+
771777
let ram_ra_virtual = RamRaSumcheckProver::gen(
772778
&self.trace,
773779
&self.program_io.memory_layout,

jolt-core/src/zkvm/ram/hamming_booleanity.rs

Lines changed: 52 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,13 @@ use crate::poly::opening_proof::{
88
use crate::poly::split_eq_poly::GruenSplitEqPolynomial;
99
use crate::poly::unipoly::UniPoly;
1010
use crate::subprotocols::sumcheck_prover::SumcheckInstanceProver;
11-
use crate::subprotocols::sumcheck_verifier::SumcheckInstanceVerifier;
11+
use crate::subprotocols::sumcheck_verifier::{SumcheckInstanceParams, SumcheckInstanceVerifier};
1212
use crate::transcripts::Transcript;
13-
use crate::utils::math::Math;
1413
use crate::zkvm::witness::VirtualPolynomial;
1514
use allocative::Allocative;
1615
#[cfg(feature = "allocative")]
1716
use allocative::FlameGraphBuilder;
1817
use rayon::prelude::*;
19-
use std::marker::PhantomData;
2018
use tracer::instruction::Cycle;
2119

2220
// RAM Hamming booleanity sumcheck
@@ -30,53 +28,74 @@ use tracer::instruction::Cycle;
3028
/// Degree bound of the sumcheck round polynomials in [`HammingBooleanitySumcheckVerifier`].
3129
const DEGREE_BOUND: usize = 3;
3230

31+
#[derive(Allocative)]
32+
pub struct HammingBooleanityParams<F: JoltField> {
33+
r_cycle: OpeningPoint<BIG_ENDIAN, F>,
34+
}
35+
36+
impl<F: JoltField> HammingBooleanityParams<F> {
37+
pub fn new(opening_accumulator: &dyn OpeningAccumulator<F>) -> Self {
38+
let (r_cycle, _) = opening_accumulator.get_virtual_polynomial_opening(
39+
VirtualPolynomial::LookupOutput,
40+
SumcheckId::SpartanOuter,
41+
);
42+
43+
Self { r_cycle }
44+
}
45+
}
46+
47+
impl<F: JoltField> SumcheckInstanceParams<F> for HammingBooleanityParams<F> {
48+
fn degree(&self) -> usize {
49+
DEGREE_BOUND
50+
}
51+
52+
fn num_rounds(&self) -> usize {
53+
self.r_cycle.len()
54+
}
55+
56+
fn input_claim(&self, _: &dyn OpeningAccumulator<F>) -> F {
57+
F::zero()
58+
}
59+
60+
fn normalize_opening_point(
61+
&self,
62+
challenges: &[<F as JoltField>::Challenge],
63+
) -> OpeningPoint<BIG_ENDIAN, F> {
64+
OpeningPoint::<LITTLE_ENDIAN, F>::new(challenges.to_vec()).match_endianness()
65+
}
66+
}
67+
3368
#[derive(Allocative)]
3469
pub struct HammingBooleanitySumcheckProver<F: JoltField> {
3570
eq_r_cycle: GruenSplitEqPolynomial<F>,
3671
H: MultilinearPolynomial<F>,
37-
log_T: usize,
72+
params: HammingBooleanityParams<F>,
3873
}
3974

4075
impl<F: JoltField> HammingBooleanitySumcheckProver<F> {
41-
#[tracing::instrument(skip_all, name = "RamHammingBooleanitySumcheckProver::gen")]
42-
pub fn gen(trace: &[Cycle], opening_accumulator: &ProverOpeningAccumulator<F>) -> Self {
43-
let T = trace.len();
44-
let log_T = T.log_2();
45-
76+
#[tracing::instrument(skip_all, name = "RamHammingBooleanitySumcheckProver::initialize")]
77+
pub fn initialize(params: HammingBooleanityParams<F>, trace: &[Cycle]) -> Self {
4678
let H = trace
4779
.par_iter()
4880
.map(|cycle| cycle.ram_access().address() != 0)
4981
.collect::<Vec<bool>>();
5082
let H = MultilinearPolynomial::from(H);
5183

52-
let (r_cycle, _) = opening_accumulator.get_virtual_polynomial_opening(
53-
VirtualPolynomial::LookupOutput,
54-
SumcheckId::SpartanOuter,
55-
);
56-
57-
let eq_r_cycle = GruenSplitEqPolynomial::new(&r_cycle.r, BindingOrder::LowToHigh);
84+
let eq_r_cycle = GruenSplitEqPolynomial::new(&params.r_cycle.r, BindingOrder::LowToHigh);
5885

5986
Self {
6087
eq_r_cycle,
6188
H,
62-
log_T,
89+
params,
6390
}
6491
}
6592
}
6693

6794
impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T>
6895
for HammingBooleanitySumcheckProver<F>
6996
{
70-
fn degree(&self) -> usize {
71-
DEGREE_BOUND
72-
}
73-
74-
fn num_rounds(&self) -> usize {
75-
self.log_T
76-
}
77-
78-
fn input_claim(&self, _accumulator: &ProverOpeningAccumulator<F>) -> F {
79-
F::zero()
97+
fn get_params(&self) -> Box<&dyn SumcheckInstanceParams<F>> {
98+
Box::new(&self.params)
8099
}
81100

82101
#[tracing::instrument(skip_all, name = "RamHammingBooleanitySumcheckProver::compute_message")]
@@ -113,7 +132,7 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T>
113132
transcript,
114133
VirtualPolynomial::RamHammingWeight,
115134
SumcheckId::RamHammingBooleanity,
116-
get_opening_point(sumcheck_challenges),
135+
self.params.normalize_opening_point(sumcheck_challenges),
117136
self.H.final_sumcheck_claim(),
118137
);
119138
}
@@ -125,33 +144,22 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T>
125144
}
126145

127146
pub struct HammingBooleanitySumcheckVerifier<F: JoltField> {
128-
log_T: usize,
129-
_phantom: PhantomData<F>,
147+
params: HammingBooleanityParams<F>,
130148
}
131149

132150
impl<F: JoltField> HammingBooleanitySumcheckVerifier<F> {
133-
pub fn new(n_cycle_vars: usize) -> Self {
151+
pub fn new(opening_accumulator: &dyn OpeningAccumulator<F>) -> Self {
134152
Self {
135-
// TODO: Make the name for this consistent across the codebase.
136-
log_T: n_cycle_vars,
137-
_phantom: PhantomData,
153+
params: HammingBooleanityParams::new(opening_accumulator),
138154
}
139155
}
140156
}
141157

142158
impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
143159
for HammingBooleanitySumcheckVerifier<F>
144160
{
145-
fn degree(&self) -> usize {
146-
DEGREE_BOUND
147-
}
148-
149-
fn num_rounds(&self) -> usize {
150-
self.log_T
151-
}
152-
153-
fn input_claim(&self, _accumulator: &VerifierOpeningAccumulator<F>) -> F {
154-
F::zero()
161+
fn get_params(&self) -> Box<&dyn SumcheckInstanceParams<F>> {
162+
Box::new(&self.params)
155163
}
156164

157165
fn expected_output_claim(
@@ -194,13 +202,7 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
194202
transcript,
195203
VirtualPolynomial::RamHammingWeight,
196204
SumcheckId::RamHammingBooleanity,
197-
get_opening_point(sumcheck_challenges),
205+
self.params.normalize_opening_point(sumcheck_challenges),
198206
);
199207
}
200208
}
201-
202-
fn get_opening_point<F: JoltField>(
203-
sumcheck_challenges: &[F::Challenge],
204-
) -> OpeningPoint<BIG_ENDIAN, F> {
205-
OpeningPoint::<LITTLE_ENDIAN, F>::new(sumcheck_challenges.to_vec()).match_endianness()
206-
}

jolt-core/src/zkvm/ram/ra_virtual.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ pub struct RaSumcheckProver<F: JoltField> {
4949
ra_i_polys: Vec<RaPolynomial<u16, F>>,
5050
/// eq poly
5151
eq_poly: MultilinearPolynomial<F>,
52-
#[allocative(skip)]
5352
params: RaSumcheckParams<F>,
5453
}
5554

@@ -271,6 +270,7 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T> for RaSumcheckV
271270
}
272271
}
273272

273+
#[derive(Allocative)]
274274
struct RaSumcheckParams<F: JoltField> {
275275
gamma_powers: [F; 3],
276276
/// Random challenge r_cycle

jolt-core/src/zkvm/registers/val_evaluation.rs

Lines changed: 28 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ use crate::{
2020
sumcheck_verifier::{SumcheckInstanceParams, SumcheckInstanceVerifier},
2121
},
2222
transcripts::Transcript,
23-
utils::math::Math,
2423
zkvm::{
2524
bytecode::BytecodePreprocessing,
2625
witness::{CommittedPolynomial, VirtualPolynomial},
@@ -52,23 +51,30 @@ const LOG_K: usize = REGISTER_COUNT.ilog2() as usize;
5251
const DEGREE_BOUND: usize = 3;
5352

5453
#[derive(Allocative)]
55-
struct ValEvaluationSumcheckParams {
56-
n_cycle_vars: usize,
54+
pub struct RegistersValEvaluationSumcheckParams<F: JoltField> {
55+
r_address: OpeningPoint<BIG_ENDIAN, F>,
56+
r_cycle: OpeningPoint<BIG_ENDIAN, F>,
5757
}
5858

59-
impl ValEvaluationSumcheckParams {
60-
pub fn new(n_cycle_vars: usize) -> Self {
61-
Self { n_cycle_vars }
59+
impl<F: JoltField> RegistersValEvaluationSumcheckParams<F> {
60+
pub fn new(opening_accumulator: &dyn OpeningAccumulator<F>) -> Self {
61+
// The opening point is r_address || r_cycle
62+
let (r, _) = opening_accumulator.get_virtual_polynomial_opening(
63+
VirtualPolynomial::RegistersVal,
64+
SumcheckId::RegistersReadWriteChecking,
65+
);
66+
let (r_address, r_cycle) = r.split_at(LOG_K);
67+
Self { r_address, r_cycle }
6268
}
6369
}
6470

65-
impl<F: JoltField> SumcheckInstanceParams<F> for ValEvaluationSumcheckParams {
71+
impl<F: JoltField> SumcheckInstanceParams<F> for RegistersValEvaluationSumcheckParams<F> {
6672
fn degree(&self) -> usize {
6773
DEGREE_BOUND
6874
}
6975

7076
fn num_rounds(&self) -> usize {
71-
self.n_cycle_vars
77+
self.r_cycle.len()
7278
}
7379

7480
fn input_claim(&self, accumulator: &dyn OpeningAccumulator<F>) -> F {
@@ -92,33 +98,25 @@ pub(crate) struct ValEvaluationSumcheckProver<F: JoltField> {
9298
inc: MultilinearPolynomial<F>,
9399
wa: RaPolynomial<u8, F>,
94100
lt: LtPolynomial<F>,
95-
params: ValEvaluationSumcheckParams,
101+
params: RegistersValEvaluationSumcheckParams<F>,
96102
}
97103

98104
impl<F: JoltField> ValEvaluationSumcheckProver<F> {
99-
#[tracing::instrument(skip_all, name = "RegistersValEvaluationSumcheckProver::gen")]
100-
pub fn gen(
105+
#[tracing::instrument(skip_all, name = "RegistersValEvaluationSumcheckProver::initialize")]
106+
pub fn initialize(
107+
params: RegistersValEvaluationSumcheckParams<F>,
101108
trace: &[Cycle],
102109
bytecode_preprocessing: &BytecodePreprocessing,
103110
memory_layout: &MemoryLayout,
104-
opening_accumulator: &ProverOpeningAccumulator<F>,
105111
) -> Self {
106-
// The opening point is r_address || r_cycle
107-
let registers_val_input_sample = opening_accumulator.get_virtual_polynomial_opening(
108-
VirtualPolynomial::RegistersVal,
109-
SumcheckId::RegistersReadWriteChecking,
110-
);
111-
let (r_address, r_cycle) = registers_val_input_sample.0.split_at(LOG_K);
112-
113-
let params = ValEvaluationSumcheckParams::new(trace.len().log_2());
114112
let inc = CommittedPolynomial::RdInc.generate_witness(
115113
bytecode_preprocessing,
116114
memory_layout,
117115
trace,
118116
None,
119117
);
120118

121-
let eq_r_address = EqPolynomial::evals(&r_address.r);
119+
let eq_r_address = EqPolynomial::evals(&params.r_address.r);
122120
let wa: Vec<Option<u8>> = trace
123121
.par_iter()
124122
.map(|cycle| {
@@ -127,7 +125,7 @@ impl<F: JoltField> ValEvaluationSumcheckProver<F> {
127125
})
128126
.collect();
129127
let wa = RaPolynomial::new(Arc::new(wa), eq_r_address);
130-
let lt = LtPolynomial::new(&r_cycle);
128+
let lt = LtPolynomial::new(&params.r_cycle);
131129

132130
Self {
133131
inc,
@@ -231,18 +229,20 @@ impl<F: JoltField, T: Transcript> SumcheckInstanceProver<F, T> for ValEvaluation
231229
}
232230
}
233231

234-
pub struct ValEvaluationSumcheckVerifier {
235-
params: ValEvaluationSumcheckParams,
232+
pub struct ValEvaluationSumcheckVerifier<F: JoltField> {
233+
params: RegistersValEvaluationSumcheckParams<F>,
236234
}
237235

238-
impl ValEvaluationSumcheckVerifier {
239-
pub fn new(n_cycle_vars: usize) -> Self {
240-
let params = ValEvaluationSumcheckParams::new(n_cycle_vars);
236+
impl<F: JoltField> ValEvaluationSumcheckVerifier<F> {
237+
pub fn new(opening_accumulator: &VerifierOpeningAccumulator<F>) -> Self {
238+
let params = RegistersValEvaluationSumcheckParams::new(opening_accumulator);
241239
Self { params }
242240
}
243241
}
244242

245-
impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T> for ValEvaluationSumcheckVerifier {
243+
impl<F: JoltField, T: Transcript> SumcheckInstanceVerifier<F, T>
244+
for ValEvaluationSumcheckVerifier<F>
245+
{
246246
fn get_params(&self) -> Box<&dyn SumcheckInstanceParams<F>> {
247247
Box::new(&self.params)
248248
}

jolt-core/src/zkvm/verifier.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,10 @@ impl<'a, F: JoltField, PCS: CommitmentScheme<Field = F>, ProofTranscript: Transc
335335

336336
fn verify_stage5(&mut self) -> Result<(), anyhow::Error> {
337337
let n_cycle_vars = self.proof.trace_length.log_2();
338-
let registers_val_evaluation = RegistersValEvaluationSumcheckVerifier::new(n_cycle_vars);
339-
let ram_hamming_booleanity = HammingBooleanitySumcheckVerifier::new(n_cycle_vars);
338+
let registers_val_evaluation =
339+
RegistersValEvaluationSumcheckVerifier::new(&self.opening_accumulator);
340+
let ram_hamming_booleanity =
341+
HammingBooleanitySumcheckVerifier::new(&self.opening_accumulator);
340342
let ram_ra_virtual = RamRaSumcheckVerifier::new(
341343
self.proof.trace_length,
342344
&self.one_hot_params,

0 commit comments

Comments
 (0)