Skip to main content

miden_stark_transcript/
channel.rs

1//! Shared `Channel` trait and `TranscriptChallenger` supertrait.
2
3use p3_challenger::{CanFinalizeDigest, CanObserve, CanSample, CanSampleBits, GrindingChallenger};
4use p3_field::{BasedVectorSpace, Field};
5
6/// Bundle of challenger bounds required by transcript channels.
7///
8/// Any challenger that satisfies `CanObserve<F>`, `CanObserve<C>`, `CanSample<F>`,
9/// `CanSampleBits<usize>`, `GrindingChallenger<Witness = F>`, and
10/// `CanFinalizeDigest` automatically implements this trait via a blanket impl.
11pub trait TranscriptChallenger<F: Field, C>:
12    Clone
13    + CanObserve<F>
14    + CanObserve<C>
15    + CanSample<F>
16    + CanSampleBits<usize>
17    + GrindingChallenger<Witness = F>
18    + CanFinalizeDigest
19{
20}
21
22impl<F, C, Ch> TranscriptChallenger<F, C> for Ch
23where
24    F: Field,
25    Ch: Clone
26        + CanObserve<F>
27        + CanObserve<C>
28        + CanSample<F>
29        + CanSampleBits<usize>
30        + GrindingChallenger<Witness = F>
31        + CanFinalizeDigest,
32{
33}
34
35/// Shared base trait for [`ProverChannel`](crate::ProverChannel) and
36/// [`VerifierChannel`](crate::VerifierChannel).
37///
38/// Provides sampling methods common to both sides of the transcript.
39pub trait Channel {
40    type F: Field;
41    type Commitment: Clone;
42    type Challenger: TranscriptChallenger<Self::F, Self::Commitment>;
43
44    /// Sample a random field element from the challenger.
45    fn sample(&mut self) -> Self::F;
46
47    /// Sample a random `bits`-bit integer from the challenger.
48    fn sample_bits(&mut self, bits: usize) -> usize;
49
50    /// Sample a random algebra element (e.g. extension field) from the challenger.
51    fn sample_algebra_element<A: BasedVectorSpace<Self::F>>(&mut self) -> A {
52        A::from_basis_coefficients_fn(|_| self.sample())
53    }
54}