openvm_continuations/prover/deferral/inner/
trace.rs1use 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}