Skip to content

Commit 0371dd6

Browse files
committed
test pass
1 parent fb1a3a2 commit 0371dd6

File tree

4 files changed

+125
-51
lines changed

4 files changed

+125
-51
lines changed

ceno_zkvm/src/scheme/cpu/mod.rs

Lines changed: 71 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,11 @@ use multilinear_extensions::{
3232
virtual_poly::build_eq_x_r_vec,
3333
virtual_polys::VirtualPolynomialsBuilder,
3434
};
35-
use p3::field::FieldAlgebra;
36-
use rayon::iter::{IntoParallelIterator, IntoParallelRefIterator, ParallelIterator};
35+
use p3::field::{Field, FieldAlgebra};
36+
use rayon::iter::{
37+
IndexedParallelIterator, IntoParallelIterator, IntoParallelRefIterator,
38+
IntoParallelRefMutIterator, ParallelIterator,
39+
};
3740
use std::{collections::BTreeMap, sync::Arc};
3841
use sumcheck::{
3942
macros::{entered_span, exit_span},
@@ -80,16 +83,38 @@ impl CpuEccProver {
8083
let out_rt = transcript.sample_and_append_vec(b"ecc", n);
8184
let num_threads = optimal_sumcheck_threads(out_rt.len());
8285

83-
let alpha_pows =
84-
transcript.sample_and_append_challenge_pows(SEPTIC_EXTENSION_DEGREE * 3, b"ecc_alpha");
86+
// 2: expression got add and double
87+
// 3: each contribute 3 zero constrains
88+
let alpha_pows = transcript
89+
.sample_and_append_challenge_pows(SEPTIC_EXTENSION_DEGREE * 3 * 2, b"ecc_alpha");
90+
let mut alpha_pows_iter = alpha_pows.iter();
8591

8692
let mut expr_builder = VirtualPolynomialsBuilder::new(num_threads, out_rt.len());
8793

8894
let sel_add = SelectorType::QuarkBinaryTreeLessThan(0.into());
8995
let mut sel_add_mle: MultilinearExtension<'_, E> =
9096
sel_add.compute(&out_rt, num_instances).unwrap();
97+
// we construct sel_double witness here
98+
// verifier can derive it via `sel_double = 1 - sel_add - last_onehot`
99+
let mut sel_double_mle: Vec<E> = build_eq_x_r_vec(&out_rt);
100+
match sel_add_mle.evaluations() {
101+
FieldType::Ext(sel_add_mle) => sel_add_mle
102+
.par_iter()
103+
.zip_eq(sel_double_mle.par_iter_mut())
104+
.for_each(|(sel_add, sel_double)| {
105+
if *sel_add != E::ZERO {
106+
*sel_double = E::ZERO;
107+
}
108+
}),
109+
_ => unreachable!(),
110+
}
111+
*sel_double_mle.last_mut().unwrap() = E::ZERO;
112+
let mut sel_double_mle = sel_double_mle.into_mle();
91113
let sel_add_expr = expr_builder.lift(sel_add_mle.to_either());
114+
let sel_double_expr = expr_builder.lift(sel_double_mle.to_either());
115+
92116
let mut exprs_add = vec![];
117+
let mut exprs_double = vec![];
93118

94119
let filter_bj = |v: &[MultilinearExtension<'_, E>], j: usize| {
95120
v.iter()
@@ -162,7 +187,7 @@ impl CpuEccProver {
162187
(s.clone() * (&x0 - &x1) - (&y0 - &y1))
163188
.to_exprs()
164189
.into_iter()
165-
.zip(alpha_pows.iter().take(SEPTIC_EXTENSION_DEGREE))
190+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
166191
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
167192
);
168193

@@ -171,11 +196,7 @@ impl CpuEccProver {
171196
((&s * &s) - &x0 - &x1 - &x3)
172197
.to_exprs()
173198
.into_iter()
174-
.zip(
175-
alpha_pows[SEPTIC_EXTENSION_DEGREE..]
176-
.iter()
177-
.take(SEPTIC_EXTENSION_DEGREE),
178-
)
199+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
179200
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
180201
);
181202

@@ -184,25 +205,56 @@ impl CpuEccProver {
184205
(s.clone() * (&x0 - &x3) - (&y0 + &y3))
185206
.to_exprs()
186207
.into_iter()
187-
.zip(
188-
alpha_pows[SEPTIC_EXTENSION_DEGREE * 2..]
189-
.iter()
190-
.take(SEPTIC_EXTENSION_DEGREE),
191-
)
208+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
192209
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
193210
);
194211

195212
let exprs_add = exprs_add.into_iter().sum::<Expression<E>>() * sel_add_expr;
196213

197-
let (zerocheck_proof, state) =
198-
IOPProverState::prove(expr_builder.to_virtual_polys(&[exprs_add], &[]), transcript);
214+
// deal with double
215+
// 0 = s[0,b] * (2*y[b,0]) - (3*x[b,0]^2 + a)
216+
exprs_double.extend(
217+
(s.clone() * (&y0.mul_scalar(Either::Left(E::BaseField::TWO)))
218+
- ((&x0 * &x0.mul_scalar(Either::Left(E::BaseField::from_canonical_u32(3))))
219+
.add_scalar(Either::Left(E::BaseField::TWO))))
220+
.to_exprs()
221+
.into_iter()
222+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
223+
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
224+
);
225+
226+
// 0 = s[0,b]^2 - 2*x[b,0] - x[1,b]
227+
exprs_double.extend(
228+
((&s * &s) - (&x0.mul_scalar(Either::Left(E::BaseField::TWO))) - &x3)
229+
.to_exprs()
230+
.into_iter()
231+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
232+
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
233+
);
234+
235+
// 0 = s * (x[b,0] - x[1,b]) - (y[b,0] + y[1, b])
236+
exprs_double.extend(
237+
(s.clone() * (&x0 - &x3) - (&y0 + &y3))
238+
.to_exprs()
239+
.into_iter()
240+
.zip_eq(alpha_pows_iter.by_ref().take(SEPTIC_EXTENSION_DEGREE))
241+
.map(|(e, alpha)| e * Expression::Constant(Either::Right(*alpha))),
242+
);
243+
assert!(alpha_pows_iter.next().is_none());
244+
245+
let exprs_double = exprs_double.into_iter().sum::<Expression<E>>() * sel_double_expr;
246+
247+
let (zerocheck_proof, state) = IOPProverState::prove(
248+
expr_builder.to_virtual_polys(&[exprs_add + exprs_double], &[]),
249+
transcript,
250+
);
199251

200252
let rt = state.collect_raw_challenges();
201253
let evals = state.get_mle_flatten_final_evaluations();
202254

203255
assert_eq!(zerocheck_proof.extract_sum(), E::ZERO);
204256
// 7 for x[rt,0], x[rt,1], y[rt,0], y[rt,1], x[1,rt], y[1,rt], s[0,rt]
205-
assert_eq!(evals.len(), 1 + SEPTIC_EXTENSION_DEGREE * 7);
257+
assert_eq!(evals.len(), 2 + SEPTIC_EXTENSION_DEGREE * 7);
206258

207259
#[cfg(feature = "sanity-check")]
208260
{
@@ -1055,7 +1107,7 @@ mod tests {
10551107
use std::iter::repeat;
10561108

10571109
use ff_ext::BabyBearExt4;
1058-
use itertools::{Itertools, assert_equal};
1110+
use itertools::Itertools;
10591111
use multilinear_extensions::{
10601112
mle::{IntoMLE, MultilinearExtension},
10611113
util::transpose,

ceno_zkvm/src/scheme/septic_curve.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -594,6 +594,28 @@ impl<F: Field> MulAssign<Self> for SepticExtension<F> {
594594
#[derive(Clone, Debug)]
595595
pub struct SymbolicSepticExtension<E: ExtensionField>(pub Vec<Expression<E>>);
596596

597+
impl<E: ExtensionField> SymbolicSepticExtension<E> {
598+
pub fn mul_scalar(&self, scalar: Either<E::BaseField, E>) -> Self {
599+
let res = self
600+
.0
601+
.iter()
602+
.map(|a| a.clone() * Expression::Constant(scalar))
603+
.collect();
604+
605+
SymbolicSepticExtension(res)
606+
}
607+
608+
pub fn add_scalar(&self, scalar: Either<E::BaseField, E>) -> Self {
609+
let res = self
610+
.0
611+
.iter()
612+
.map(|a| a.clone() + Expression::Constant(scalar))
613+
.collect();
614+
615+
SymbolicSepticExtension(res)
616+
}
617+
}
618+
597619
impl<E: ExtensionField> Add<Self> for &SymbolicSepticExtension<E> {
598620
type Output = SymbolicSepticExtension<E>;
599621

ceno_zkvm/src/scheme/verifier.rs

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,22 @@ use ff_ext::ExtensionField;
55
#[cfg(debug_assertions)]
66
use ff_ext::{Instrumented, PoseidonField};
77

8-
use gkr_iop::{gkr::GKRClaims, utils::eq_eval_less_or_equal_than};
8+
use crate::{
9+
error::ZKVMError,
10+
scheme::{
11+
constants::{NUM_FANIN, NUM_FANIN_LOGUP, SEL_DEGREE, SEPTIC_EXTENSION_DEGREE},
12+
septic_curve::SepticExtension,
13+
},
14+
structs::{
15+
ComposedConstrainSystem, EccQuarkProof, PointAndEval, TowerProofs, VerifyingKey,
16+
ZKVMVerifyingKey,
17+
},
18+
utils::{
19+
eval_inner_repeated_incremental_vec, eval_outer_repeated_incremental_vec,
20+
eval_stacked_constant_vec, eval_stacked_wellform_address_vec, eval_wellform_address_vec,
21+
},
22+
};
23+
use gkr_iop::{gkr::GKRClaims, selector::SelectorType, utils::eq_eval_less_or_equal_than};
924
use itertools::{Itertools, chain, interleave, izip};
1025
use mpcs::{Point, PolynomialCommitmentScheme};
1126
use multilinear_extensions::{
@@ -23,22 +38,6 @@ use sumcheck::{
2338
use transcript::{ForkableTranscript, Transcript};
2439
use witness::next_pow2_instance_padding;
2540

26-
use crate::{
27-
error::ZKVMError,
28-
scheme::{
29-
constants::{NUM_FANIN, NUM_FANIN_LOGUP, SEL_DEGREE, SEPTIC_EXTENSION_DEGREE},
30-
septic_curve::SepticExtension,
31-
},
32-
structs::{
33-
ComposedConstrainSystem, EccQuarkProof, PointAndEval, TowerProofs, VerifyingKey,
34-
ZKVMVerifyingKey,
35-
},
36-
utils::{
37-
eval_inner_repeated_incremental_vec, eval_outer_repeated_incremental_vec,
38-
eval_stacked_constant_vec, eval_stacked_wellform_address_vec, eval_wellform_address_vec,
39-
},
40-
};
41-
4241
use super::{ZKVMChipProof, ZKVMProof};
4342

4443
pub struct ZKVMVerifier<E: ExtensionField, PCS: PolynomialCommitmentScheme<E>> {
@@ -996,31 +995,31 @@ impl EccVerifier {
996995
transcript,
997996
);
998997

999-
let s0: SepticExtension<E> = proof.evals[1..][0..SEPTIC_EXTENSION_DEGREE]
998+
let s0: SepticExtension<E> = proof.evals[2..][0..][..SEPTIC_EXTENSION_DEGREE]
1000999
.try_into()
10011000
.unwrap();
1002-
let x0: SepticExtension<E> = proof.evals[1..]
1003-
[SEPTIC_EXTENSION_DEGREE..2 * SEPTIC_EXTENSION_DEGREE]
1001+
let x0: SepticExtension<E> = proof.evals[2..][SEPTIC_EXTENSION_DEGREE..]
1002+
[..SEPTIC_EXTENSION_DEGREE]
10041003
.try_into()
10051004
.unwrap();
1006-
let y0: SepticExtension<E> = proof.evals[1..]
1007-
[2 * SEPTIC_EXTENSION_DEGREE..3 * SEPTIC_EXTENSION_DEGREE]
1005+
let y0: SepticExtension<E> = proof.evals[2..][2 * SEPTIC_EXTENSION_DEGREE..]
1006+
[..SEPTIC_EXTENSION_DEGREE]
10081007
.try_into()
10091008
.unwrap();
1010-
let x1: SepticExtension<E> = proof.evals[1..]
1011-
[3 * SEPTIC_EXTENSION_DEGREE..4 * SEPTIC_EXTENSION_DEGREE]
1009+
let x1: SepticExtension<E> = proof.evals[2..][3 * SEPTIC_EXTENSION_DEGREE..]
1010+
[..SEPTIC_EXTENSION_DEGREE]
10121011
.try_into()
10131012
.unwrap();
1014-
let y1: SepticExtension<E> = proof.evals[1..]
1015-
[4 * SEPTIC_EXTENSION_DEGREE..5 * SEPTIC_EXTENSION_DEGREE]
1013+
let y1: SepticExtension<E> = proof.evals[2..][4 * SEPTIC_EXTENSION_DEGREE..]
1014+
[..SEPTIC_EXTENSION_DEGREE]
10161015
.try_into()
10171016
.unwrap();
1018-
let x3: SepticExtension<E> = proof.evals[1..]
1019-
[5 * SEPTIC_EXTENSION_DEGREE..6 * SEPTIC_EXTENSION_DEGREE]
1017+
let x3: SepticExtension<E> = proof.evals[2..][5 * SEPTIC_EXTENSION_DEGREE..]
1018+
[..SEPTIC_EXTENSION_DEGREE]
10201019
.try_into()
10211020
.unwrap();
1022-
let y3: SepticExtension<E> = proof.evals[1..]
1023-
[6 * SEPTIC_EXTENSION_DEGREE..7 * SEPTIC_EXTENSION_DEGREE]
1021+
let y3: SepticExtension<E> = proof.evals[2..][6 * SEPTIC_EXTENSION_DEGREE..]
1022+
[..SEPTIC_EXTENSION_DEGREE]
10241023
.try_into()
10251024
.unwrap();
10261025

@@ -1054,6 +1053,7 @@ impl EccVerifier {
10541053
.sum();
10551054

10561055
let sel = eq_eval_less_or_equal_than(num_instances - 1, &out_rt, &rt);
1056+
// let SelectorType::QuarkBinaryTreeLessThan(1.into());
10571057
// let sel = eq_quark_form(num_instances - 1, &out_rt, &rt);
10581058
if sumcheck_claim.expected_evaluation != v * sel {
10591059
return Err(ZKVMError::VerifyError(

gkr_iop/src/selector.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
use rayon::iter::{IndexedParallelIterator, IntoParallelIterator, IntoParallelRefIterator};
1+
use rayon::iter::IndexedParallelIterator;
22

33
use ff_ext::ExtensionField;
4-
use itertools::{Itertools, assert_equal};
4+
use itertools::Itertools;
55
use multilinear_extensions::{
66
Expression,
77
mle::{IntoMLE, MultilinearExtension, Point},

0 commit comments

Comments
 (0)