openvm_continuations/prover/deferral/inner/
trace.rs

1use std::iter::once;
2
3use itertools::Itertools;
4use openvm_recursion_circuit::system::{
5    AggregationSubCircuit, CachedTraceCtx, VerifierExternalData, VerifierTraceGen,
6};
7use openvm_stark_backend::{
8    proof::Proof,
9    prover::{ProverBackend, ProvingContext},
10};
11use openvm_stark_sdk::config::baby_bear_poseidon2::{
12    default_duplex_sponge_recorder, Digest, EF, F,
13};
14use openvm_verify_stark_host::pvs::VkCommit;
15use tracing::instrument;
16
17use super::{DeferralChildVkKind, DeferralInnerProver};
18use crate::{
19    circuit::deferral::inner::{DeferralInnerPreCtx, DeferralInnerTraceGen},
20    SC,
21};
22
23impl<PB, S, T> DeferralInnerProver<PB, S, T>
24where
25    PB: ProverBackend<Val = F, Challenge = EF, Commitment = Digest>,
26    S: AggregationSubCircuit,
27    PB::Matrix: Clone,
28{
29    #[instrument(name = "trace_gen", skip_all)]
30    pub fn generate_proving_ctx<DC>(
31        &self,
32        proofs: &[Proof<SC>],
33        child_vk_kind: DeferralChildVkKind,
34        child_merkle_depth: Option<usize>,
35        device_ctx: &DC,
36    ) -> ProvingContext<PB>
37    where
38        S: VerifierTraceGen<PB, SC, DC>,
39        T: DeferralInnerTraceGen<PB, DC>,
40        DC: Clone + Send + Sync,
41    {
42        assert!(proofs.len() <= self.circuit.verifier_circuit.max_num_proofs());
43        assert!((1..=2).contains(&proofs.len()));
44        assert!(
45            child_merkle_depth.is_some() || proofs.len() == 1,
46            "child_merkle_depth=None is only valid for single-proof wrappers"
47        );
48
49        let (child_vk, child_vk_pcs_data, child_is_agg) = match child_vk_kind {
50            DeferralChildVkKind::DeferralCircuit => {
51                (&self.child_vk, self.child_vk_pcs_data.clone(), false)
52            }
53            DeferralChildVkKind::DeferralAggregation => {
54                (&self.child_vk, self.child_vk_pcs_data.clone(), true)
55            }
56            DeferralChildVkKind::RecursiveSelf => {
57                (&self.vk, self.self_vk_pcs_data.clone().unwrap(), true)
58            }
59        };
60        let child_vk_commit = VkCommit {
61            cached_commit: child_vk_pcs_data.commitment,
62            vk_pre_hash: child_vk.pre_hash,
63        };
64
65        let DeferralInnerPreCtx {
66            verifier_pvs_ctx,
67            def_pvs_ctx,
68            input_ctx,
69            poseidon2_compress_inputs,
70            poseidon2_permute_inputs,
71            range_check_inputs,
72        } = self.agg_node_tracegen.pre_verifier_subcircuit_tracegen(
73            proofs,
74            child_is_agg,
75            child_vk_commit,
76            child_merkle_depth,
77            device_ctx,
78        );
79
80        let power_check_inputs = vec![];
81        let mut external_data = VerifierExternalData {
82            poseidon2_compress_inputs: &poseidon2_compress_inputs,
83            poseidon2_permute_inputs: &poseidon2_permute_inputs,
84            range_check_inputs: &range_check_inputs,
85            power_check_inputs: &power_check_inputs,
86            required_heights: None,
87            final_transcript_state: None,
88        };
89
90        let subcircuit_ctxs = self
91            .circuit
92            .verifier_circuit
93            .generate_proving_ctxs(
94                child_vk,
95                CachedTraceCtx::PcsData(child_vk_pcs_data),
96                proofs,
97                &mut external_data,
98                device_ctx,
99                default_duplex_sponge_recorder(),
100            )
101            .unwrap();
102
103        ProvingContext {
104            per_trace: once(verifier_pvs_ctx)
105                .chain(once(def_pvs_ctx))
106                .chain(once(input_ctx))
107                .chain(subcircuit_ctxs)
108                .enumerate()
109                .collect_vec(),
110        }
111    }
112}