Skip to content

Commit 0228649

Browse files
Add Precompile Verification to Recursion VM Program (#40)
- Add latest GKR verification to recursion program. --------- Co-authored-by: xkx <[email protected]>
1 parent d7aac02 commit 0228649

File tree

12 files changed

+1138
-477
lines changed

12 files changed

+1138
-477
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,21 @@ ark-poly = "0.5"
3838
ark-serialize = "0.5"
3939

4040
# Ceno
41-
ceno_mle = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc", package = "multilinear_extensions" }
42-
ceno_sumcheck = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc", package = "sumcheck" }
43-
ceno_transcript = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc", package = "transcript" }
44-
ceno_witness = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc", package = "witness" }
45-
ceno_zkvm = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc" }
46-
ceno_emul = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc" }
47-
mpcs = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc" }
48-
ff_ext = { git = "https://github.com/scroll-tech/ceno.git", branch = "build/smaller_field_support_plonky3_539bbc" }
41+
ceno_mle = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support", package = "multilinear_extensions" }
42+
ceno_sumcheck = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support", package = "sumcheck" }
43+
ceno_transcript = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support", package = "transcript" }
44+
ceno_witness = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support", package = "witness" }
45+
ceno_zkvm = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support" }
46+
ceno_emul = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support" }
47+
gkr_iop = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support" }
48+
mpcs = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support" }
49+
ff_ext = { git = "https://github.com/scroll-tech/ceno.git", branch = "feat/smaller_field_support" }
4950
serde = { version = "1.0", features = ["derive"] }
5051
serde_json = "1.0"
5152

5253
[features]
54+
default = ["parallel"]
55+
parallel = ["openvm-stark-backend/parallel"]
5356
bench-metrics = ["openvm-circuit/bench-metrics"]
5457

5558
# [patch."https://github.com/scroll-tech/ceno.git"]

scripts/e2e_test.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ if [ ! -d "$REPO_ROOT/build/ceno" ] || [ -z "$(ls -A "$REPO_ROOT/build/ceno" 2>/
99
fi
1010

1111
# Enter the ceno directory
12-
cd $REPO_ROOT/build/ceno && git checkout build/smaller_field_support_plonky3_539bbc
12+
cd $REPO_ROOT/build/ceno && git checkout feat/smaller_field_support
1313

1414
# Execute the ceno_zkvm e2e test
1515
RUST_LOG=info cargo run --release --package ceno_zkvm --bin e2e -- --platform=ceno \
16-
--hints=10 --public-io=4191 examples/target/riscv32im-ceno-zkvm-elf/release/examples/fibonacci \
16+
examples/target/riscv32im-ceno-zkvm-elf/release/examples/keccak_syscall \
1717
--field=baby-bear
1818

1919
mkdir -p $REPO_ROOT/src/e2e/encoded

src/arithmetics/mod.rs

Lines changed: 5 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,26 @@ use ff_ext::{BabyBearExt4, SmallField};
77
use itertools::Either;
88
use openvm_native_compiler::prelude::*;
99
use openvm_native_compiler_derive::iter_zip;
10-
use openvm_native_recursion::challenger::ChallengerVariable;
11-
use openvm_native_recursion::challenger::{
12-
duplex::DuplexChallengerVariable, CanObserveVariable, FeltChallenger,
13-
};
14-
use p3_field::{FieldAlgebra, FieldExtensionAlgebra};
10+
use openvm_native_recursion::challenger::{duplex::DuplexChallengerVariable, FeltChallenger};
11+
use openvm_stark_backend::p3_field::{FieldAlgebra, FieldExtensionAlgebra};
1512
type E = BabyBearExt4;
16-
const HASH_RATE: usize = 8;
1713
const MAX_NUM_VARS: usize = 25;
1814

19-
pub fn print_ext_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Ext<C::F, C::EF>>) {
15+
pub fn _print_ext_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Ext<C::F, C::EF>>) {
2016
iter_zip!(builder, arr).for_each(|ptr_vec, builder| {
2117
let e = builder.iter_ptr_get(arr, ptr_vec[0]);
2218
builder.print_e(e);
2319
});
2420
}
2521

26-
pub fn print_felt_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Felt<C::F>>) {
22+
pub fn _print_felt_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Felt<C::F>>) {
2723
iter_zip!(builder, arr).for_each(|ptr_vec, builder| {
2824
let f = builder.iter_ptr_get(arr, ptr_vec[0]);
2925
builder.print_f(f);
3026
});
3127
}
3228

33-
pub fn print_usize_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Usize<C::N>>) {
29+
pub fn _print_usize_arr<C: Config>(builder: &mut Builder<C>, arr: &Array<C, Usize<C::N>>) {
3430
iter_zip!(builder, arr).for_each(|ptr_vec, builder| {
3531
let n = builder.iter_ptr_get(arr, ptr_vec[0]);
3632
builder.print_v(n.get_var());
@@ -204,24 +200,6 @@ pub fn dot_product<C: Config>(
204200
acc
205201
}
206202

207-
pub fn dot_product_pt_n_eval<C: Config>(
208-
builder: &mut Builder<C>,
209-
pt_and_eval: &Array<C, PointAndEvalVariable<C>>,
210-
b: &Array<C, Ext<C::F, C::EF>>,
211-
) -> Ext<<C as Config>::F, <C as Config>::EF> {
212-
let acc: Ext<C::F, C::EF> = builder.eval(C::F::ZERO);
213-
214-
iter_zip!(builder, pt_and_eval, b).for_each(|idx_vec, builder| {
215-
let ptr_a = idx_vec[0];
216-
let ptr_b = idx_vec[1];
217-
let v_a = builder.iter_ptr_get(&pt_and_eval, ptr_a);
218-
let v_b = builder.iter_ptr_get(&b, ptr_b);
219-
builder.assign(&acc, acc + v_a.eval * v_b);
220-
});
221-
222-
acc
223-
}
224-
225203
pub fn reverse<C: Config, T: MemVariable<C>>(
226204
builder: &mut Builder<C>,
227205
arr: &Array<C, T>,
@@ -321,20 +299,6 @@ pub fn eq_eval_with_index<C: Config>(
321299
acc
322300
}
323301

324-
// Multiply all elements in the Array
325-
pub fn product<C: Config>(
326-
builder: &mut Builder<C>,
327-
arr: &Array<C, Ext<C::F, C::EF>>,
328-
) -> Ext<C::F, C::EF> {
329-
let acc = builder.constant(C::EF::ONE);
330-
iter_zip!(builder, arr).for_each(|idx_vec, builder| {
331-
let el = builder.iter_ptr_get(arr, idx_vec[0]);
332-
builder.assign(&acc, acc * el);
333-
});
334-
335-
acc
336-
}
337-
338302
// Multiply all elements in a nested Array
339303
pub fn nested_product<C: Config>(
340304
builder: &mut Builder<C>,
@@ -353,47 +317,6 @@ pub fn nested_product<C: Config>(
353317
acc
354318
}
355319

356-
// Add all elements in the Array
357-
pub fn sum<C: Config>(
358-
builder: &mut Builder<C>,
359-
arr: &Array<C, Ext<C::F, C::EF>>,
360-
) -> Ext<C::F, C::EF> {
361-
let acc = builder.constant(C::EF::ZERO);
362-
iter_zip!(builder, arr).for_each(|idx_vec, builder| {
363-
let el = builder.iter_ptr_get(arr, idx_vec[0]);
364-
builder.assign(&acc, acc + el);
365-
});
366-
367-
acc
368-
}
369-
370-
// Join two arrays
371-
pub fn join<C: Config>(
372-
builder: &mut Builder<C>,
373-
a: &Array<C, Ext<C::F, C::EF>>,
374-
b: &Array<C, Ext<C::F, C::EF>>,
375-
) -> Array<C, Ext<C::F, C::EF>> {
376-
let a_len = a.len();
377-
let b_len = b.len();
378-
let out_len = builder.eval_expr(a_len.clone() + b_len.clone());
379-
let out = builder.dyn_array(out_len);
380-
381-
builder.range(0, a_len.clone()).for_each(|i_vec, builder| {
382-
let i = i_vec[0];
383-
let a_val = builder.get(a, i);
384-
builder.set(&out, i, a_val);
385-
});
386-
387-
builder.range(0, b_len).for_each(|i_vec, builder| {
388-
let b_i = i_vec[0];
389-
let i = builder.eval_expr(b_i + a_len.clone());
390-
let b_val = builder.get(b, b_i);
391-
builder.set(&out, i, b_val);
392-
});
393-
394-
out
395-
}
396-
397320
// Generate alpha power challenges
398321
pub fn gen_alpha_pows<C: Config>(
399322
builder: &mut Builder<C>,
@@ -421,7 +344,6 @@ pub fn gen_alpha_pows<C: Config>(
421344
/// = \sum_{\mathbf{b}=0}^{max_idx} \prod_{i=0}^{n-1} (x_i y_i b_i + (1 - x_i)(1 - y_i)(1 - b_i))
422345
pub fn eq_eval_less_or_equal_than<C: Config>(
423346
builder: &mut Builder<C>,
424-
_challenger: &mut DuplexChallengerVariable<C>,
425347
opcode_proof: &ZKVMChipProofInputVariable<C>,
426348
a: &Array<C, Ext<C::F, C::EF>>,
427349
b: &Array<C, Ext<C::F, C::EF>>,
@@ -519,35 +441,6 @@ pub fn build_eq_x_r_vec_sequential<C: Config>(
519441
evals
520442
}
521443

522-
pub fn build_eq_x_r_vec_sequential_with_offset<C: Config>(
523-
builder: &mut Builder<C>,
524-
r: &Array<C, Ext<C::F, C::EF>>,
525-
offset: Usize<C::N>,
526-
) -> Array<C, Ext<C::F, C::EF>> {
527-
// we build eq(x,r) from its evaluations
528-
// we want to evaluate eq(x,r) over x \in {0, 1}^num_vars
529-
// for example, with num_vars = 4, x is a binary vector of 4, then
530-
// 0 0 0 0 -> (1-r0) * (1-r1) * (1-r2) * (1-r3)
531-
// 1 0 0 0 -> r0 * (1-r1) * (1-r2) * (1-r3)
532-
// 0 1 0 0 -> (1-r0) * r1 * (1-r2) * (1-r3)
533-
// 1 1 0 0 -> r0 * r1 * (1-r2) * (1-r3)
534-
// ....
535-
// 1 1 1 1 -> r0 * r1 * r2 * r3
536-
// we will need 2^num_var evaluations
537-
538-
let r_len: Var<C::N> = builder.eval(r.len() - offset);
539-
let evals_len: Felt<C::F> = builder.constant(C::F::ONE);
540-
let evals_len = builder.exp_power_of_2_v::<Felt<C::F>>(evals_len, r_len);
541-
let evals_len = builder.cast_felt_to_var(evals_len);
542-
543-
let evals: Array<C, Ext<C::F, C::EF>> = builder.dyn_array(evals_len);
544-
// _debug
545-
// build_eq_x_r_helper_sequential_offset(r, &mut evals, E::ONE);
546-
// unsafe { std::mem::transmute(evals) }
547-
// FIXME: this function is not implemented yet
548-
evals
549-
}
550-
551444
pub fn ceil_log2(x: usize) -> usize {
552445
assert!(x > 0, "ceil_log2: x must be positive");
553446
// Calculate the number of bits in usize

src/basefold_verifier/verifier.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,6 @@ pub mod tests {
398398
let executor = VmExecutor::<BabyBear, NativeConfig>::new(config);
399399
executor.execute(program.clone(), witness.clone()).unwrap();
400400

401-
// _debug
402401
let results = executor.execute_segments(program, witness).unwrap();
403402
for seg in results {
404403
println!("=> cycle count: {:?}", seg.metrics.cycle_count);

0 commit comments

Comments
 (0)