Skip to content

Commit e480793

Browse files
committed
add_memory_statements_for_dot_product_precompile
1 parent d55252a commit e480793

File tree

7 files changed

+200
-163
lines changed

7 files changed

+200
-163
lines changed

Cargo.lock

Lines changed: 72 additions & 13 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/lean_prover/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,4 @@ sumcheck.workspace = true
3131
lean_vm.workspace = true
3232
lean_compiler.workspace = true
3333
witness_generation.workspace = true
34-
vm_air.workspace = true
34+
vm_air.workspace = true

crates/lean_prover/src/common.rs

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
1+
use p3_field::BasedVectorSpace;
12
use p3_field::{ExtensionField, PrimeCharacteristicRing};
3+
use p3_util::log2_ceil_usize;
24
use packed_pcs::ColDims;
35
use rayon::prelude::*;
46
use sumcheck::{SumcheckComputation, SumcheckComputationPacked};
57
use utils::{EFPacking, PF, padd_with_zero_to_next_power_of_two};
6-
use whir_p3::poly::{
7-
evals::fold_multilinear,
8-
multilinear::{Evaluation, MultilinearPoint},
8+
use whir_p3::fiat_shamir::errors::ProofError;
9+
use whir_p3::poly::evals::EvaluationsList;
10+
use whir_p3::{
11+
fiat_shamir::ChallengeSampler,
12+
poly::{
13+
evals::fold_multilinear,
14+
multilinear::{Evaluation, MultilinearPoint},
15+
},
16+
utils::flatten_scalars_to_base,
917
};
1018

1119
use crate::*;
@@ -83,6 +91,64 @@ pub fn intitial_and_final_pc_conditions(
8391
(initial_pc_statement, final_pc_statement)
8492
}
8593

94+
pub fn add_memory_statements_for_dot_product_precompile(
95+
entry: &RowMultilinearEval,
96+
log_memory: usize,
97+
log_public_memory: usize,
98+
challenger: &mut impl ChallengeSampler<EF>,
99+
memory_statements: &mut Vec<Evaluation<EF>>,
100+
) -> Result<(), ProofError> {
101+
// point lookup into memory
102+
let log_point_len = log2_ceil_usize(entry.n_vars() * DIMENSION);
103+
let point_random_challenge = challenger.sample_vec(log_point_len);
104+
let point_random_value = {
105+
let mut point_mle = flatten_scalars_to_base::<PF<EF>, EF>(&entry.point);
106+
point_mle.resize(point_mle.len().next_power_of_two(), F::ZERO);
107+
point_mle.evaluate(&MultilinearPoint(point_random_challenge.clone()))
108+
};
109+
memory_statements.push(Evaluation::new(
110+
[
111+
to_big_endian_in_field(entry.addr_point, log_memory - log_point_len),
112+
point_random_challenge.clone(),
113+
]
114+
.concat(),
115+
point_random_value,
116+
));
117+
118+
// result lookup into memory
119+
let random_challenge = challenger.sample_vec(LOG_VECTOR_LEN);
120+
let res_random_value = {
121+
let mut res_mle = entry.res.as_basis_coefficients_slice().to_vec();
122+
res_mle.resize(VECTOR_LEN, F::ZERO);
123+
res_mle.evaluate(&MultilinearPoint(random_challenge.clone()))
124+
};
125+
memory_statements.push(Evaluation::new(
126+
[
127+
to_big_endian_in_field(entry.addr_res, log_memory - LOG_VECTOR_LEN),
128+
random_challenge.clone(),
129+
]
130+
.concat(),
131+
res_random_value,
132+
));
133+
134+
{
135+
if entry.n_vars() > log_memory {
136+
return Err(ProofError::InvalidProof);
137+
}
138+
if entry.addr_coeffs >= 1 << (log_memory - entry.n_vars()) {
139+
return Err(ProofError::InvalidProof);
140+
}
141+
if entry.n_vars() >= log_public_memory {
142+
todo!("vm multilinear eval accross multiple memory chunks")
143+
}
144+
let addr_bits = to_big_endian_in_field(entry.addr_coeffs, log_memory - entry.n_vars());
145+
let statement = Evaluation::new([addr_bits, entry.point.clone()].concat(), entry.res);
146+
memory_statements.push(statement);
147+
}
148+
149+
Ok(())
150+
}
151+
86152
pub struct PrecompileFootprint {
87153
pub grand_product_challenge_global: EF,
88154
pub grand_product_challenge_p16: [EF; 5],

crates/lean_prover/src/prove_execution.rs

Lines changed: 13 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ use lean_vm::*;
55
use lookup::prove_gkr_product;
66
use lookup::{compute_pushforward, prove_logup_star};
77
use p3_air::BaseAir;
8-
use p3_field::BasedVectorSpace;
98
use p3_field::ExtensionField;
109
use p3_field::PrimeCharacteristicRing;
1110
use p3_util::{log2_ceil_usize, log2_strict_usize};
@@ -27,7 +26,7 @@ use whir_p3::dft::EvalsDft;
2726
use whir_p3::poly::evals::{eval_eq, fold_multilinear};
2827
use whir_p3::poly::multilinear::Evaluation;
2928
use whir_p3::poly::{evals::EvaluationsList, multilinear::MultilinearPoint};
30-
use whir_p3::utils::{compute_eval_eq, compute_sparse_eval_eq, flatten_scalars_to_base};
29+
use whir_p3::utils::{compute_eval_eq, compute_sparse_eval_eq};
3130
use whir_p3::whir::config::{WhirConfig, second_batched_whir_config_builder};
3231

3332
pub fn prove_execution(
@@ -131,63 +130,22 @@ pub fn prove_execution(
131130
F::from_usize(vm_multilinear_eval.addr_coeffs),
132131
F::from_usize(vm_multilinear_eval.addr_point),
133132
F::from_usize(vm_multilinear_eval.addr_res),
134-
F::from_usize(vm_multilinear_eval.n_vars),
133+
F::from_usize(vm_multilinear_eval.n_vars()),
135134
]);
136135
prover_state.add_extension_scalars(&vm_multilinear_eval.point);
137136
prover_state.add_extension_scalar(vm_multilinear_eval.res);
138137
}
139138

140139
let mut memory_statements = vec![];
141-
for multilinear_eval in &vm_multilinear_evals {
142-
let addr_point = multilinear_eval.addr_point;
143-
let addr_coeffs = multilinear_eval.addr_coeffs;
144-
let addr_res = multilinear_eval.addr_res;
145-
146-
// point lookup into memory
147-
let log_point_len = log2_ceil_usize(multilinear_eval.point.len() * DIMENSION);
148-
let point_random_challenge = prover_state.sample_vec(log_point_len);
149-
let point_random_value = {
150-
let mut point_mle = flatten_scalars_to_base::<PF<EF>, EF>(&multilinear_eval.point);
151-
point_mle.resize(point_mle.len().next_power_of_two(), F::ZERO);
152-
point_mle.evaluate(&MultilinearPoint(point_random_challenge.clone()))
153-
};
154-
memory_statements.push(Evaluation::new(
155-
[
156-
to_big_endian_in_field(addr_point, log_memory - log_point_len),
157-
point_random_challenge.clone(),
158-
]
159-
.concat(),
160-
point_random_value,
161-
));
162-
163-
// result lookup into memory
164-
let res_random_challenge = prover_state.sample_vec(LOG_VECTOR_LEN);
165-
let res_random_value = {
166-
let mut res_mle = multilinear_eval.res.as_basis_coefficients_slice().to_vec();
167-
res_mle.resize(VECTOR_LEN, F::ZERO);
168-
res_mle.evaluate(&MultilinearPoint(res_random_challenge.clone()))
169-
};
170-
memory_statements.push(Evaluation::new(
171-
[
172-
to_big_endian_in_field(addr_res, log_memory - LOG_VECTOR_LEN),
173-
res_random_challenge.clone(),
174-
]
175-
.concat(),
176-
res_random_value,
177-
));
178-
179-
{
180-
let n_vars = multilinear_eval.n_vars;
181-
assert!(n_vars <= log_memory);
182-
assert!(addr_coeffs < 1 << (log_memory - n_vars));
183-
184-
let addr_bits = to_big_endian_in_field(addr_coeffs, log_memory - n_vars);
185-
let statement = Evaluation::new(
186-
[addr_bits, multilinear_eval.point.clone()].concat(),
187-
multilinear_eval.res,
188-
);
189-
memory_statements.push(statement);
190-
}
140+
for entry in &vm_multilinear_evals {
141+
add_memory_statements_for_dot_product_precompile(
142+
entry,
143+
log_memory,
144+
log_public_memory,
145+
&mut prover_state,
146+
&mut memory_statements,
147+
)
148+
.unwrap();
191149
}
192150
let p16_indexes = all_poseidon_16_indexes(&poseidons_16);
193151
let p24_indexes = all_poseidon_24_indexes(&poseidons_24);
@@ -298,7 +256,7 @@ pub fn prove_execution(
298256
+ grand_product_challenge_vm_multilinear_eval[4]
299257
* F::from_usize(multilinear_eval.addr_res)
300258
+ grand_product_challenge_vm_multilinear_eval[5]
301-
* F::from_usize(multilinear_eval.n_vars);
259+
* F::from_usize(multilinear_eval.n_vars());
302260
}
303261

304262
let (grand_product_exec_res, grand_product_exec_statement) = prove_gkr_product(
@@ -363,7 +321,7 @@ pub fn prove_execution(
363321
+ grand_product_challenge_vm_multilinear_eval[4]
364322
* F::from_usize(vm_multilinear_eval.addr_res)
365323
+ grand_product_challenge_vm_multilinear_eval[5]
366-
* F::from_usize(vm_multilinear_eval.n_vars)
324+
* F::from_usize(vm_multilinear_eval.n_vars())
367325
})
368326
.product::<EF>();
369327

0 commit comments

Comments
 (0)