openvm_continuations/circuit/deferral/hook/
mod.rs

1use 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}