1use crate::commitment_scheme::Commitment;
8use dusk_bytes::{DeserializableSlice, Serializable};
9use parity_scale_codec::{Decode, Encode};
10
11pub mod arithmetic;
12pub mod ecc;
13pub mod logic;
14pub mod lookup;
15pub mod permutation;
16pub mod range;
17
18#[derive(Debug, PartialEq, Eq, Copy, Clone, Decode, Encode)]
23pub struct VerifierKey {
24 pub(crate) n: u32,
26 pub(crate) arithmetic: arithmetic::VerifierKey,
28 pub(crate) logic: logic::VerifierKey,
30 pub(crate) range: range::VerifierKey,
32 pub(crate) fixed_base: ecc::scalar_mul::fixed_base::VerifierKey,
34 pub(crate) variable_base: ecc::curve_addition::VerifierKey,
36 pub(crate) lookup: lookup::VerifierKey,
38 pub(crate) permutation: permutation::VerifierKey,
40}
41
42impl Serializable<{ 20 * Commitment::SIZE + u64::SIZE }> for VerifierKey {
43 type Error = dusk_bytes::Error;
44
45 #[allow(unused_must_use)]
46 fn to_bytes(&self) -> [u8; Self::SIZE] {
47 use dusk_bytes::Write;
48 let mut buff = [0u8; Self::SIZE];
49 let mut writer = &mut buff[..];
50
51 writer.write(&(self.n as u64).to_bytes());
52 writer.write(&self.arithmetic.q_m.to_bytes());
53 writer.write(&self.arithmetic.q_l.to_bytes());
54 writer.write(&self.arithmetic.q_r.to_bytes());
55 writer.write(&self.arithmetic.q_o.to_bytes());
56 writer.write(&self.arithmetic.q_4.to_bytes());
57 writer.write(&self.arithmetic.q_c.to_bytes());
58 writer.write(&self.arithmetic.q_arith.to_bytes());
59 writer.write(&self.logic.q_logic.to_bytes());
60 writer.write(&self.range.q_range.to_bytes());
61 writer.write(&self.fixed_base.q_fixed_group_add.to_bytes());
62 writer.write(&self.variable_base.q_variable_group_add.to_bytes());
63 writer.write(&self.lookup.q_lookup.to_bytes());
64 writer.write(&self.permutation.left_sigma.to_bytes());
65 writer.write(&self.permutation.right_sigma.to_bytes());
66 writer.write(&self.permutation.out_sigma.to_bytes());
67 writer.write(&self.permutation.fourth_sigma.to_bytes());
68 writer.write(&self.lookup.table_1.to_bytes());
69 writer.write(&self.lookup.table_2.to_bytes());
70 writer.write(&self.lookup.table_3.to_bytes());
71 writer.write(&self.lookup.table_4.to_bytes());
72
73 buff
74 }
75
76 fn from_bytes(buf: &[u8; Self::SIZE]) -> Result<VerifierKey, Self::Error> {
77 let mut buffer = &buf[..];
78
79 Ok(Self::from_polynomial_commitments(
80 u64::from_reader(&mut buffer)? as usize,
81 Commitment::from_reader(&mut buffer)?,
82 Commitment::from_reader(&mut buffer)?,
83 Commitment::from_reader(&mut buffer)?,
84 Commitment::from_reader(&mut buffer)?,
85 Commitment::from_reader(&mut buffer)?,
86 Commitment::from_reader(&mut buffer)?,
87 Commitment::from_reader(&mut buffer)?,
88 Commitment::from_reader(&mut buffer)?,
89 Commitment::from_reader(&mut buffer)?,
90 Commitment::from_reader(&mut buffer)?,
91 Commitment::from_reader(&mut buffer)?,
92 Commitment::from_reader(&mut buffer)?,
93 Commitment::from_reader(&mut buffer)?,
94 Commitment::from_reader(&mut buffer)?,
95 Commitment::from_reader(&mut buffer)?,
96 Commitment::from_reader(&mut buffer)?,
97 Commitment::from_reader(&mut buffer)?,
98 Commitment::from_reader(&mut buffer)?,
99 Commitment::from_reader(&mut buffer)?,
100 Commitment::from_reader(&mut buffer)?,
101 ))
102 }
103}
104
105impl VerifierKey {
106 pub const fn padded_gates(&self) -> u32 {
108 self.n.next_power_of_two()
109 }
110
111 pub(crate) fn from_polynomial_commitments(
115 n: usize,
116 q_m: Commitment,
117 q_l: Commitment,
118 q_r: Commitment,
119 q_o: Commitment,
120 q_4: Commitment,
121 q_c: Commitment,
122 q_arith: Commitment,
123 q_logic: Commitment,
124 q_range: Commitment,
125 q_fixed_group_add: Commitment,
126 q_variable_group_add: Commitment,
127 q_lookup: Commitment,
128 left_sigma: Commitment,
129 right_sigma: Commitment,
130 out_sigma: Commitment,
131 fourth_sigma: Commitment,
132 table_1: Commitment,
133 table_2: Commitment,
134 table_3: Commitment,
135 table_4: Commitment,
136 ) -> VerifierKey {
137 let arithmetic = arithmetic::VerifierKey {
138 q_m,
139 q_l,
140 q_r,
141 q_o,
142 q_4,
143 q_c,
144 q_arith,
145 };
146 let logic = logic::VerifierKey { q_c, q_logic };
147 let range = range::VerifierKey { q_range };
148 let fixed_base = ecc::scalar_mul::fixed_base::VerifierKey {
149 q_l,
150 q_r,
151 q_fixed_group_add,
152 };
153
154 let variable_base = ecc::curve_addition::VerifierKey {
155 q_variable_group_add,
156 };
157
158 let lookup = lookup::VerifierKey {
159 q_lookup,
160 table_1,
161 table_2,
162 table_3,
163 table_4,
164 };
165
166 let permutation = permutation::VerifierKey {
167 left_sigma,
168 right_sigma,
169 out_sigma,
170 fourth_sigma,
171 };
172
173 let n = n as u32;
174
175 VerifierKey {
176 n,
177 arithmetic,
178 logic,
179 range,
180 fixed_base,
181 variable_base,
182 lookup,
183 permutation,
184 }
185 }
186}
187
188use crate::plonkup::MultiSet;
189use crate::{
190 error::Error,
191 fft::{EvaluationDomain, Evaluations, Polynomial},
192 transcript::TranscriptProtocol,
193};
194use dusk_bls12_381::BlsScalar;
195use merlin::Transcript;
196use sp_std::vec;
197use sp_std::vec::Vec;
198
199impl VerifierKey {
200 pub(crate) fn seed_transcript(&self, transcript: &mut Transcript) {
202 transcript.append_commitment(b"q_m", &self.arithmetic.q_m);
203 transcript.append_commitment(b"q_l", &self.arithmetic.q_l);
204 transcript.append_commitment(b"q_r", &self.arithmetic.q_r);
205 transcript.append_commitment(b"q_o", &self.arithmetic.q_o);
206 transcript.append_commitment(b"q_c", &self.arithmetic.q_c);
207 transcript.append_commitment(b"q_4", &self.arithmetic.q_4);
208 transcript.append_commitment(b"q_arith", &self.arithmetic.q_arith);
209 transcript.append_commitment(b"q_range", &self.range.q_range);
210 transcript.append_commitment(b"q_logic", &self.logic.q_logic);
211 transcript.append_commitment(
212 b"q_variable_group_add",
213 &self.variable_base.q_variable_group_add,
214 );
215 transcript.append_commitment(
216 b"q_fixed_group_add",
217 &self.fixed_base.q_fixed_group_add,
218 );
219
220 transcript
221 .append_commitment(b"left_sigma", &self.permutation.left_sigma);
222 transcript
223 .append_commitment(b"right_sigma", &self.permutation.right_sigma);
224 transcript.append_commitment(b"out_sigma", &self.permutation.out_sigma);
225 transcript
226 .append_commitment(b"fourth_sigma", &self.permutation.fourth_sigma);
227
228 transcript.circuit_domain_sep(self.n as u64);
230 }
231}
232
233#[derive(Debug, PartialEq, Eq, Clone)]
238pub struct ProverKey {
239 pub(crate) n: usize,
241 pub(crate) arithmetic: arithmetic::ProverKey,
243 pub(crate) logic: logic::ProverKey,
245 pub(crate) range: range::ProverKey,
247 pub(crate) fixed_base: ecc::scalar_mul::fixed_base::ProverKey,
249 pub(crate) variable_base: ecc::curve_addition::ProverKey,
251 pub(crate) lookup: lookup::ProverKey,
253 pub(crate) permutation: permutation::ProverKey,
255 pub(crate) v_h_coset_4n: Evaluations,
261}
262
263impl ProverKey {
264 const fn num_polys() -> usize {
266 15
267 }
268
269 const fn num_multiset() -> usize {
271 4
273 }
274
275 const fn num_evals() -> usize {
277 21
278 }
279
280 #[allow(unused_must_use)]
282 pub fn to_var_bytes(&self) -> Vec<u8> {
283 use dusk_bytes::Write;
284 let poly_size = self.arithmetic.q_m.0.len() * BlsScalar::SIZE;
286 let evals_size = self.arithmetic.q_m.1.evals.len() * BlsScalar::SIZE
288 + EvaluationDomain::SIZE;
289
290 let multiset_size = self.lookup.table_1.0 .0.len() * BlsScalar::SIZE
293 + poly_size
294 + evals_size;
295
296 let mut bytes = vec![
299 0u8;
300 (Self::num_polys() * poly_size
301 + evals_size * Self::num_evals()
302 + multiset_size * Self::num_multiset()
303 + 17 * u64::SIZE) as usize
304 ];
305
306 let mut writer = &mut bytes[..];
307 writer.write(&(self.n as u64).to_bytes());
308 writer.write(&(evals_size as u64).to_bytes());
310
311 writer.write(&(self.arithmetic.q_m.0.len() as u64).to_bytes());
313 writer.write(&self.arithmetic.q_m.0.to_var_bytes());
314 writer.write(&self.arithmetic.q_m.1.to_var_bytes());
315
316 writer.write(&(self.arithmetic.q_l.0.len() as u64).to_bytes());
317 writer.write(&self.arithmetic.q_l.0.to_var_bytes());
318 writer.write(&self.arithmetic.q_l.1.to_var_bytes());
319
320 writer.write(&(self.arithmetic.q_r.0.len() as u64).to_bytes());
321 writer.write(&self.arithmetic.q_r.0.to_var_bytes());
322 writer.write(&self.arithmetic.q_r.1.to_var_bytes());
323
324 writer.write(&(self.arithmetic.q_o.0.len() as u64).to_bytes());
325 writer.write(&self.arithmetic.q_o.0.to_var_bytes());
326 writer.write(&self.arithmetic.q_o.1.to_var_bytes());
327
328 writer.write(&(self.arithmetic.q_4.0.len() as u64).to_bytes());
329 writer.write(&self.arithmetic.q_4.0.to_var_bytes());
330 writer.write(&self.arithmetic.q_4.1.to_var_bytes());
331
332 writer.write(&(self.arithmetic.q_c.0.len() as u64).to_bytes());
333 writer.write(&self.arithmetic.q_c.0.to_var_bytes());
334 writer.write(&self.arithmetic.q_c.1.to_var_bytes());
335
336 writer.write(&(self.arithmetic.q_arith.0.len() as u64).to_bytes());
337 writer.write(&self.arithmetic.q_arith.0.to_var_bytes());
338 writer.write(&self.arithmetic.q_arith.1.to_var_bytes());
339
340 writer.write(&(self.logic.q_logic.0.len() as u64).to_bytes());
342 writer.write(&self.logic.q_logic.0.to_var_bytes());
343 writer.write(&self.logic.q_logic.1.to_var_bytes());
344
345 writer.write(&(self.range.q_range.0.len() as u64).to_bytes());
347 writer.write(&self.range.q_range.0.to_var_bytes());
348 writer.write(&self.range.q_range.1.to_var_bytes());
349
350 writer.write(
352 &(self.fixed_base.q_fixed_group_add.0.len() as u64).to_bytes(),
353 );
354 writer.write(&self.fixed_base.q_fixed_group_add.0.to_var_bytes());
355 writer.write(&self.fixed_base.q_fixed_group_add.1.to_var_bytes());
356
357 writer.write(
359 &(self.variable_base.q_variable_group_add.0.len() as u64)
360 .to_bytes(),
361 );
362 writer.write(&self.variable_base.q_variable_group_add.0.to_var_bytes());
363 writer.write(&self.variable_base.q_variable_group_add.1.to_var_bytes());
364
365 writer.write(&(self.lookup.q_lookup.0.len() as u64).to_bytes());
367 writer.write(&self.lookup.q_lookup.0.to_var_bytes());
368 writer.write(&self.lookup.q_lookup.1.to_var_bytes());
369
370 writer.write(&(self.lookup.table_1.0.len() as u64).to_bytes());
371 writer.write(&(self.lookup.table_1.0).to_var_bytes());
372 writer.write(&(self.lookup.table_1.1.len() as u64).to_bytes());
373 writer.write(&(self.lookup.table_1.1).to_var_bytes());
374 writer.write(&(self.lookup.table_1.2).to_var_bytes());
375
376 writer.write(&(self.lookup.table_2.0.len() as u64).to_bytes());
377 writer.write(&(self.lookup.table_2.0).to_var_bytes());
378 writer.write(&(self.lookup.table_2.1.len() as u64).to_bytes());
379 writer.write(&(self.lookup.table_2.1).to_var_bytes());
380 writer.write(&(self.lookup.table_2.2).to_var_bytes());
381
382 writer.write(&(self.lookup.table_3.0.len() as u64).to_bytes());
383 writer.write(&(self.lookup.table_3.0).to_var_bytes());
384 writer.write(&(self.lookup.table_3.1.len() as u64).to_bytes());
385 writer.write(&(self.lookup.table_3.1).to_var_bytes());
386 writer.write(&(self.lookup.table_3.2).to_var_bytes());
387
388 writer.write(&(self.lookup.table_4.0.len() as u64).to_bytes());
389 writer.write(&(self.lookup.table_4.0).to_var_bytes());
390 writer.write(&(self.lookup.table_4.1.len() as u64).to_bytes());
391 writer.write(&(self.lookup.table_4.1).to_var_bytes());
392 writer.write(&(self.lookup.table_4.2).to_var_bytes());
393
394 writer.write(&(self.permutation.left_sigma.0.len() as u64).to_bytes());
396 writer.write(&self.permutation.left_sigma.0.to_var_bytes());
397 writer.write(&self.permutation.left_sigma.1.to_var_bytes());
398
399 writer.write(&(self.permutation.right_sigma.0.len() as u64).to_bytes());
400 writer.write(&self.permutation.right_sigma.0.to_var_bytes());
401 writer.write(&self.permutation.right_sigma.1.to_var_bytes());
402
403 writer.write(&(self.permutation.out_sigma.0.len() as u64).to_bytes());
404 writer.write(&self.permutation.out_sigma.0.to_var_bytes());
405 writer.write(&self.permutation.out_sigma.1.to_var_bytes());
406
407 writer
408 .write(&(self.permutation.fourth_sigma.0.len() as u64).to_bytes());
409 writer.write(&self.permutation.fourth_sigma.0.to_var_bytes());
410 writer.write(&self.permutation.fourth_sigma.1.to_var_bytes());
411
412 writer.write(&self.permutation.linear_evaluations.to_var_bytes());
413
414 writer.write(&self.v_h_coset_4n.to_var_bytes());
415
416 bytes
417 }
418
419 pub fn from_slice(bytes: &[u8]) -> Result<ProverKey, Error> {
421 let mut buffer = bytes;
422 let n = u64::from_reader(&mut buffer)? as usize;
423 let evaluations_size = u64::from_reader(&mut buffer)? as usize;
424 let poly_from_reader = |buf: &mut &[u8]| -> Result<Polynomial, Error> {
430 let serialized_poly_len =
431 u64::from_reader(buf)? as usize * BlsScalar::SIZE;
432 if serialized_poly_len == 0 {
435 return Ok(Polynomial { coeffs: vec![] });
436 }
437 let (a, b) = buf.split_at(serialized_poly_len);
438 let poly = Polynomial::from_slice(a);
439 *buf = b;
440
441 poly
442 };
443
444 let evals_from_reader =
445 |buf: &mut &[u8]| -> Result<Evaluations, Error> {
446 let (a, b) = buf.split_at(evaluations_size);
447 let eval = Evaluations::from_slice(a);
448 *buf = b;
449
450 eval
451 };
452
453 let multiset_from_reader =
454 |buf: &mut &[u8]| -> Result<MultiSet, Error> {
455 let serialized_multiset_len =
456 u64::from_reader(buf)? as usize * BlsScalar::SIZE;
457 if serialized_multiset_len == 0 {
460 return Ok(MultiSet::new());
461 }
462 let (a, b) = buf.split_at(serialized_multiset_len);
463 let multiset = MultiSet::from_slice(a);
464 *buf = b;
465
466 multiset
467 };
468
469 let q_m_poly = poly_from_reader(&mut buffer)?;
470 let q_m_evals = evals_from_reader(&mut buffer)?;
471 let q_m = (q_m_poly, q_m_evals);
472
473 let q_l_poly = poly_from_reader(&mut buffer)?;
474 let q_l_evals = evals_from_reader(&mut buffer)?;
475 let q_l = (q_l_poly, q_l_evals);
476
477 let q_r_poly = poly_from_reader(&mut buffer)?;
478 let q_r_evals = evals_from_reader(&mut buffer)?;
479 let q_r = (q_r_poly, q_r_evals);
480
481 let q_o_poly = poly_from_reader(&mut buffer)?;
482 let q_o_evals = evals_from_reader(&mut buffer)?;
483 let q_o = (q_o_poly, q_o_evals);
484
485 let q_4_poly = poly_from_reader(&mut buffer)?;
486 let q_4_evals = evals_from_reader(&mut buffer)?;
487 let q_4 = (q_4_poly, q_4_evals);
488
489 let q_c_poly = poly_from_reader(&mut buffer)?;
490 let q_c_evals = evals_from_reader(&mut buffer)?;
491 let q_c = (q_c_poly, q_c_evals);
492
493 let q_arith_poly = poly_from_reader(&mut buffer)?;
494 let q_arith_evals = evals_from_reader(&mut buffer)?;
495 let q_arith = (q_arith_poly, q_arith_evals);
496
497 let q_logic_poly = poly_from_reader(&mut buffer)?;
498 let q_logic_evals = evals_from_reader(&mut buffer)?;
499 let q_logic = (q_logic_poly, q_logic_evals);
500
501 let q_range_poly = poly_from_reader(&mut buffer)?;
502 let q_range_evals = evals_from_reader(&mut buffer)?;
503 let q_range = (q_range_poly, q_range_evals);
504
505 let q_fixed_group_add_poly = poly_from_reader(&mut buffer)?;
506 let q_fixed_group_add_evals = evals_from_reader(&mut buffer)?;
507 let q_fixed_group_add =
508 (q_fixed_group_add_poly, q_fixed_group_add_evals);
509
510 let q_variable_group_add_poly = poly_from_reader(&mut buffer)?;
511 let q_variable_group_add_evals = evals_from_reader(&mut buffer)?;
512 let q_variable_group_add =
513 (q_variable_group_add_poly, q_variable_group_add_evals);
514
515 let q_lookup_poly = poly_from_reader(&mut buffer)?;
516 let q_lookup_evals = evals_from_reader(&mut buffer)?;
517 let q_lookup = (q_lookup_poly, q_lookup_evals);
518
519 let table_1_multiset = multiset_from_reader(&mut buffer)?;
520 let table_1_poly = poly_from_reader(&mut buffer)?;
521 let table_1_evals = evals_from_reader(&mut buffer)?;
522 let table_1 = (table_1_multiset, table_1_poly, table_1_evals);
523
524 let table_2_multiset = multiset_from_reader(&mut buffer)?;
525 let table_2_poly = poly_from_reader(&mut buffer)?;
526 let table_2_evals = evals_from_reader(&mut buffer)?;
527 let table_2 = (table_2_multiset, table_2_poly, table_2_evals);
528
529 let table_3_multiset = multiset_from_reader(&mut buffer)?;
530 let table_3_poly = poly_from_reader(&mut buffer)?;
531 let table_3_evals = evals_from_reader(&mut buffer)?;
532 let table_3 = (table_3_multiset, table_3_poly, table_3_evals);
533
534 let table_4_multiset = multiset_from_reader(&mut buffer)?;
535 let table_4_poly = poly_from_reader(&mut buffer)?;
536 let table_4_evals = evals_from_reader(&mut buffer)?;
537 let table_4 = (table_4_multiset, table_4_poly, table_4_evals);
538
539 let left_sigma_poly = poly_from_reader(&mut buffer)?;
540 let left_sigma_evals = evals_from_reader(&mut buffer)?;
541 let left_sigma = (left_sigma_poly, left_sigma_evals);
542
543 let right_sigma_poly = poly_from_reader(&mut buffer)?;
544 let right_sigma_evals = evals_from_reader(&mut buffer)?;
545 let right_sigma = (right_sigma_poly, right_sigma_evals);
546
547 let out_sigma_poly = poly_from_reader(&mut buffer)?;
548 let out_sigma_evals = evals_from_reader(&mut buffer)?;
549 let out_sigma = (out_sigma_poly, out_sigma_evals);
550
551 let fourth_sigma_poly = poly_from_reader(&mut buffer)?;
552 let fourth_sigma_evals = evals_from_reader(&mut buffer)?;
553 let fourth_sigma = (fourth_sigma_poly, fourth_sigma_evals);
554
555 let perm_linear_evaluations = evals_from_reader(&mut buffer)?;
556
557 let v_h_coset_4n = evals_from_reader(&mut buffer)?;
558
559 let arithmetic = arithmetic::ProverKey {
560 q_m,
561 q_l: q_l.clone(),
562 q_r: q_r.clone(),
563 q_o,
564 q_c: q_c.clone(),
565 q_4,
566 q_arith,
567 };
568
569 let logic = logic::ProverKey {
570 q_logic,
571 q_c: q_c.clone(),
572 };
573
574 let range = range::ProverKey { q_range };
575
576 let fixed_base = ecc::scalar_mul::fixed_base::ProverKey {
577 q_l,
578 q_r,
579 q_c,
580 q_fixed_group_add,
581 };
582
583 let permutation = permutation::ProverKey {
584 left_sigma,
585 right_sigma,
586 out_sigma,
587 fourth_sigma,
588 linear_evaluations: perm_linear_evaluations,
589 };
590
591 let variable_base = ecc::curve_addition::ProverKey {
592 q_variable_group_add,
593 };
594
595 let lookup = lookup::ProverKey {
596 q_lookup,
597 table_1,
598 table_2,
599 table_3,
600 table_4,
601 };
602
603 let prover_key = ProverKey {
604 n,
605 arithmetic,
606 logic,
607 range,
608 fixed_base,
609 variable_base,
610 lookup,
611 permutation,
612 v_h_coset_4n,
613 };
614
615 Ok(prover_key)
616 }
617
618 pub(crate) fn v_h_coset_4n(&self) -> &Evaluations {
619 &self.v_h_coset_4n
620 }
621}
622
623#[cfg(feature = "std")]
624#[cfg(test)]
625mod test {
626 use super::ProverKey;
627 use super::*;
628 use crate::fft::{EvaluationDomain, Evaluations, Polynomial};
629 use crate::plonkup::MultiSet;
630 use dusk_bls12_381::BlsScalar;
631 use rand_core::OsRng;
632 use sp_std::vec::Vec;
633
634 fn rand_poly_eval(n: usize) -> (Polynomial, Evaluations) {
635 let polynomial = Polynomial::rand(n, &mut OsRng);
636 (polynomial, rand_evaluations(n))
637 }
638
639 fn rand_evaluations(n: usize) -> Evaluations {
640 let domain = EvaluationDomain::new(4 * n).unwrap();
641 let values: Vec<_> =
642 (0..4 * n).map(|_| BlsScalar::random(&mut OsRng)).collect();
643
644 Evaluations::from_vec_and_domain(values, domain)
645 }
646
647 fn rand_multiset(n: usize) -> (MultiSet, Polynomial, Evaluations) {
648 let values: Vec<_> =
649 (0..n).map(|_| BlsScalar::random(&mut OsRng)).collect();
650 let multiset = MultiSet(values);
651 let polynomial = Polynomial::rand(n, &mut OsRng);
652 (multiset, polynomial, rand_evaluations(n))
653 }
654
655 #[test]
656 fn test_serialise_deserialise_prover_key() {
657 let n = 1 << 11;
658
659 let q_m = rand_poly_eval(n);
660 let q_l = rand_poly_eval(n);
661 let q_r = rand_poly_eval(n);
662 let q_o = rand_poly_eval(n);
663 let q_c = rand_poly_eval(n);
664 let q_4 = rand_poly_eval(n);
665 let q_arith = rand_poly_eval(n);
666
667 let q_logic = rand_poly_eval(n);
668
669 let q_range = rand_poly_eval(n);
670
671 let q_lookup = rand_poly_eval(n);
672
673 let q_fixed_group_add = rand_poly_eval(n);
674
675 let q_variable_group_add = rand_poly_eval(n);
676
677 let left_sigma = rand_poly_eval(n);
678 let right_sigma = rand_poly_eval(n);
679 let out_sigma = rand_poly_eval(n);
680 let fourth_sigma = rand_poly_eval(n);
681 let linear_evaluations = rand_evaluations(n);
682
683 let table_1 = rand_multiset(n);
684 let table_2 = rand_multiset(n);
685 let table_3 = rand_multiset(n);
686 let table_4 = rand_multiset(n);
687
688 let v_h_coset_4n = rand_evaluations(n);
689
690 let arithmetic = arithmetic::ProverKey {
691 q_m,
692 q_l: q_l.clone(),
693 q_r: q_r.clone(),
694 q_o,
695 q_c: q_c.clone(),
696 q_4,
697 q_arith,
698 };
699
700 let logic = logic::ProverKey {
701 q_logic,
702 q_c: q_c.clone(),
703 };
704
705 let range = range::ProverKey { q_range };
706
707 let lookup = lookup::ProverKey {
708 q_lookup,
709 table_1,
710 table_2,
711 table_3,
712 table_4,
713 };
714
715 let fixed_base = ecc::scalar_mul::fixed_base::ProverKey {
716 q_fixed_group_add,
717 q_l,
718 q_r,
719 q_c,
720 };
721
722 let permutation = permutation::ProverKey {
723 left_sigma,
724 right_sigma,
725 out_sigma,
726 fourth_sigma,
727 linear_evaluations,
728 };
729
730 let variable_base = ecc::curve_addition::ProverKey {
731 q_variable_group_add,
732 };
733
734 let prover_key = ProverKey {
735 n,
736 arithmetic,
737 logic,
738 fixed_base,
739 range,
740 variable_base,
741 lookup,
742 permutation,
743 v_h_coset_4n,
744 };
745
746 let prover_key_bytes = prover_key.to_var_bytes();
747 let pk = ProverKey::from_slice(&prover_key_bytes).unwrap();
748
749 assert_eq!(pk, prover_key);
750 assert_eq!(pk.to_var_bytes(), prover_key.to_var_bytes());
751 }
752
753 #[test]
754 fn test_serialise_deserialise_verifier_key() {
755 use crate::commitment_scheme::Commitment;
756 use dusk_bls12_381::G1Affine;
757
758 let n = 2usize.pow(5) as u32;
759
760 let q_m = Commitment(G1Affine::generator());
761 let q_l = Commitment(G1Affine::generator());
762 let q_r = Commitment(G1Affine::generator());
763 let q_o = Commitment(G1Affine::generator());
764 let q_c = Commitment(G1Affine::generator());
765 let q_4 = Commitment(G1Affine::generator());
766 let q_arith = Commitment(G1Affine::generator());
767
768 let q_range = Commitment(G1Affine::generator());
769
770 let q_fixed_group_add = Commitment(G1Affine::generator());
771 let q_variable_group_add = Commitment(G1Affine::generator());
772
773 let q_logic = Commitment(G1Affine::generator());
774 let q_lookup = Commitment(G1Affine::generator());
775
776 let left_sigma = Commitment(G1Affine::generator());
777 let right_sigma = Commitment(G1Affine::generator());
778 let out_sigma = Commitment(G1Affine::generator());
779 let fourth_sigma = Commitment(G1Affine::generator());
780
781 let table_1 = Commitment(G1Affine::generator());
782 let table_2 = Commitment(G1Affine::generator());
783 let table_3 = Commitment(G1Affine::generator());
784 let table_4 = Commitment(G1Affine::generator());
785
786 let arithmetic = arithmetic::VerifierKey {
787 q_m,
788 q_l,
789 q_r,
790 q_o,
791 q_c,
792 q_4,
793 q_arith,
794 };
795
796 let logic = logic::VerifierKey { q_logic, q_c };
797
798 let range = range::VerifierKey { q_range };
799
800 let lookup = lookup::VerifierKey {
801 q_lookup,
802 table_1,
803 table_2,
804 table_3,
805 table_4,
806 };
807
808 let fixed_base = ecc::scalar_mul::fixed_base::VerifierKey {
809 q_fixed_group_add,
810 q_l,
811 q_r,
812 };
813 let variable_base = ecc::curve_addition::VerifierKey {
814 q_variable_group_add,
815 };
816
817 let permutation = permutation::VerifierKey {
818 left_sigma,
819 right_sigma,
820 out_sigma,
821 fourth_sigma,
822 };
823
824 let verifier_key = VerifierKey {
825 n,
826 arithmetic,
827 logic,
828 range,
829 fixed_base,
830 variable_base,
831 lookup,
832 permutation,
833 };
834
835 let verifier_key_bytes = verifier_key.to_bytes();
836 let got = VerifierKey::from_bytes(&verifier_key_bytes).unwrap();
837
838 assert_eq!(got, verifier_key);
839 }
840}