Skip to content

Commit ea02353

Browse files
authored
refactor: remove shared preprocessing (#1069)
1 parent afd0821 commit ea02353

File tree

17 files changed

+115
-192
lines changed

17 files changed

+115
-192
lines changed

examples/recursion/src/main.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -477,17 +477,12 @@ fn run_recursion_proof(
477477
jolt_sdk::JoltVerifierPreprocessing::from(&recursion_prover_preprocessing);
478478

479479
// update program_size in memory_config now that we know it
480-
recursion.memory_config.program_size = Some(
481-
recursion_verifier_preprocessing
482-
.shared
483-
.memory_layout
484-
.program_size,
485-
);
480+
recursion.memory_config.program_size =
481+
Some(recursion_verifier_preprocessing.memory_layout.program_size);
486482

487483
let mut output_bytes = vec![
488484
0;
489485
recursion_verifier_preprocessing
490-
.shared
491486
.memory_layout
492487
.max_output_size as usize
493488
];

jolt-core/src/guest/verifier.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,13 @@ where
4545
{
4646
use common::jolt_device::JoltDevice;
4747
let memory_config = MemoryConfig {
48-
max_untrusted_advice_size: preprocessing.shared.memory_layout.max_untrusted_advice_size,
49-
max_trusted_advice_size: preprocessing.shared.memory_layout.max_trusted_advice_size,
50-
max_input_size: preprocessing.shared.memory_layout.max_input_size,
51-
max_output_size: preprocessing.shared.memory_layout.max_output_size,
52-
stack_size: preprocessing.shared.memory_layout.stack_size,
53-
memory_size: preprocessing.shared.memory_layout.memory_size,
54-
program_size: Some(preprocessing.shared.memory_layout.program_size),
48+
max_untrusted_advice_size: preprocessing.memory_layout.max_untrusted_advice_size,
49+
max_trusted_advice_size: preprocessing.memory_layout.max_trusted_advice_size,
50+
max_input_size: preprocessing.memory_layout.max_input_size,
51+
max_output_size: preprocessing.memory_layout.max_output_size,
52+
stack_size: preprocessing.memory_layout.stack_size,
53+
memory_size: preprocessing.memory_layout.memory_size,
54+
program_size: Some(preprocessing.memory_layout.program_size),
5555
};
5656
let mut io_device = JoltDevice::new(&memory_config);
5757

jolt-core/src/zkvm/bytecode/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ fn gen_ra_one_hot_provers<F: JoltField>(
171171
transcript: &mut impl Transcript,
172172
) -> (HammingWeightSumcheckProver<F>, BooleanitySumcheckProver<F>) {
173173
let (preprocessing, _, trace, _, _) = state_manager.get_prover_data();
174-
let bytecode_preprocessing = &preprocessing.shared.bytecode;
174+
let bytecode_preprocessing = &preprocessing.bytecode;
175175

176176
let r_cycle: Vec<F::Challenge> = opening_accumulator
177177
.get_virtual_polynomial_opening(VirtualPolynomial::UnexpandedPC, SumcheckId::SpartanOuter)

jolt-core/src/zkvm/bytecode/read_raf_checking.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ impl<F: JoltField> ReadRafSumcheckProver<F> {
131131
let (preprocessing, _, trace, _, _) = state_manager.get_prover_data();
132132

133133
let params = ReadRafSumcheckParams::gen(
134-
&preprocessing.shared.bytecode,
134+
&preprocessing.bytecode,
135135
trace.len().log_2(),
136136
opening_accumulator,
137137
transcript,
@@ -169,7 +169,7 @@ impl<F: JoltField> ReadRafSumcheckProver<F> {
169169
array::from_fn(|_| unsafe_allocate_zero_vec::<F>(params.K));
170170

171171
for (j, cycle) in trace_chunk.iter().enumerate() {
172-
let pc = preprocessing.shared.bytecode.get_pc(cycle);
172+
let pc = preprocessing.bytecode.get_pc(cycle);
173173
for stage in 0..N_STAGES {
174174
res_per_stage[stage][pc] += eq_evals[stage][j]
175175
}
@@ -221,7 +221,7 @@ impl<F: JoltField> ReadRafSumcheckProver<F> {
221221

222222
let pc = trace
223223
.par_iter()
224-
.map(|cycle| preprocessing.shared.bytecode.get_pc(cycle))
224+
.map(|cycle| preprocessing.bytecode.get_pc(cycle))
225225
.collect();
226226

227227
Self {

jolt-core/src/zkvm/dag/jolt_dag.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -88,9 +88,9 @@ pub fn prove_jolt_dag<
8888
let trace_length = trace.len();
8989
let padded_trace_length = trace_length.next_power_of_two();
9090

91-
tracing::info!("bytecode size: {}", preprocessing.shared.bytecode.code_size);
91+
tracing::info!("bytecode size: {}", preprocessing.bytecode.code_size);
9292

93-
let bytecode_d = preprocessing.shared.bytecode.d;
93+
let bytecode_d = preprocessing.bytecode.d;
9494

9595
// Commit to untrusted_advice
9696
let _untrusted_advice_opening_proof_hints =
@@ -524,7 +524,7 @@ pub fn prove_jolt_dag<
524524
reduced_opening_proof,
525525
trace_length: prover_state.trace.len(),
526526
ram_K: state_manager.ram_K,
527-
bytecode_d: prover_state.preprocessing.shared.bytecode.d,
527+
bytecode_d: prover_state.preprocessing.bytecode.d,
528528
twist_sumcheck_switch_index: state_manager.twist_sumcheck_switch_index,
529529
};
530530

@@ -554,7 +554,7 @@ impl<'a, 'b, 'c, F: JoltField, ProofTranscript: Transcript, PCS: CommitmentSchem
554554
self.state_manager.fiat_shamir_preamble(self.transcript);
555555

556556
let ram_K = self.proof.ram_K;
557-
let bytecode_d = self.state_manager.get_verifier_data().0.shared.bytecode.d;
557+
let bytecode_d = self.preprocessing.bytecode.d;
558558
let _guard = AllCommittedPolynomials::initialize(ram_K, bytecode_d);
559559

560560
// Append commitments to transcript
@@ -712,7 +712,7 @@ impl<'a, 'b, 'c, F: JoltField, ProofTranscript: Transcript, PCS: CommitmentSchem
712712
);
713713
let initial_ram_state = ram::gen_ram_initial_memory_state::<F>(
714714
self.proof.ram_K,
715-
&self.preprocessing.shared.ram,
715+
&self.preprocessing.ram,
716716
&self.state_manager.program_io,
717717
);
718718
let ram_val_evaluation = RamValEvaluationSumcheckVerifier::new(
@@ -777,13 +777,13 @@ impl<'a, 'b, 'c, F: JoltField, ProofTranscript: Transcript, PCS: CommitmentSchem
777777
fn verify_stage6(&mut self) -> Result<(), anyhow::Error> {
778778
let n_cycle_vars = self.proof.trace_length.log_2();
779779
let bytecode_read_raf = BytecodeReadRafSumcheckVerifier::gen(
780-
&self.preprocessing.shared.bytecode,
780+
&self.preprocessing.bytecode,
781781
n_cycle_vars,
782782
&self.opening_accumulator,
783783
self.transcript,
784784
);
785785
let (bytecode_hamming_weight, bytecode_booleanity) = bytecode::new_ra_one_hot_verifiers(
786-
&self.preprocessing.shared.bytecode,
786+
&self.preprocessing.bytecode,
787787
n_cycle_vars,
788788
self.transcript,
789789
);

jolt-core/src/zkvm/dag/state_manager.rs

Lines changed: 6 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ use crate::poly::multilinear_polynomial::MultilinearPolynomial;
66
use crate::transcripts::Transcript;
77
use crate::utils::math::Math;
88
use crate::zkvm::witness::compute_d_parameter;
9-
use crate::zkvm::{JoltProverPreprocessing, JoltSharedPreprocessing, JoltVerifierPreprocessing};
9+
use crate::zkvm::{JoltProverPreprocessing, JoltVerifierPreprocessing};
1010
use rayon::prelude::*;
1111
use tracer::emulator::memory::Memory;
12-
use tracer::instruction::{Cycle, Instruction};
12+
use tracer::instruction::Cycle;
1313
use tracer::{JoltDevice, LazyTraceIterator};
1414

1515
pub struct ProverState<'a, F: JoltField, PCS>
@@ -62,18 +62,18 @@ where
6262
.filter_map(|cycle| {
6363
crate::zkvm::ram::remap_address(
6464
cycle.ram_access().address() as u64,
65-
&preprocessing.shared.memory_layout,
65+
&preprocessing.memory_layout,
6666
)
6767
})
6868
.max()
6969
.unwrap_or(0)
7070
.max(
7171
crate::zkvm::ram::remap_address(
72-
preprocessing.shared.ram.min_bytecode_address,
73-
&preprocessing.shared.memory_layout,
72+
preprocessing.ram.min_bytecode_address,
73+
&preprocessing.memory_layout,
7474
)
7575
.unwrap_or(0)
76-
+ preprocessing.shared.ram.bytecode_words.len() as u64
76+
+ preprocessing.ram.bytecode_words.len() as u64
7777
+ 1,
7878
)
7979
.next_power_of_two() as usize;
@@ -103,33 +103,6 @@ where
103103
}
104104
}
105105

106-
/// Only used in tests; in practice, the verifier state manager is
107-
/// constructed using `JoltProof::to_verifier_state_manager`
108-
#[cfg(test)]
109-
pub fn new_verifier(
110-
preprocessing: &'a JoltVerifierPreprocessing<F, PCS>,
111-
program_io: JoltDevice,
112-
trace_length: usize,
113-
ram_K: usize,
114-
twist_sumcheck_switch_index: usize,
115-
) -> Self {
116-
let ram_d = compute_d_parameter(ram_K);
117-
118-
StateManager {
119-
untrusted_advice_commitment: None,
120-
trusted_advice_commitment: None,
121-
program_io,
122-
ram_K,
123-
ram_d,
124-
twist_sumcheck_switch_index,
125-
prover_state: None,
126-
verifier_state: Some(VerifierState {
127-
preprocessing,
128-
trace_length,
129-
}),
130-
}
131-
}
132-
133106
pub fn get_prover_data(
134107
&self,
135108
) -> (
@@ -160,48 +133,6 @@ where
160133
}
161134
}
162135

163-
pub fn get_verifier_data(&self) -> (&'a JoltVerifierPreprocessing<F, PCS>, &JoltDevice, usize) {
164-
if let Some(ref verifier_state) = self.verifier_state {
165-
(
166-
verifier_state.preprocessing,
167-
&self.program_io,
168-
verifier_state.trace_length,
169-
)
170-
} else {
171-
panic!("Verifier state not initialized");
172-
}
173-
}
174-
175-
pub fn get_trace_len(&self) -> usize {
176-
if let Some(ref verifier_state) = self.verifier_state {
177-
verifier_state.trace_length
178-
} else if let Some(ref prover_state) = self.prover_state {
179-
prover_state.trace.len()
180-
} else {
181-
panic!("Neither prover nor verifier state initialized");
182-
}
183-
}
184-
185-
pub fn get_bytecode(&self) -> &[Instruction] {
186-
if let Some(ref verifier_state) = self.verifier_state {
187-
&verifier_state.preprocessing.shared.bytecode.bytecode
188-
} else if let Some(ref prover_state) = self.prover_state {
189-
&prover_state.preprocessing.shared.bytecode.bytecode
190-
} else {
191-
panic!("Neither prover nor verifier state initialized");
192-
}
193-
}
194-
195-
pub fn get_shared_preprocessing(&self) -> &JoltSharedPreprocessing {
196-
if let Some(ref verifier_state) = self.verifier_state {
197-
&verifier_state.preprocessing.shared
198-
} else if let Some(ref prover_state) = self.prover_state {
199-
&prover_state.preprocessing.shared
200-
} else {
201-
panic!("Neither prover nor verifier state initialized");
202-
}
203-
}
204-
205136
pub fn fiat_shamir_preamble(&self, transcript: &mut impl Transcript) {
206137
transcript.append_u64(self.program_io.memory_layout.max_input_size);
207138
transcript.append_u64(self.program_io.memory_layout.max_output_size);

jolt-core/src/zkvm/instruction_lookups/read_raf_checking.rs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1204,10 +1204,7 @@ mod tests {
12041204
use crate::transcripts::Blake2bTranscript;
12051205
use crate::{
12061206
poly::commitment::mock::MockCommitScheme,
1207-
zkvm::{
1208-
bytecode::BytecodePreprocessing, ram::RAMPreprocessing, JoltProverPreprocessing,
1209-
JoltSharedPreprocessing,
1210-
},
1207+
zkvm::{bytecode::BytecodePreprocessing, ram::RAMPreprocessing, JoltProverPreprocessing},
12111208
};
12121209
use ark_bn254::Fr;
12131210
use ark_std::Zero;
@@ -1302,15 +1299,12 @@ mod tests {
13021299
let bytecode = vec![];
13031300
let bytecode_preprocessing = BytecodePreprocessing::preprocess(bytecode);
13041301
let memory_layout = MemoryLayout::default();
1305-
let shared_preprocessing = JoltSharedPreprocessing {
1306-
bytecode: bytecode_preprocessing,
1307-
ram: RAMPreprocessing::preprocess(vec![]),
1308-
memory_layout: memory_layout.clone(),
1309-
};
13101302
let prover_preprocessing: JoltProverPreprocessing<Fr, MockCommitScheme<Fr>> =
13111303
JoltProverPreprocessing {
13121304
generators: (),
1313-
shared: shared_preprocessing.clone(),
1305+
bytecode: bytecode_preprocessing,
1306+
ram: RAMPreprocessing::preprocess(vec![]),
1307+
memory_layout: memory_layout.clone(),
13141308
};
13151309

13161310
let program_io = JoltDevice {

jolt-core/src/zkvm/mod.rs

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,9 @@ where
124124
PCS: CommitmentScheme<Field = F>,
125125
{
126126
pub generators: PCS::VerifierSetup,
127-
pub shared: JoltSharedPreprocessing,
127+
pub bytecode: BytecodePreprocessing,
128+
pub ram: RAMPreprocessing,
129+
pub memory_layout: MemoryLayout,
128130
}
129131

130132
impl<F, PCS> Serializable for JoltVerifierPreprocessing<F, PCS>
@@ -164,7 +166,9 @@ where
164166
PCS: CommitmentScheme<Field = F>,
165167
{
166168
pub generators: PCS::ProverSetup,
167-
pub shared: JoltSharedPreprocessing,
169+
pub bytecode: BytecodePreprocessing,
170+
pub ram: RAMPreprocessing,
171+
pub memory_layout: MemoryLayout,
168172
}
169173

170174
impl<F, PCS> Serializable for JoltProverPreprocessing<F, PCS>
@@ -206,7 +210,9 @@ where
206210
let generators = PCS::setup_verifier(&preprocessing.generators);
207211
JoltVerifierPreprocessing {
208212
generators,
209-
shared: preprocessing.shared.clone(),
213+
bytecode: preprocessing.bytecode.clone(),
214+
ram: preprocessing.ram.clone(),
215+
memory_layout: preprocessing.memory_layout.clone(),
210216
}
211217
}
212218
}
@@ -224,35 +230,25 @@ where
224230
}
225231

226232
pub trait Jolt<F: JoltField, PCS: StreamingCommitmentScheme<Field = F>, FS: Transcript> {
227-
fn shared_preprocess(
228-
bytecode: Vec<Instruction>,
229-
memory_layout: MemoryLayout,
230-
memory_init: Vec<(u64, u8)>,
231-
) -> JoltSharedPreprocessing {
232-
let bytecode_preprocessing = BytecodePreprocessing::preprocess(bytecode);
233-
let ram_preprocessing = RAMPreprocessing::preprocess(memory_init);
234-
235-
JoltSharedPreprocessing {
236-
memory_layout,
237-
bytecode: bytecode_preprocessing,
238-
ram: ram_preprocessing,
239-
}
240-
}
241-
242233
#[tracing::instrument(skip_all, name = "Jolt::prover_preprocess")]
243234
fn prover_preprocess(
244235
bytecode: Vec<Instruction>,
245236
memory_layout: MemoryLayout,
246237
memory_init: Vec<(u64, u8)>,
247238
max_trace_length: usize,
248239
) -> JoltProverPreprocessing<F, PCS> {
249-
let shared = Self::shared_preprocess(bytecode, memory_layout, memory_init);
240+
let bytecode = BytecodePreprocessing::preprocess(bytecode);
241+
let ram = RAMPreprocessing::preprocess(memory_init);
250242

251243
let max_T: usize = max_trace_length.next_power_of_two();
252-
253244
let generators = PCS::setup_prover(DTH_ROOT_OF_K.log_2() + max_T.log_2());
254245

255-
JoltProverPreprocessing { generators, shared }
246+
JoltProverPreprocessing {
247+
generators,
248+
bytecode,
249+
ram,
250+
memory_layout,
251+
}
256252
}
257253

258254
#[allow(clippy::type_complexity)]
@@ -276,13 +272,13 @@ pub trait Jolt<F: JoltField, PCS: StreamingCommitmentScheme<Field = F>, FS: Tran
276272
use tracer::instruction::Cycle;
277273

278274
let memory_config = MemoryConfig {
279-
max_untrusted_advice_size: preprocessing.shared.memory_layout.max_untrusted_advice_size,
280-
max_trusted_advice_size: preprocessing.shared.memory_layout.max_trusted_advice_size,
281-
max_input_size: preprocessing.shared.memory_layout.max_input_size,
282-
max_output_size: preprocessing.shared.memory_layout.max_output_size,
283-
stack_size: preprocessing.shared.memory_layout.stack_size,
284-
memory_size: preprocessing.shared.memory_layout.memory_size,
285-
program_size: Some(preprocessing.shared.memory_layout.program_size),
275+
max_untrusted_advice_size: preprocessing.memory_layout.max_untrusted_advice_size,
276+
max_trusted_advice_size: preprocessing.memory_layout.max_trusted_advice_size,
277+
max_input_size: preprocessing.memory_layout.max_input_size,
278+
max_output_size: preprocessing.memory_layout.max_output_size,
279+
stack_size: preprocessing.memory_layout.stack_size,
280+
memory_size: preprocessing.memory_layout.memory_size,
281+
program_size: Some(preprocessing.memory_layout.program_size),
286282
};
287283

288284
let (lazy_trace, mut trace, final_memory_state, mut program_io) = {
@@ -382,13 +378,13 @@ pub trait Jolt<F: JoltField, PCS: StreamingCommitmentScheme<Field = F>, FS: Tran
382378
let _guard = DoryGlobals::initialize(DTH_ROOT_OF_K, T);
383379

384380
// Memory layout checks
385-
if program_io.memory_layout != preprocessing.shared.memory_layout {
381+
if program_io.memory_layout != preprocessing.memory_layout {
386382
return Err(ProofVerifyError::MemoryLayoutMismatch);
387383
}
388-
if program_io.inputs.len() > preprocessing.shared.memory_layout.max_input_size as usize {
384+
if program_io.inputs.len() > preprocessing.memory_layout.max_input_size as usize {
389385
return Err(ProofVerifyError::InputTooLarge);
390386
}
391-
if program_io.outputs.len() > preprocessing.shared.memory_layout.max_output_size as usize {
387+
if program_io.outputs.len() > preprocessing.memory_layout.max_output_size as usize {
392388
return Err(ProofVerifyError::OutputTooLarge);
393389
}
394390

0 commit comments

Comments
 (0)