Skip to main content

slop_challenger/
lib.rs

1#![allow(clippy::disallowed_types)]
2mod synchronize;
3
4use std::fmt::Debug;
5
6pub use p3_challenger::*;
7use serde::{de::DeserializeOwned, Deserialize, Serialize};
8use slop_algebra::{ExtensionField, Field, PrimeField32};
9use slop_symmetric::{CryptographicHasher, PseudoCompressionFunction};
10pub use synchronize::*;
11
12pub trait FromChallenger<Challenger, A>: Sized {
13    fn from_challenger(challenger: &Challenger, backend: &A) -> Self;
14}
15
16impl<Challenger: Clone, A> FromChallenger<Challenger, A> for Challenger {
17    fn from_challenger(challenger: &Challenger, _backend: &A) -> Self {
18        challenger.clone()
19    }
20}
21
22/// A trait packaging together the types that usually appear in interactive oracle proofs in the
23/// context of SP1: a field and a its cryptographically secure extension, a Fiat-Shamir challenger,
24/// and a succinct commitment to data.
25pub trait IopCtx:
26    Clone + 'static + Send + Sync + Serialize + for<'de> Deserialize<'de> + Debug + Default
27{
28    type F: PrimeField32 + Ord;
29    type EF: ExtensionField<Self::F>;
30    type Digest: 'static
31        + Copy
32        + Send
33        + Sync
34        + Serialize
35        + DeserializeOwned
36        + Debug
37        + PartialEq
38        + Eq;
39    type Challenger: VariableLengthChallenger<Self::F, Self::Digest>
40        + GrindingChallenger
41        + 'static
42        + Send
43        + Sync
44        + Clone;
45
46    type Hasher: CryptographicHasher<Self::F, Self::Digest> + Send + Sync + Clone;
47    type Compressor: PseudoCompressionFunction<Self::Digest, 2> + Send + Sync + Clone;
48
49    fn default_hasher_and_compressor() -> (Self::Hasher, Self::Compressor);
50
51    fn default_challenger() -> Self::Challenger;
52}
53
54pub trait VariableLengthChallenger<F: Field, Digest: Copy>:
55    FieldChallenger<F> + CanObserve<Digest>
56{
57    fn observe_variable_length_slice(&mut self, data: &[F]) {
58        self.observe(F::from_canonical_u32(data.len() as u32));
59        self.observe_slice(data);
60    }
61    fn observe_variable_length_extension_slice<EF: ExtensionField<F>>(&mut self, data: &[EF]) {
62        self.observe(F::from_canonical_u32(data.len() as u32));
63        for &item in data {
64            self.observe_ext_element(item);
65        }
66    }
67    fn observe_constant_length_slice(&mut self, data: &[F]) {
68        self.observe_slice(data);
69    }
70    fn observe_constant_length_extension_slice<EF: ExtensionField<F>>(&mut self, data: &[EF]) {
71        for &item in data {
72            self.observe_ext_element(item);
73        }
74    }
75    fn observe_constant_length_digest_slice(&mut self, data: &[Digest]) {
76        self.observe_slice(data);
77    }
78    fn observe_variable_length_digest_slice(&mut self, data: &[Digest]) {
79        self.observe(F::from_canonical_u32(data.len() as u32));
80        self.observe_slice(data);
81    }
82}
83
84impl<F: Field, Digest: Copy, C: FieldChallenger<F> + CanObserve<Digest>>
85    VariableLengthChallenger<F, Digest> for C
86{
87}