openvm_continuations/circuit/deferral/hook/
mod.rs1use std::sync::Arc;
2
3use itertools::Itertools;
4use openvm_recursion_circuit::{prelude::F, system::AggregationSubCircuit};
5use openvm_stark_backend::{AirRef, StarkProtocolConfig};
6
7use crate::{
8 circuit::{
9 subair::{HashSliceSubAir, MerkleRootBus, MerkleTreeInternalBus, MerkleTreeSubAir},
10 Circuit,
11 },
12 VkCommitBytes,
13};
14
15pub mod bus;
16pub mod decommit;
17pub mod onion;
18pub mod verifier;
19
20mod trace;
21pub use trace::*;
22
23#[derive(derive_new::new, Clone)]
24pub struct DeferralHookCircuit<S: AggregationSubCircuit> {
25 pub verifier_circuit: Arc<S>,
26 pub(crate) internal_recursive_vk_commit: VkCommitBytes,
27}
28
29impl<SC: StarkProtocolConfig<F = F>, S: AggregationSubCircuit> Circuit<SC>
30 for DeferralHookCircuit<S>
31{
32 fn airs(&self) -> Vec<AirRef<SC>> {
33 let bus_inventory = self.verifier_circuit.bus_inventory();
34 let next_bus_idx = self.verifier_circuit.next_bus_idx();
35 let io_commit_bus = bus::IoCommitBus::new(next_bus_idx);
36 let onion_res_bus = bus::OnionResultBus::new(next_bus_idx + 1);
37 let def_circuit_commit_bus = bus::DefCircuitCommitBus::new(next_bus_idx + 2);
38 let merkle_root_bus = MerkleRootBus::new(next_bus_idx + 3);
39 let merkle_tree_internal_bus = MerkleTreeInternalBus::new(next_bus_idx + 4);
40
41 let verifier_pvs_air = verifier::DeferralHookPvsAir::new(
42 bus_inventory.public_values_bus,
43 bus_inventory.cached_commit_bus,
44 bus_inventory.pre_hash_bus,
45 bus_inventory.poseidon2_compress_bus,
46 HashSliceSubAir {
47 compress_bus: bus_inventory.poseidon2_compress_bus,
48 permute_bus: bus_inventory.poseidon2_permute_bus,
49 },
50 bus_inventory.power_checker_bus,
51 bus_inventory.range_checker_bus,
52 def_circuit_commit_bus,
53 merkle_root_bus,
54 onion_res_bus,
55 self.internal_recursive_vk_commit,
56 );
57
58 let decommit_air = decommit::MerkleDecommitAir {
59 subair: MerkleTreeSubAir::new(
60 bus_inventory.poseidon2_compress_bus,
61 merkle_root_bus,
62 merkle_tree_internal_bus,
63 0,
64 true,
65 ),
66 io_commit_bus,
67 };
68
69 let onion_air = onion::OnionHashAir {
70 poseidon2_bus: bus_inventory.poseidon2_compress_bus,
71 def_circuit_commit_bus,
72 io_commit_bus,
73 onion_res_bus,
74 };
75
76 [Arc::new(verifier_pvs_air) as AirRef<SC>]
77 .into_iter()
78 .chain([Arc::new(decommit_air) as AirRef<SC>])
79 .chain([Arc::new(onion_air) as AirRef<SC>])
80 .chain(self.verifier_circuit.airs())
81 .collect_vec()
82 }
83}