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
22pub 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}