use p3_challenger::{CanFinalizeDigest, CanObserve, CanSample, CanSampleBits, GrindingChallenger};
use p3_field::{BasedVectorSpace, Field};
pub trait TranscriptChallenger<F: Field, C>:
Clone
+ CanObserve<F>
+ CanObserve<C>
+ CanSample<F>
+ CanSampleBits<usize>
+ GrindingChallenger<Witness = F>
+ CanFinalizeDigest
{
}
impl<F, C, Ch> TranscriptChallenger<F, C> for Ch
where
F: Field,
Ch: Clone
+ CanObserve<F>
+ CanObserve<C>
+ CanSample<F>
+ CanSampleBits<usize>
+ GrindingChallenger<Witness = F>
+ CanFinalizeDigest,
{
}
pub trait Channel {
type F: Field;
type Commitment: Clone;
type Challenger: TranscriptChallenger<Self::F, Self::Commitment>;
fn sample(&mut self) -> Self::F;
fn sample_bits(&mut self, bits: usize) -> usize;
fn sample_algebra_element<A: BasedVectorSpace<Self::F>>(&mut self) -> A {
A::from_basis_coefficients_fn(|_| self.sample())
}
}