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
41/// A configuration for outer recursion.
42pub 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
86/// Create MultiStarkVerificationAdvice for the outer config.
87pub 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}