1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
use super::{
errors::{KZG10Errors, PolyCommitSchemeError},
key::{CommitKey, OpeningKey},
};
use crate::util;
use dusk_bls12_381::{G1Affine, G1Projective, G2Affine, G2Prepared};
use failure::Error;
use rand_core::RngCore;
#[derive(Debug)]
pub struct PublicParameters {
pub commit_key: CommitKey,
pub opening_key: OpeningKey,
}
impl PublicParameters {
pub fn setup<R: RngCore>(
max_degree: usize,
mut rng: &mut R,
) -> Result<PublicParameters, Error> {
if max_degree < 1 {
return Err(PolyCommitSchemeError(KZG10Errors::DegreeIsZero.into()).into());
}
let beta = util::random_scalar(&mut rng);
let powers_of_beta = util::powers_of(&beta, max_degree);
let g = util::random_g1_point(&mut rng);
let powers_of_g: Vec<G1Projective> =
util::slow_multiscalar_mul_single_base(&powers_of_beta, g);
assert_eq!(powers_of_g.len(), max_degree + 1);
let mut normalised_g = vec![G1Affine::identity(); max_degree + 1];
G1Projective::batch_normalize(&powers_of_g, &mut normalised_g);
let h: G2Affine = util::random_g2_point(&mut rng).into();
let beta_h: G2Affine = (h * beta).into();
let prepared_h: G2Prepared = G2Prepared::from(h);
let prepared_beta_h = G2Prepared::from(beta_h);
Ok(PublicParameters {
commit_key: CommitKey {
powers_of_g: normalised_g,
},
opening_key: OpeningKey {
g: g.into(),
h,
beta_h,
prepared_h,
prepared_beta_h,
},
})
}
pub fn trim(&self, truncated_degree: usize) -> Result<(CommitKey, OpeningKey), Error> {
let truncated_prover_key = self.commit_key.truncate(truncated_degree)?;
let opening_key = self.opening_key.clone();
Ok((truncated_prover_key, opening_key))
}
pub fn max_degree(&self) -> usize {
self.commit_key.max_degree()
}
}
#[cfg(test)]
mod test {
use super::*;
use dusk_bls12_381::Scalar;
#[test]
fn test_powers_of() {
let x = Scalar::from(10u64);
let degree = 100u64;
let powers_of_x = util::powers_of(&x, degree as usize);
for (i, x_i) in powers_of_x.iter().enumerate() {
assert_eq!(*x_i, x.pow(&[i as u64, 0, 0, 0]))
}
let last_element = powers_of_x.last().unwrap();
assert_eq!(*last_element, x.pow(&[degree, 0, 0, 0]))
}
}