Skip to content

Commit ee998da

Browse files
committed
clean transcript
1 parent c2f4343 commit ee998da

1 file changed

Lines changed: 90 additions & 82 deletions

File tree

src/transcript.rs

Lines changed: 90 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -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

127124
fn 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

210218
pub fn generate_transcript(

0 commit comments

Comments
 (0)