remainder/input_layer/
fiat_shamir_challenge.rs1use std::marker::PhantomData;
4
5use serde::{Deserialize, Serialize};
6use shared_types::Field;
7
8use crate::{
9 layer::LayerId,
10 mle::{dense::DenseMle, evals::MultilinearExtension},
11};
12
13#[derive(Debug, Clone)]
17pub struct FiatShamirChallenge<F: Field> {
18 pub mle: MultilinearExtension<F>,
20 pub(crate) layer_id: LayerId,
22}
23
24#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Hash)]
26#[serde(bound = "F: Field")]
27pub struct FiatShamirChallengeDescription<F: Field> {
28 layer_id: LayerId,
30
31 pub num_bits: usize,
33
34 _marker: PhantomData<F>,
35}
36
37impl<F: Field> FiatShamirChallengeDescription<F> {
38 pub fn new(layer_id: LayerId, num_bits: usize) -> Self {
41 Self {
42 layer_id,
43 num_bits,
44 _marker: PhantomData,
45 }
46 }
47}
48
49impl<F: Field> FiatShamirChallenge<F> {
50 pub fn new(mle: MultilinearExtension<F>) -> Self {
53 let layer_id = LayerId::next_fiat_shamir_challenge_layer_id();
54 Self { mle, layer_id }
55 }
56
57 pub fn get_mle(&self) -> DenseMle<F> {
59 DenseMle::new_from_raw(self.mle.to_vec(), self.layer_id)
60 }
61
62 pub fn layer_id(&self) -> LayerId {
64 self.layer_id
65 }
66}
67
68impl<F: Field> FiatShamirChallengeDescription<F> {
69 pub fn layer_id(&self) -> LayerId {
71 self.layer_id
72 }
73
74 pub fn instantiate(&self, values: Vec<F>) -> FiatShamirChallenge<F> {
79 assert_eq!(values.len(), 1 << self.num_bits);
80 FiatShamirChallenge {
81 mle: MultilinearExtension::new(values),
82 layer_id: self.layer_id,
83 }
84 }
85}
86
87#[cfg(test)]
88mod tests {
89 use crate::claims::RawClaim;
90 use crate::utils::mle::verify_claim;
91
92 use super::*;
93 use shared_types::{
94 transcript::{
95 test_transcript::TestSponge, ProverTranscript, TranscriptReader, TranscriptWriter,
96 VerifierTranscript,
97 },
98 Fr,
99 };
100
101 #[test]
102 fn test_circuit_fiat_shamir_challenge() {
103 let layer_id = LayerId::Input(0);
105
106 let num_vars = 2;
108 let num_evals = 1 << num_vars;
109
110 let mut transcript_writer: TranscriptWriter<Fr, TestSponge<Fr>> =
112 TranscriptWriter::new("Test Transcript Writer");
113
114 let claim_point = vec![Fr::from(2), Fr::from(2)];
115 let claim_result = Fr::from(1);
116 let claim: RawClaim<Fr> = RawClaim::new(claim_point, claim_result);
117
118 let mle_vec = transcript_writer.get_challenges("random challenges for FS", num_evals);
119 let mle = MultilinearExtension::new(mle_vec);
120
121 let fs_desc = FiatShamirChallengeDescription::<Fr>::new(layer_id, mle.num_vars());
122 let _fiat_shamir_challenge = FiatShamirChallenge::new(mle);
124
125 let transcript = transcript_writer.get_transcript();
128 let mut transcript_reader: TranscriptReader<Fr, TestSponge<Fr>> =
129 TranscriptReader::new(transcript);
130
131 let values = transcript_reader
133 .get_challenges("random challenges for FS", 1 << fs_desc.num_bits)
134 .unwrap();
135 let fiat_shamir_challenge = fs_desc.instantiate(values);
136
137 verify_claim(&fiat_shamir_challenge.mle.to_vec(), &claim);
141 }
142}