openvm_native_recursion/challenger/
mod.rs

1use openvm_native_compiler::{
2    ir::RVar,
3    prelude::{Array, Builder, Config, Ext, Felt, Var},
4};
5
6use crate::digest::DigestVariable;
7
8pub mod duplex;
9pub mod multi_field32;
10
11/// Reference: [`openvm_stark_backend::p3_challenger::CanObserve`]
12pub trait CanObserveVariable<C: Config, V> {
13    fn observe(&mut self, builder: &mut Builder<C>, value: V);
14
15    fn observe_slice(&mut self, builder: &mut Builder<C>, values: Array<C, V>);
16}
17
18/// Reference: [`openvm_stark_backend::p3_challenger::CanObserve`]
19pub trait CanObserveDigest<C: Config> {
20    fn observe_digest(&mut self, builder: &mut Builder<C>, value: DigestVariable<C>);
21}
22
23pub trait CanSampleVariable<C: Config, V> {
24    #[allow(dead_code)]
25    fn sample(&mut self, builder: &mut Builder<C>) -> V;
26}
27
28/// Reference: [`openvm_stark_backend::p3_challenger::FieldChallenger`]
29pub trait FeltChallenger<C: Config>:
30    CanObserveVariable<C, Felt<C::F>> + CanSampleVariable<C, Felt<C::F>> + CanSampleBitsVariable<C>
31{
32    fn sample_ext(&mut self, builder: &mut Builder<C>) -> Ext<C::F, C::EF>;
33}
34
35pub trait CanSampleBitsVariable<C: Config> {
36    fn sample_bits(&mut self, builder: &mut Builder<C>, nb_bits: RVar<C::N>)
37        -> Array<C, Var<C::N>>;
38}
39
40pub trait CanCheckWitness<C: Config> {
41    fn check_witness(&mut self, builder: &mut Builder<C>, nb_bits: usize, witness: Felt<C::F>);
42}
43
44pub trait ChallengerVariable<C: Config>:
45    FeltChallenger<C> + CanObserveDigest<C> + CanCheckWitness<C>
46{
47    fn new(builder: &mut Builder<C>) -> Self;
48}