openvm_verify_stark_circuit/prover/
trace.rs1use std::iter::once;
2
3use itertools::Itertools;
4use openvm_circuit::{
5 arch::POSEIDON2_WIDTH, system::memory::merkle::public_values::UserPublicValuesProof,
6};
7use openvm_continuations::{circuit::deferral::DeferralMerkleProofs, SC};
8use openvm_recursion_circuit::system::{
9 AggregationSubCircuit, CachedTraceCtx, VerifierExternalData, VerifierTraceGen,
10};
11use openvm_stark_backend::{
12 proof::Proof,
13 prover::{ProverBackend, ProvingContext},
14};
15use openvm_stark_sdk::config::baby_bear_poseidon2::{
16 default_duplex_sponge_recorder, Digest, DIGEST_SIZE, EF, F,
17};
18use p3_field::PrimeCharacteristicRing;
19use tracing::instrument;
20
21use crate::{prover::DeferredVerifyProver, DeferredVerifyTraceGen, PreVerifierData};
22
23impl<PB, S, T> DeferredVerifyProver<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 proof: Proof<SC>,
33 user_pvs_proof: &UserPublicValuesProof<DIGEST_SIZE, PB::Val>,
34 deferral_merkle_proofs: Option<&DeferralMerkleProofs<PB::Val>>,
35 device_ctx: &DC,
36 ) -> ProvingContext<PB>
37 where
38 S: AggregationSubCircuit + VerifierTraceGen<PB, SC, DC>,
39 T: DeferredVerifyTraceGen<PB, DC>,
40 DC: Clone + Send + Sync,
41 {
42 assert_eq!(
43 user_pvs_proof.public_values.len(),
44 self.circuit.num_user_pvs
45 );
46
47 let PreVerifierData {
48 pre_verifier_ctxs,
49 post_verifier_ctxs,
50 poseidon2_compress_inputs,
51 poseidon2_permute_inputs,
52 range_inputs,
53 verifier_pvs_record,
54 output_commit,
55 } = self.agg_node_tracegen.pre_verifier_subcircuit_tracegen(
56 &proof,
57 user_pvs_proof,
58 self.circuit.memory_dimensions,
59 self.circuit.def_idx,
60 deferral_merkle_proofs,
61 device_ctx,
62 );
63
64 let power_check_inputs = vec![];
65 let mut final_transcript_state = [F::ZERO; POSEIDON2_WIDTH];
66 let mut external_data = VerifierExternalData {
67 poseidon2_compress_inputs: &poseidon2_compress_inputs,
68 poseidon2_permute_inputs: &poseidon2_permute_inputs,
69 range_check_inputs: &range_inputs,
70 power_check_inputs: &power_check_inputs,
71 required_heights: None,
72 final_transcript_state: Some(&mut final_transcript_state),
73 };
74
75 let proof_slice = &[proof];
76 let subcircuit_ctxs = self
77 .circuit
78 .verifier_circuit
79 .generate_proving_ctxs(
80 &self.child_vk,
81 CachedTraceCtx::PcsData(self.child_vk_pcs_data.clone()),
82 proof_slice,
83 &mut external_data,
84 device_ctx,
85 default_duplex_sponge_recorder(),
86 )
87 .unwrap();
88
89 let verifier_pvs_ctx = self.agg_node_tracegen.generate_verifier_pvs_ctx(
90 &proof_slice[0],
91 verifier_pvs_record,
92 final_transcript_state,
93 output_commit,
94 self.circuit.def_idx,
95 device_ctx,
96 );
97
98 ProvingContext {
99 per_trace: once(verifier_pvs_ctx)
100 .chain(pre_verifier_ctxs)
101 .chain(subcircuit_ctxs)
102 .chain(post_verifier_ctxs)
103 .enumerate()
104 .collect_vec(),
105 }
106 }
107}