diff --git a/Cargo.lock b/Cargo.lock index 1296a001b..88968389b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2234,7 +2234,7 @@ dependencies = [ [[package]] name = "ff_ext" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "once_cell", "p3", @@ -3238,7 +3238,7 @@ dependencies = [ [[package]] name = "mpcs" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "bincode 1.3.3", "clap", @@ -3262,7 +3262,7 @@ dependencies = [ [[package]] name = "multilinear_extensions" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "either", "ff_ext", @@ -4550,7 +4550,7 @@ dependencies = [ [[package]] name = "p3" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "p3-air", "p3-baby-bear", @@ -5118,7 +5118,7 @@ dependencies = [ [[package]] name = "poseidon" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "ff_ext", "p3", @@ -6075,7 +6075,7 @@ dependencies = [ [[package]] name = "sp1-curves" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "cfg-if", "dashu", @@ -6200,7 +6200,7 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "sumcheck" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "either", "ff_ext", @@ -6218,7 +6218,7 @@ dependencies = [ [[package]] name = "sumcheck_macro" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "itertools 0.13.0", "p3", @@ -6625,7 +6625,7 @@ dependencies = [ [[package]] name = "transcript" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "ff_ext", "itertools 0.13.0", @@ -6919,7 +6919,7 @@ dependencies = [ [[package]] name = "whir" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "bincode 1.3.3", "clap", @@ -7206,7 +7206,7 @@ dependencies = [ [[package]] name = "witness" version = "0.1.0" -source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.19#eb292fef68831ba85e6553a56cacbf770ea9d122" +source = "git+https://github.com/scroll-tech/gkr-backend.git?tag=v1.0.0-alpha.20#4f5a2b99af8edc9e8d808a6ab7c73e4088d61e39" dependencies = [ "ff_ext", "multilinear_extensions", diff --git a/Cargo.toml b/Cargo.toml index ef74bacad..0a75e8c40 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,16 +27,16 @@ version = "0.1.0" ceno_crypto_primitives = { git = "https://github.com/scroll-tech/ceno-patch.git", package = "ceno_crypto_primitives", branch = "main" } ceno_syscall = { git = "https://github.com/scroll-tech/ceno-patch.git", package = "ceno_syscall", branch = "main" } -ff_ext = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "ff_ext", tag = "v1.0.0-alpha.19" } -mpcs = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "mpcs", tag = "v1.0.0-alpha.19" } -multilinear_extensions = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "multilinear_extensions", tag = "v1.0.0-alpha.19" } -p3 = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "p3", tag = "v1.0.0-alpha.19" } -poseidon = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "poseidon", tag = "v1.0.0-alpha.19" } -sp1-curves = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sp1-curves", tag = "v1.0.0-alpha.19" } -sumcheck = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sumcheck", tag = "v1.0.0-alpha.19" } -transcript = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "transcript", tag = "v1.0.0-alpha.19" } -whir = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "whir", tag = "v1.0.0-alpha.19" } -witness = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "witness", tag = "v1.0.0-alpha.19" } +ff_ext = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "ff_ext", tag = "v1.0.0-alpha.20" } +mpcs = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "mpcs", tag = "v1.0.0-alpha.20" } +multilinear_extensions = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "multilinear_extensions", tag = "v1.0.0-alpha.20" } +p3 = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "p3", tag = "v1.0.0-alpha.20" } +poseidon = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "poseidon", tag = "v1.0.0-alpha.20" } +sp1-curves = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sp1-curves", tag = "v1.0.0-alpha.20" } +sumcheck = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "sumcheck", tag = "v1.0.0-alpha.20" } +transcript = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "transcript", tag = "v1.0.0-alpha.20" } +whir = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "whir", tag = "v1.0.0-alpha.20" } +witness = { git = "https://github.com/scroll-tech/gkr-backend.git", package = "witness", tag = "v1.0.0-alpha.20" } anyhow = { version = "1.0", default-features = false } bincode = "1" diff --git a/ceno_recursion/src/basefold_verifier/query_phase.rs b/ceno_recursion/src/basefold_verifier/query_phase.rs index 6064731c7..6bf40113f 100644 --- a/ceno_recursion/src/basefold_verifier/query_phase.rs +++ b/ceno_recursion/src/basefold_verifier/query_phase.rs @@ -307,12 +307,6 @@ pub struct QueryPhaseVerifierInputVariable { pub rounds: Array>, } -#[derive(DslVariable, Clone)] -pub struct PackedCodeword { - pub low: Ext, - pub high: Ext, -} - #[derive(DslVariable, Clone)] pub struct RoundContextVariable { pub(crate) opened_values_buffer: Array>>, @@ -388,11 +382,8 @@ pub(crate) fn batch_verifier_query_phase( let initial_cur_num_var: Var = builder.eval(input.max_num_var.clone()); let initial_log2_height: Var = - builder.eval(initial_cur_num_var + Usize::from(get_rate_log() - 1)); - builder.assert_eq::>( - input.proof.commits.len() + Usize::from(1), - input.fold_challenges.len(), - ); + builder.eval(initial_cur_num_var + Usize::from(get_rate_log())); + builder.assert_eq::>(input.proof.commits.len(), input.fold_challenges.len()); let rounds_context: Array> = builder.dyn_array(input.rounds.len()); let batch_coeffs_offset: Var = builder.constant(C::N::ZERO); @@ -419,12 +410,11 @@ pub(crate) fn batch_verifier_query_phase( .for_each(|ptr_vec, builder| { let opening = builder.iter_ptr_get(&round.openings, ptr_vec[2]); let log2_height: Var = - builder.eval(opening.num_var + Usize::from(get_rate_log() - 1)); + builder.eval(opening.num_var + Usize::from(get_rate_log())); builder.iter_ptr_set(&log2_heights, ptr_vec[1], log2_height); let width = opening.point_and_evals.evals.len(); - let opened_value_len: Var = builder.eval(width.clone() * two); - let opened_value_buffer = builder.dyn_array(opened_value_len); + let opened_value_buffer = builder.dyn_array(width.clone()); builder.iter_ptr_set( &opened_values_buffer, ptr_vec[0], @@ -480,17 +470,13 @@ pub(crate) fn batch_verifier_query_phase( let bit = builder.get(&idx_bits, i_vec[0]); builder.assert_eq::>(bit, Usize::from(0)); }); - let idx_bits = idx_bits.slice(builder, 1, log2_max_codeword_size); + let idx_bits = idx_bits.slice(builder, 0, log2_max_codeword_size); - let reduced_codeword_by_height: Array> = - builder.dyn_array(log2_max_codeword_size); + let ro_len: Var = builder.eval(log2_max_codeword_size + Usize::from(1)); + let reduced_codeword_by_height: Array> = builder.dyn_array(ro_len); // initialize reduced_codeword_by_height with zeroes iter_zip!(builder, reduced_codeword_by_height).for_each(|ptr_vec, builder| { - let zero_codeword = PackedCodeword { - low: zero, - high: zero, - }; - builder.set_value(&reduced_codeword_by_height, ptr_vec[0], zero_codeword); + builder.set_value(&reduced_codeword_by_height, ptr_vec[0], zero); }); let query = builder.iter_ptr_get(&input.proof.query_opening_proof, ptr_vec[1]); @@ -523,39 +509,23 @@ pub(crate) fn batch_verifier_query_phase( builder.iter_ptr_get(&round_context.minus_alpha_offsets, ptr_vec[1]); let opening = builder.iter_ptr_get(&round.openings, ptr_vec[4]); let width = opening.point_and_evals.evals.len(); - let low_values = opened_values_buffer.slice(builder, 0, width.clone()); - let high_values = opened_values_buffer.slice( - builder, - width.clone(), - opened_values_buffer.len(), - ); let all_zeros_slice = all_zeros.slice(builder, 0, width.clone()); - let low = builder.fri_single_reduced_opening_eval( - alpha, - opened_values.id.get_var(), - zero_flag, - &low_values, - &all_zeros_slice, - ); - let high = builder.fri_single_reduced_opening_eval( + let eval = builder.fri_single_reduced_opening_eval( alpha, opened_values.id.get_var(), zero_flag, - &high_values, + &opened_values_buffer, &all_zeros_slice, ); - builder.assign(&low, low * minus_alpha_offset); - builder.assign(&high, high * minus_alpha_offset); + builder.assign(&eval, eval * minus_alpha_offset); - let codeword: PackedCodeword = PackedCodeword { low, high }; - let codeword_acc = builder.get(&reduced_codeword_by_height, log2_height); + let eval_acc = builder.get(&reduced_codeword_by_height, log2_height); - // reduced_openings[log2_height] += codeword - builder.assign(&codeword_acc.low, codeword_acc.low + codeword.low); - builder.assign(&codeword_acc.high, codeword_acc.high + codeword.high); + // reduced_openings[log2_height] += eval + builder.assign(&eval_acc, eval_acc + eval); - builder.set_value(&reduced_codeword_by_height, log2_height, codeword_acc); + builder.set_value(&reduced_codeword_by_height, log2_height, eval_acc); // reorder opened values according to the permutation let mat_j = @@ -583,31 +553,24 @@ pub(crate) fn batch_verifier_query_phase( builder.cycle_tracker_end("Batching and first FRI round"); let opening_ext = query.commit_phase_openings; - // fold 1st codeword - let cur_num_var: Var = builder.eval(initial_cur_num_var); let log2_height: Var = builder.eval(initial_log2_height); - let r = builder.get(&input.fold_challenges, 0); - let codeword = builder.get(&reduced_codeword_by_height, log2_height); - let coeff = verifier_folding_coeffs_level( - builder, - &two_adic_generators_inverses, - log2_height, - &idx_bits, - inv_2, - ); - let folded = codeword_fold_with_challenge::( - builder, - codeword.low, - codeword.high, - r, - coeff, - inv_2, - ); + let coeff = { + let leaf_idx_bits = idx_bits.slice(builder, 1, idx_bits.len()); + verifier_folding_coeffs_level( + builder, + &two_adic_generators_inverses, + log2_height, + &leaf_idx_bits, + inv_2, + ) + }; + let folded = builder.constant(C::EF::ZERO); // check commit phases let commits = &input.proof.commits; builder.assert_eq::>(commits.len(), opening_ext.len()); + builder.cycle_tracker_start("FRI rounds"); let i: Var = builder.constant(C::N::ZERO); iter_zip!(builder, commits, opening_ext).for_each(|ptr_vec, builder| { @@ -618,47 +581,12 @@ pub(crate) fn batch_verifier_query_phase( let sibling_value = commit_phase_step.sibling_value; let proof = commit_phase_step.opening_proof; - builder.assign(&cur_num_var, cur_num_var - Usize::from(1)); - builder.assign(&log2_height, log2_height - Usize::from(1)); - let folded_idx = builder.get(&idx_bits, i); let new_involved_packed_codeword = builder.get(&reduced_codeword_by_height, log2_height); + builder.assign(&folded, folded + new_involved_packed_codeword); - // Note that previous coeff is - // 1/2 * generator_of_order(2^{level + 2})^{-prev_index} - // = 1/2 * generator_of_order(2^{level + 2})^{-(index+2^level*prev_bit)} - // = 1/2 * omega^{-2^(MAX - (level + 2)) * (index+2^level*prev_bit)} - // where generator_of_order(2^k) returns the generator of order 2^k, which is omega^{2^(MAX - k)} - // since omega is the generator of order 2^MAX, where MAX is the two-adicity of this field. - // Here prev_bit is the most significant bit of prev_index, and index is removing this bit - // from prev_index. - // - // So prev ^ 2 = 1/4 * omega^{-2^(MAX - (level + 2)) * 2 * (index+2^level*prev_bit)} - // = 1/4 * omega^{-2^(MAX - (level + 1)) * (index+2^level*prev_bit)} - // = 1/4 * omega^{-2^(MAX - (level + 1)) * index - 2^(MAX - (level + 1)) * 2^level*prev_bit} - // = 1/2 * curr * omeag^{- 2^(MAX - 1) * prev_bit} - // = 1/2 * curr * generator_of_order(2)^{-prev_bit} - // Note that generator_of_order(2) is exactly -1, so - // prev ^ 2 = 1/2 * curr * (-1)^{-prev_bit} - // which gives us - // curr = 2 * prev^2 * (-1)^{prev_bit} - // Note that we haven't multplied the (-1)^{prev_bit} in the following line. - // Because `folded_idx` is just the `prev_bit`, so we reuse the following `if_eq` and multiply -1 - // in the branch where `folded_idx` is != 0. - builder.assign(&coeff, coeff * coeff * two_felt); - - builder.if_eq(folded_idx, Usize::from(0)).then_or_else( - |builder| { - builder.assign(&folded, folded + new_involved_packed_codeword.low); - }, - |builder| { - builder.assign(&folded, folded + new_involved_packed_codeword.high); - builder.assign(&coeff, -coeff); - }, - ); - - // leafs + // leaf let leafs = builder.dyn_array(2); let sibling_idx = builder.eval_expr(RVar::from(1) - folded_idx); builder.set_value(&leafs, folded_idx, folded); @@ -670,8 +598,9 @@ pub(crate) fn batch_verifier_query_phase( // mmcs_ext.verify_batch let dimensions = builder.dyn_array(1); let opened_values = builder.dyn_array(1); + let log2_height_minus_one = builder.eval(log2_height - Usize::from(1)); builder.set_value(&opened_values, 0, leafs.clone()); - builder.set_value(&dimensions, 0, log2_height); + builder.set_value(&dimensions, 0, log2_height_minus_one); let ext_mmcs_verifier_input = ExtMmcsVerifierInputVariable { commit: commit.clone(), dimensions, @@ -681,13 +610,43 @@ pub(crate) fn batch_verifier_query_phase( }; ext_mmcs_verify_batch::(builder, ext_mmcs_verifier_input); - let r = builder.get(&input.fold_challenges, i_plus_one); + let r = builder.get(&input.fold_challenges, i); let left = builder.get(&leafs, 0); let right = builder.get(&leafs, 1); let new_folded = codeword_fold_with_challenge(builder, left, right, r, coeff, inv_2); builder.assign(&folded, new_folded); builder.assign(&i, i_plus_one); + builder.assign(&log2_height, log2_height_minus_one); + + // Note that previous coeff is + // 1/2 * generator_of_order(2^{level + 2})^{-prev_index} + // = 1/2 * generator_of_order(2^{level + 2})^{-(index+2^level*prev_bit)} + // = 1/2 * omega^{-2^(MAX - (level + 2)) * (index+2^level*prev_bit)} + // where generator_of_order(2^k) returns the generator of order 2^k, which is omega^{2^(MAX - k)} + // since omega is the generator of order 2^MAX, where MAX is the two-adicity of this field. + // Here prev_bit is the most significant bit of prev_index, and index is removing this bit + // from prev_index. + // + // So prev ^ 2 = 1/4 * omega^{-2^(MAX - (level + 2)) * 2 * (index+2^level*prev_bit)} + // = 1/4 * omega^{-2^(MAX - (level + 1)) * (index+2^level*prev_bit)} + // = 1/4 * omega^{-2^(MAX - (level + 1)) * index - 2^(MAX - (level + 1)) * 2^level*prev_bit} + // = 1/2 * curr * omega^{- 2^(MAX - 1) * prev_bit} + // = 1/2 * curr * generator_of_order(2)^{-prev_bit} + // Note that generator_of_order(2) is exactly -1, so + // prev ^ 2 = 1/2 * curr * (-1)^{-prev_bit} + // which gives us + // curr = 2 * prev^2 * (-1)^{prev_bit} + // Note that we haven't multplied the (-1)^{prev_bit} in the following line. + // Because `folded_idx` is just the `prev_bit`, so we reuse the following `if_eq` and multiply -1 + // in the branch where `folded_idx` is != 0. + builder.assign(&coeff, coeff * coeff * two_felt); + let next_folded_idx = builder.get(&idx_bits, i_plus_one); + builder + .if_ne(next_folded_idx, Usize::from(0)) + .then(|builder| { + builder.assign(&coeff, -coeff); + }); }); builder.cycle_tracker_end("FRI rounds"); // assert that final_value[i] = folded @@ -810,13 +769,22 @@ pub mod tests { BasefoldDefault, BasefoldRSParams, BasefoldSpec, PCSFriParam, PolynomialCommitmentScheme, pcs_batch_commit, pcs_trim, util::hash::write_digest_to_transcript, }; - use openvm_circuit::arch::{SystemConfig, VmExecutor, instructions::program::Program}; + use openvm_circuit::{ + arch::{SystemConfig, VmExecutor, instructions::program::Program}, + utils::{TestStarkEngine, air_test_impl}, + }; use openvm_instructions::exe::VmExe; - use openvm_native_circuit::{Native, NativeConfig}; + use openvm_native_circuit::{Native, NativeBuilder, NativeConfig}; use openvm_native_compiler::asm::AsmBuilder; use openvm_native_recursion::hints::Hintable; use openvm_stark_backend::p3_challenger::GrindingChallenger; - use openvm_stark_sdk::p3_baby_bear::BabyBear; + use openvm_stark_sdk::{ + config::{ + baby_bear_poseidon2::BabyBearPoseidon2Engine, + fri_params::standard_fri_params_with_100_bits_conjectured_security, + }, + p3_baby_bear::BabyBear, + }; use rand::thread_rng; use transcript::{BasicTranscript, Transcript}; @@ -827,6 +795,7 @@ pub mod tests { use crate::{ basefold_verifier::{ basefold::{Round, RoundOpening}, + mmcs::MmcsCommitment, query_phase::PointAndEvals, }, tower_verifier::binding::Point, @@ -929,9 +898,7 @@ pub mod tests { .sample_and_append_challenge(b"commit round") .elements, ); - if i < num_rounds - 1 { - write_digest_to_transcript(&commits[i], &mut transcript); - } + write_digest_to_transcript(&commits[i], &mut transcript); } transcript.append_field_element_exts_iter(opening_proof.final_message.iter().flatten()); @@ -979,12 +946,17 @@ pub mod tests { .with_max_segment_len((1 << 25) - 100); let config = NativeConfig::new(system_config, Native); - let executor = VmExecutor::::new(config).unwrap(); let exe = VmExe::new(program); + let executor = VmExecutor::::new(config.clone()).unwrap(); let interpreter = executor.instance(&exe).unwrap(); interpreter - .execute(witness, None) + .execute(witness.clone(), None) .expect("constructed test should pass"); + + let fri_params = standard_fri_params_with_100_bits_conjectured_security(1); + let vb = NativeBuilder::default(); + air_test_impl::(fri_params, vb, config, exe, witness, 1, true) + .unwrap(); } #[test] diff --git a/ceno_recursion/src/basefold_verifier/verifier.rs b/ceno_recursion/src/basefold_verifier/verifier.rs index cb380b068..c343660d0 100644 --- a/ceno_recursion/src/basefold_verifier/verifier.rs +++ b/ceno_recursion/src/basefold_verifier/verifier.rs @@ -113,12 +113,9 @@ pub fn batch_verify( transcript_observe_label(builder, challenger, b"commit round"); let challenge = challenger.sample_ext(builder); builder.set(&fold_challenges, index_vec[0], challenge); - builder - .if_ne(index_vec[0], num_rounds - Usize::from(1)) - .then(|builder| { - let commit = builder.get(&proof.commits, index_vec[0]); - challenger.observe_digest(builder, commit.value.into()); - }); + + let commit = builder.get(&proof.commits, index_vec[0]); + challenger.observe_digest(builder, commit.value.into()); }); iter_zip!(builder, proof.final_message).for_each(|ptr_vec_sumcheck_message, builder| {