@@ -22,13 +22,13 @@ fn push_point(buf: &mut Vec<u8>, pt: &G1Affine) {
2222 buf. extend_from_slice ( & y_hi) ;
2323}
2424
25- fn split_challenge ( fr : Fr ) -> ( Fr , Fr ) {
26- let b = fr . to_bytes ( ) ;
27- let mut lo = [ 0u8 ; 32 ] ;
28- lo [ 16 ..] . copy_from_slice ( & b [ 16 ..] ) ;
29- let mut hi = [ 0u8 ; 32 ] ;
30- hi [ 16 ..] . copy_from_slice ( & b [ ..16 ] ) ;
31- ( Fr :: from_bytes ( & lo ) , Fr :: from_bytes ( & hi ) )
25+ fn split_challenge ( challenge : Fr ) -> ( Fr , Fr ) {
26+ let challenge_bytes = challenge . to_bytes ( ) ;
27+ let mut low_bytes = [ 0u8 ; 32 ] ;
28+ low_bytes [ 16 ..] . copy_from_slice ( & challenge_bytes [ 16 ..] ) ;
29+ let mut high_bytes = [ 0u8 ; 32 ] ;
30+ high_bytes [ 16 ..] . copy_from_slice ( & challenge_bytes [ ..16 ] ) ;
31+ ( Fr :: from_bytes ( & low_bytes ) , Fr :: from_bytes ( & high_bytes ) )
3232}
3333
3434#[ inline( always) ]
@@ -48,7 +48,7 @@ fn generate_eta_challenge(
4848 circuit_size : u64 ,
4949 public_inputs_size : u64 ,
5050 pub_inputs_offset : u64 ,
51- ) -> ( RelationParameters , Fr ) {
51+ ) -> ( Fr , Fr , Fr , Fr ) {
5252 let mut data = Vec :: new ( ) ;
5353 data. extend_from_slice ( & u64_to_be32 ( circuit_size) ) ;
5454 data. extend_from_slice ( & u64_to_be32 ( public_inputs_size) ) ;
@@ -58,70 +58,67 @@ fn generate_eta_challenge(
5858 data. extend_from_slice ( pi) ;
5959 }
6060 debug_assert ! ( chunks. remainder( ) . is_empty( ) ) ;
61- // Append pairing point object (16 Fr) after public inputs
6261 for fr in & proof. pairing_point_object {
6362 data. extend_from_slice ( & fr. to_bytes ( ) ) ;
6463 }
6564 for w in & [ & proof. w1 , & proof. w2 , & proof. w3 ] {
6665 push_point ( & mut data, & w. to_affine ( ) ) ;
6766 }
6867
69- let h = hash_to_fr ( & data) ;
70- let ( eta, eta_two) = split_challenge ( h) ;
71- let h2 = hash_to_fr ( & h. to_bytes ( ) ) ;
72- let ( eta_three, _) = split_challenge ( h2) ;
73-
74- (
75- RelationParameters {
76- eta,
77- eta_two,
78- eta_three,
79- beta : Fr :: zero ( ) ,
80- gamma : Fr :: zero ( ) ,
81- public_inputs_delta : Fr :: zero ( ) ,
82- } ,
83- h2,
84- )
68+ let previous_challenge = hash_to_fr ( & data) ;
69+ let ( eta, eta_two) = split_challenge ( previous_challenge) ;
70+ let previous_challenge = hash_to_fr ( & previous_challenge. to_bytes ( ) ) ;
71+ let ( eta_three, _) = split_challenge ( previous_challenge) ;
72+
73+ ( eta, eta_two, eta_three, previous_challenge)
8574}
8675
87- fn generate_beta_and_gamma_challenges ( prev : Fr , proof : & Proof ) -> ( Fr , Fr , Fr ) {
88- let mut data = prev. to_bytes ( ) . to_vec ( ) ;
76+ fn generate_beta_and_gamma_challenges (
77+ previous_challenge : Fr ,
78+ proof : & Proof ,
79+ ) -> ( Fr , Fr , Fr ) {
80+ let mut data = previous_challenge. to_bytes ( ) . to_vec ( ) ;
8981 for w in & [
9082 & proof. lookup_read_counts ,
9183 & proof. lookup_read_tags ,
9284 & proof. w4 ,
9385 ] {
9486 push_point ( & mut data, & w. to_affine ( ) ) ;
9587 }
96- let h = hash_to_fr ( & data) ;
97- let ( beta, gamma) = split_challenge ( h ) ;
98- ( beta, gamma, h )
88+ let next_previous_challenge = hash_to_fr ( & data) ;
89+ let ( beta, gamma) = split_challenge ( next_previous_challenge ) ;
90+ ( beta, gamma, next_previous_challenge )
9991}
10092
101- fn generate_alpha_challenges ( prev : Fr , proof : & Proof ) -> ( [ Fr ; NUMBER_OF_ALPHAS ] , Fr ) {
102- let mut data = prev. to_bytes ( ) . to_vec ( ) ;
93+ fn generate_alpha_challenges (
94+ previous_challenge : Fr ,
95+ proof : & Proof ,
96+ ) -> ( [ Fr ; NUMBER_OF_ALPHAS ] , Fr ) {
97+ let mut data = previous_challenge. to_bytes ( ) . to_vec ( ) ;
10398 for w in & [ & proof. lookup_inverses , & proof. z_perm ] {
10499 push_point ( & mut data, & w. to_affine ( ) ) ;
105100 }
106- let mut cur = hash_to_fr ( & data) ;
101+ let mut next_previous_challenge = hash_to_fr ( & data) ;
107102
108103 let mut alphas = [ Fr :: zero ( ) ; NUMBER_OF_ALPHAS ] ;
109- let ( a0, a1) = split_challenge ( cur ) ;
104+ let ( a0, a1) = split_challenge ( next_previous_challenge ) ;
110105 alphas[ 0 ] = a0;
111106 alphas[ 1 ] = a1;
112- let mut filled = 2 ;
113-
114- while filled < NUMBER_OF_ALPHAS {
115- cur = hash_to_fr ( & cur. to_bytes ( ) ) ;
116- let ( lo, hi) = split_challenge ( cur) ;
117- alphas[ filled] = lo;
118- filled += 1 ;
119- if filled < NUMBER_OF_ALPHAS {
120- alphas[ filled] = hi;
121- filled += 1 ;
122- }
107+
108+ for i in 1 ..( NUMBER_OF_ALPHAS / 2 ) {
109+ next_previous_challenge = hash_to_fr ( & next_previous_challenge. to_bytes ( ) ) ;
110+ let ( lo, hi) = split_challenge ( next_previous_challenge) ;
111+ alphas[ 2 * i] = lo;
112+ alphas[ 2 * i + 1 ] = hi;
113+ }
114+
115+ if ( NUMBER_OF_ALPHAS & 1 ) == 1 && NUMBER_OF_ALPHAS > 2 {
116+ next_previous_challenge = hash_to_fr ( & next_previous_challenge. to_bytes ( ) ) ;
117+ let ( last, _) = split_challenge ( next_previous_challenge) ;
118+ alphas[ NUMBER_OF_ALPHAS - 1 ] = last;
123119 }
124- ( alphas, cur)
120+
121+ ( alphas, next_previous_challenge)
125122}
126123
127124fn generate_relation_parameters_challenges (
@@ -131,7 +128,7 @@ fn generate_relation_parameters_challenges(
131128 public_inputs_size : u64 ,
132129 pub_inputs_offset : u64 ,
133130) -> ( RelationParameters , Fr ) {
134- let ( mut rp , previous_challenge) = generate_eta_challenge (
131+ let ( eta , eta_two , eta_three , previous_challenge) = generate_eta_challenge (
135132 proof,
136133 public_inputs,
137134 circuit_size,
@@ -140,71 +137,82 @@ fn generate_relation_parameters_challenges(
140137 ) ;
141138 let ( beta, gamma, next_previous_challenge) =
142139 generate_beta_and_gamma_challenges ( previous_challenge, proof) ;
143- rp. beta = beta;
144- rp. gamma = gamma;
140+ let rp = RelationParameters {
141+ eta,
142+ eta_two,
143+ eta_three,
144+ beta,
145+ gamma,
146+ public_inputs_delta : Fr :: zero ( ) ,
147+ } ;
145148 ( rp, next_previous_challenge)
146149}
147150
148- fn generate_gate_challenges ( prev : Fr ) -> ( [ Fr ; CONST_PROOF_SIZE_LOG_N ] , Fr ) {
149- let mut cur = prev;
150- let mut out = [ Fr :: zero ( ) ; CONST_PROOF_SIZE_LOG_N ] ;
151+ fn generate_gate_challenges (
152+ previous_challenge : Fr ,
153+ ) -> ( [ Fr ; CONST_PROOF_SIZE_LOG_N ] , Fr ) {
154+ let mut next_previous_challenge = previous_challenge;
155+ let mut gate_challenges = [ Fr :: zero ( ) ; CONST_PROOF_SIZE_LOG_N ] ;
151156 for i in 0 ..CONST_PROOF_SIZE_LOG_N {
152- cur = hash_to_fr ( & cur . to_bytes ( ) ) ;
153- out [ i] = split_challenge ( cur ) . 0 ;
157+ next_previous_challenge = hash_to_fr ( & next_previous_challenge . to_bytes ( ) ) ;
158+ gate_challenges [ i] = split_challenge ( next_previous_challenge ) . 0 ;
154159 }
155- ( out , cur )
160+ ( gate_challenges , next_previous_challenge )
156161}
157162
158- fn generate_sumcheck_challenges ( proof : & Proof , prev : Fr ) -> ( [ Fr ; CONST_PROOF_SIZE_LOG_N ] , Fr ) {
159- let mut cur = prev;
160- let mut out = [ Fr :: zero ( ) ; CONST_PROOF_SIZE_LOG_N ] ;
163+ fn generate_sumcheck_challenges (
164+ proof : & Proof ,
165+ previous_challenge : Fr ,
166+ ) -> ( [ Fr ; CONST_PROOF_SIZE_LOG_N ] , Fr ) {
167+ let mut next_previous_challenge = previous_challenge;
168+ let mut sumcheck_challenges = [ Fr :: zero ( ) ; CONST_PROOF_SIZE_LOG_N ] ;
161169 for r in 0 ..CONST_PROOF_SIZE_LOG_N {
162- let mut data = cur . to_bytes ( ) . to_vec ( ) ;
170+ let mut data = next_previous_challenge . to_bytes ( ) . to_vec ( ) ;
163171 for & c in proof. sumcheck_univariates [ r] . iter ( ) {
164172 data. extend_from_slice ( & c. to_bytes ( ) ) ;
165173 }
166- cur = hash_to_fr ( & data) ;
167- out [ r] = split_challenge ( cur ) . 0 ;
174+ next_previous_challenge = hash_to_fr ( & data) ;
175+ sumcheck_challenges [ r] = split_challenge ( next_previous_challenge ) . 0 ;
168176 }
169- ( out , cur )
177+ ( sumcheck_challenges , next_previous_challenge )
170178}
171179
172- fn generate_rho_challenge ( proof : & Proof , prev : Fr ) -> ( Fr , Fr ) {
173- let mut data = prev . to_bytes ( ) . to_vec ( ) ;
180+ fn generate_rho_challenge ( proof : & Proof , previous_challenge : Fr ) -> ( Fr , Fr ) {
181+ let mut data = previous_challenge . to_bytes ( ) . to_vec ( ) ;
174182 for & e in proof. sumcheck_evaluations . iter ( ) {
175183 data. extend_from_slice ( & e. to_bytes ( ) ) ;
176184 }
177- let rho = split_challenge ( hash_to_fr ( & data) ) . 0 ;
178- let next = hash_to_fr ( & data ) ;
179- ( rho, next )
185+ let next_previous_challenge = hash_to_fr ( & data) ;
186+ let rho = split_challenge ( next_previous_challenge ) . 0 ;
187+ ( rho, next_previous_challenge )
180188}
181189
182- fn generate_gemini_r_challenge ( proof : & Proof , prev : Fr ) -> ( Fr , Fr ) {
183- let mut data = prev . to_bytes ( ) . to_vec ( ) ;
190+ fn generate_gemini_r_challenge ( proof : & Proof , previous_challenge : Fr ) -> ( Fr , Fr ) {
191+ let mut data = previous_challenge . to_bytes ( ) . to_vec ( ) ;
184192 for pt in proof. gemini_fold_comms . iter ( ) {
185193 push_point ( & mut data, & pt. to_affine ( ) ) ;
186194 }
187- let gemini_r = split_challenge ( hash_to_fr ( & data) ) . 0 ;
188- let next = hash_to_fr ( & data ) ;
189- ( gemini_r, next )
195+ let next_previous_challenge = hash_to_fr ( & data) ;
196+ let gemini_r = split_challenge ( next_previous_challenge ) . 0 ;
197+ ( gemini_r, next_previous_challenge )
190198}
191199
192- fn generate_shplonk_nu_challenge ( proof : & Proof , prev : Fr ) -> ( Fr , Fr ) {
193- let mut data = prev . to_bytes ( ) . to_vec ( ) ;
200+ fn generate_shplonk_nu_challenge ( proof : & Proof , previous_challenge : Fr ) -> ( Fr , Fr ) {
201+ let mut data = previous_challenge . to_bytes ( ) . to_vec ( ) ;
194202 for & a in proof. gemini_a_evaluations . iter ( ) {
195203 data. extend_from_slice ( & a. to_bytes ( ) ) ;
196204 }
197- let shplonk_nu = split_challenge ( hash_to_fr ( & data) ) . 0 ;
198- let next = hash_to_fr ( & data ) ;
199- ( shplonk_nu, next )
205+ let next_previous_challenge = hash_to_fr ( & data) ;
206+ let shplonk_nu = split_challenge ( next_previous_challenge ) . 0 ;
207+ ( shplonk_nu, next_previous_challenge )
200208}
201209
202- fn generate_shplonk_z_challenge ( proof : & Proof , prev : Fr ) -> ( Fr , Fr ) {
203- let mut data = prev . to_bytes ( ) . to_vec ( ) ;
210+ fn generate_shplonk_z_challenge ( proof : & Proof , previous_challenge : Fr ) -> ( Fr , Fr ) {
211+ let mut data = previous_challenge . to_bytes ( ) . to_vec ( ) ;
204212 push_point ( & mut data, & proof. shplonk_q . to_affine ( ) ) ;
205- let shplonk_z = split_challenge ( hash_to_fr ( & data) ) . 0 ;
206- let next = hash_to_fr ( & data ) ;
207- ( shplonk_z, next )
213+ let next_previous_challenge = hash_to_fr ( & data) ;
214+ let shplonk_z = split_challenge ( next_previous_challenge ) . 0 ;
215+ ( shplonk_z, next_previous_challenge )
208216}
209217
210218pub fn generate_transcript (
0 commit comments