openvm_native_recursion/config/
outer.rs
1use openvm_native_compiler::ir::Config;
2use openvm_stark_backend::{
3 config::Com,
4 keygen::types::{MultiStarkVerifyingKey, StarkVerifyingKey},
5 p3_challenger::MultiField32Challenger,
6 p3_commit::ExtensionMmcs,
7 p3_field::extension::BinomialExtensionField,
8};
9use openvm_stark_sdk::{
10 config::baby_bear_poseidon2_root::BabyBearPoseidon2RootConfig,
11 p3_baby_bear::BabyBear,
12 p3_bn254_fr::{Bn254Fr, Poseidon2Bn254},
13};
14use p3_dft::Radix2DitParallel;
15use p3_fri::{BatchOpening, CommitPhaseProofStep, FriProof, QueryProof, TwoAdicFriPcs};
16use p3_merkle_tree::MerkleTreeMmcs;
17use p3_symmetric::{MultiField32PaddingFreeSponge, TruncatedPermutation};
18use serde::{Deserialize, Serialize};
19
20use crate::{
21 digest::DigestVal,
22 types::{
23 MultiStarkVerificationAdvice, StarkVerificationAdvice,
24 VerifierSinglePreprocessedDataInProgram,
25 },
26};
27
28const WIDTH: usize = 3;
29const RATE: usize = 16;
30const DIGEST_WIDTH: usize = 1;
31
32#[derive(Clone, Default, Debug, Serialize, Deserialize)]
33pub struct OuterConfig;
34
35impl Config for OuterConfig {
36 type N = Bn254Fr;
37 type F = BabyBear;
38 type EF = BinomialExtensionField<BabyBear, 4>;
39}
40
41pub type OuterVal = BabyBear;
43pub type OuterChallenge = BinomialExtensionField<OuterVal, 4>;
44pub type OuterPerm = Poseidon2Bn254<WIDTH>;
45pub type OuterHash =
46 MultiField32PaddingFreeSponge<OuterVal, Bn254Fr, OuterPerm, WIDTH, RATE, DIGEST_WIDTH>;
47pub type OuterDigest = [Bn254Fr; 1];
48pub type OuterCompress = TruncatedPermutation<OuterPerm, 2, 1, WIDTH>;
49pub type OuterValMmcs = MerkleTreeMmcs<BabyBear, Bn254Fr, OuterHash, OuterCompress, 1>;
50pub type OuterChallengeMmcs = ExtensionMmcs<OuterVal, OuterChallenge, OuterValMmcs>;
51pub type OuterDft = Radix2DitParallel<OuterVal>;
52pub type OuterChallenger = MultiField32Challenger<OuterVal, Bn254Fr, OuterPerm, WIDTH, 2>;
53pub type OuterPcs = TwoAdicFriPcs<OuterVal, OuterDft, OuterValMmcs, OuterChallengeMmcs>;
54pub type OuterInputProof = Vec<OuterBatchOpening>;
55pub type OuterQueryProof = QueryProof<OuterChallenge, OuterChallengeMmcs, OuterInputProof>;
56pub type OuterCommitPhaseStep = CommitPhaseProofStep<OuterChallenge, OuterChallengeMmcs>;
57pub type OuterFriProof = FriProof<OuterChallenge, OuterChallengeMmcs, OuterVal, OuterInputProof>;
58pub type OuterBatchOpening = BatchOpening<OuterVal, OuterValMmcs>;
59
60pub(crate) fn new_from_outer_vkv2(
61 vk: StarkVerifyingKey<BabyBear, Com<BabyBearPoseidon2RootConfig>>,
62) -> StarkVerificationAdvice<OuterConfig> {
63 let StarkVerifyingKey {
64 preprocessed_data,
65 params,
66 quotient_degree,
67 symbolic_constraints,
68 rap_phase_seq_kind: _,
69 } = vk;
70 StarkVerificationAdvice {
71 preprocessed_data: preprocessed_data.map(|data| {
72 let commit: [Bn254Fr; DIGEST_WIDTH] = data.commit.into();
73 VerifierSinglePreprocessedDataInProgram {
74 commit: DigestVal::N(commit.to_vec()),
75 }
76 }),
77 width: params.width,
78 quotient_degree: quotient_degree as usize,
79 num_public_values: params.num_public_values,
80 num_challenges_to_sample: params.num_challenges_to_sample,
81 num_exposed_values_after_challenge: params.num_exposed_values_after_challenge,
82 symbolic_constraints: symbolic_constraints.constraints,
83 }
84}
85
86pub fn new_from_outer_multi_vk(
88 vk: &MultiStarkVerifyingKey<BabyBearPoseidon2RootConfig>,
89) -> MultiStarkVerificationAdvice<OuterConfig> {
90 let num_challenges_to_sample = vk.num_challenges_per_phase();
91 let pre_hash: [Bn254Fr; DIGEST_WIDTH] = vk.pre_hash.into();
92 MultiStarkVerificationAdvice {
93 per_air: vk
94 .inner
95 .per_air
96 .iter()
97 .cloned()
98 .map(new_from_outer_vkv2)
99 .collect(),
100 num_challenges_to_sample,
101 trace_height_constraints: vk.inner.trace_height_constraints.clone(),
102 log_up_pow_bits: vk.inner.log_up_pow_bits,
103 pre_hash: DigestVal::N(pre_hash.to_vec()),
104 }
105}