Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
bls12_377_precomputation.hpp
Go to the documentation of this file.
1 
9 #ifndef LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_PRECOMPUTATION_HPP_
10 #define LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_PRECOMPUTATION_HPP_
11 
12 namespace libsnark
13 {
14 
15 template<typename ppT> class bls12_377_G1_precomputation
16 {
17 public:
18  using FieldT = libff::Fr<ppT>;
19 
20  std::shared_ptr<pb_linear_combination<FieldT>> _Px;
21  std::shared_ptr<pb_linear_combination<FieldT>> _Py;
22 
23  // Pointers _Px and _Py are assigned in the constructor of the
24  // precompute_G1_gadget. Until that is called, no reference should be made
25  // to these members.
27 
28  // Construct a populated G1_precomputation from a value. All terms are
29  // created as constants, requiring no new gates in the circuit.
32  const libff::G1<other_curve<ppT>> &P_val,
33  const std::string &annotation_prefix);
34 };
35 
38 template<typename ppT> class bls12_377_G2_proj
39 {
40 public:
44 
46  protoboard<libff::Fr<ppT>> &pb, const std::string &annotation_prefix);
47 
49  const Fqe_variable<ppT> &X_var,
50  const Fqe_variable<ppT> &Y_var,
51  const Fqe_variable<ppT> &Z_var);
52 
53  void generate_r1cs_witness(const libff::bls12_377_G2 &element);
54 };
55 
58 template<typename ppT> class bls12_377_ate_ell_coeffs
59 {
60 public:
61  using FqT = libff::Fq<other_curve<ppT>>;
62 
66 
68  protoboard<FqT> &pb, const std::string &annotation_prefix);
69 
70  // Create from constants
72  protoboard<FqT> &pb,
73  const libff::Fqe<other_curve<ppT>> ell_0_val,
74  const libff::Fqe<other_curve<ppT>> ell_vw_val,
75  const libff::Fqe<other_curve<ppT>> ell_vv_val,
76  const std::string &annotation_prefix);
77 };
78 
79 template<typename ppT> class bls12_377_G2_precomputation
80 {
81 public:
82  using FieldT = libff::Fr<ppT>;
83 
84  std::vector<std::shared_ptr<bls12_377_ate_ell_coeffs<ppT>>> _coeffs;
85 
87 
88  // Construct a populated G2_precomputation from a value. All terms are
89  // created as constants, requiring no new gates in the circuit.
92  const libff::G2<other_curve<ppT>> &Q_val,
93  const std::string &annotation_prefix);
94 };
95 
96 template<typename ppT>
97 class bls12_377_G1_precompute_gadget : public gadget<libff::Fr<ppT>>
98 {
99 public:
100  using FieldT = libff::Fr<ppT>;
101 
102  std::shared_ptr<pb_linear_combination<FieldT>> _Px;
103  std::shared_ptr<pb_linear_combination<FieldT>> _Py;
104 
106  protoboard<libff::Fr<ppT>> &pb,
107  const G1_variable<ppT> &P,
109  const std::string &annotation_prefix);
110 
112  void generate_r1cs_witness();
113 };
114 
119 template<typename ppT>
120 class bls12_377_ate_dbl_gadget : public gadget<libff::Fr<ppT>>
121 {
122 public:
123  typedef libff::Fq<other_curve<ppT>> FqT;
124  typedef libff::Fqe<other_curve<ppT>> FqeT;
125 
129 
130  // TODO: Many of these intermediate Fqe_variables are only for clarity and
131  // replicate the references held by other gadgets (e.g. `A` refers to the
132  // same variable as `check_A.result`. Do an optimization pass and remove
133  // some of the redundancy.
134 
135  // A = R.X * R.Y / 2
137 
138  // B = R.Y^2
140 
141  // C = R.Z^2
143 
144  // D = 3 * C
145  // E = b' * D
146  // F = 3 * E
147  // G = (B + F) / 2
148 
149  // ell_vw = -H
150  // where
151  // H = (Y + 2) ^ 2 - (B + C)
152  // ell_vw = (B+C) - (Y+2)^2
153  // <=> (Y+2)^2 [H] = ell_vw - B - C
155 
156  // I = E - B
157 
158  // ell_vv = 3 * J
159  // where
160  // J = Rx^2
161  // ell_vv = 3 * Rx^2
162  // <=> Rx^2 [J] = ell_vv * 3^{-1}
164 
165  // out_R.X = A * (B - F)
167 
168  // out_R.Y = G^2 - 3 * E^2
169  // <=> G^2 = outRy + 3*E^2
172 
173  // out_R.Z = B * H
175 
178  const bls12_377_G2_proj<ppT> &R,
179  const bls12_377_G2_proj<ppT> &out_R,
180  const bls12_377_ate_ell_coeffs<ppT> &coeffs,
181  const std::string &annotation_prefix);
182 
184  void generate_r1cs_witness();
185 };
186 
187 template<typename ppT>
188 class bls12_377_ate_add_gadget : public gadget<libff::Fr<ppT>>
189 {
190 public:
191  typedef libff::Fq<other_curve<ppT>> FqT;
192  typedef libff::Fqe<other_curve<ppT>> FqeT;
193 
199 
200  // ell_vv = -theta
201  // where
202  // theta = R.Y - A
203  // A = Q_Y * R.Z;
204  // <=> A = Q_Y * R.Z = ell_vv + Ry
206  // ell_vw = lambda
207  // where
208  // lambda = R.X - B
209  // B = Q_X * R.Z
210  // <=> B = Q_X * R.Z = R.X - ell_vw
212  // theta = R.Y - A = -ell_vv
213  // Fqe_variable<ppT> _theta
214  // lambda = R.X - B = ell_vw
215  // Fqe_variable<ppT> lambda
216  // C = theta.squared() = ell_vv^2
218  // D = lambda.squared() = ell_vw^2
220  // E = lambda * D;
222  // F = R.Z * C;
224  // G = R.X * D;
226  // H = E + F - (G + G);
228  // I = R.Y * E;
230  // out_coeffs.ell_0 = xi * J
231  // where
232  // J = theta * Q_X - lambda * Q_Y
233  // <=> lambda * Q_Y = theta * Q_X - ell_0 * xi^{-1}
236 
237  // out_R.X = lambda * H = ell_vw * H
239  // out_R.Y = theta * (G - H) - I = -ell_vv * (G-H) - I
240  // <=> ell_vv * (H-G) = out_R.Y + I
242  // out_R.Z = Z1 * E;
244 
246  protoboard<libff::Fr<ppT>> &pb,
247  const Fqe_variable<ppT> &Q_X,
248  const Fqe_variable<ppT> &Q_Y,
249  const bls12_377_G2_proj<ppT> &R,
250  const bls12_377_G2_proj<ppT> &out_R,
251  const bls12_377_ate_ell_coeffs<ppT> &coeffs,
252  const std::string &annotation_prefix);
253 
255  void generate_r1cs_witness();
256 };
257 
260 template<typename ppT>
261 class bls12_377_G2_precompute_gadget : public gadget<libff::Fr<ppT>>
262 {
263 public:
264  using FqeT = libff::Fqe<other_curve<ppT>>;
265 
267  std::vector<std::shared_ptr<bls12_377_ate_dbl_gadget<ppT>>> _ate_dbls;
268  std::vector<std::shared_ptr<bls12_377_ate_add_gadget<ppT>>> _ate_adds;
269 
271  protoboard<libff::Fr<ppT>> &pb,
272  const G2_variable<ppT> &Q,
274  const std::string &annotation_prefix);
275 
277  void generate_r1cs_witness();
278 };
279 
280 } // namespace libsnark
281 
283 
284 #endif // LIBSNARK_GADGETLIB1_GADGETS_PAIRING_BW6_761_BLS12_377_BLS12_377_PAIRING_HPP_
libsnark::bls12_377_G2_precompute_gadget::_R0
bls12_377_G2_proj< ppT > _R0
Definition: bls12_377_precomputation.hpp:266
libsnark::bls12_377_ate_dbl_gadget::FqT
libff::Fq< other_curve< ppT > > FqT
Definition: bls12_377_precomputation.hpp:123
libsnark::gadget< libff::Fr< ppT > >::annotation_prefix
const std::string annotation_prefix
Definition: gadget.hpp:20
libsnark::G2_variable
Gadget that represents a G2 variable.
Definition: weierstrass_g2_gadget.hpp:31
libsnark::bls12_377_ate_add_gadget::bls12_377_ate_add_gadget
bls12_377_ate_add_gadget(protoboard< libff::Fr< ppT >> &pb, const Fqe_variable< ppT > &Q_X, const Fqe_variable< ppT > &Q_Y, const bls12_377_G2_proj< ppT > &R, const bls12_377_G2_proj< ppT > &out_R, const bls12_377_ate_ell_coeffs< ppT > &coeffs, const std::string &annotation_prefix)
libsnark::bls12_377_ate_add_gadget::_compute_G
Fqe_mul_gadget< ppT > _compute_G
Definition: bls12_377_precomputation.hpp:225
libsnark::bls12_377_ate_dbl_gadget::_compute_C
Fqe_sqr_gadget< ppT > _compute_C
Definition: bls12_377_precomputation.hpp:142
libsnark::bls12_377_G1_precomputation::_Px
std::shared_ptr< pb_linear_combination< FieldT > > _Px
Definition: bls12_377_precomputation.hpp:20
libsnark::bls12_377_ate_dbl_gadget::_check_out_Rz
Fqe_mul_gadget< ppT > _check_out_Rz
Definition: bls12_377_precomputation.hpp:174
libsnark::bls12_377_G2_proj::bls12_377_G2_proj
bls12_377_G2_proj(protoboard< libff::Fr< ppT >> &pb, const std::string &annotation_prefix)
libsnark::bls12_377_ate_ell_coeffs::FqT
libff::Fq< other_curve< ppT > > FqT
Definition: bls12_377_precomputation.hpp:61
libsnark::bls12_377_G1_precompute_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_ate_add_gadget::_compute_theta_times_Qx
Fqe_mul_gadget< ppT > _compute_theta_times_Qx
Definition: bls12_377_precomputation.hpp:234
libsnark
Definition: accumulation_vector.hpp:18
libsnark::bls12_377_ate_add_gadget::_out_coeffs
bls12_377_ate_ell_coeffs< ppT > _out_coeffs
Definition: bls12_377_precomputation.hpp:198
libsnark::bls12_377_ate_dbl_gadget::_compute_B
Fqe_sqr_gadget< ppT > _compute_B
Definition: bls12_377_precomputation.hpp:139
libsnark::bls12_377_G2_precompute_gadget
Definition: bls12_377_precomputation.hpp:261
libsnark::bls12_377_ate_ell_coeffs
Definition: bls12_377_precomputation.hpp:58
libsnark::bls12_377_G1_precompute_gadget::_Px
std::shared_ptr< pb_linear_combination< FieldT > > _Px
Definition: bls12_377_precomputation.hpp:102
libsnark::bls12_377_G1_precompute_gadget
Definition: bls12_377_precomputation.hpp:97
libsnark::bls12_377_ate_dbl_gadget::FqeT
libff::Fqe< other_curve< ppT > > FqeT
Definition: bls12_377_precomputation.hpp:124
libsnark::bls12_377_ate_add_gadget::FqeT
libff::Fqe< other_curve< ppT > > FqeT
Definition: bls12_377_precomputation.hpp:192
libsnark::bls12_377_ate_dbl_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::gadget< libff::Fr< ppT > >::pb
protoboard< libff::Fr< ppT > > & pb
Definition: gadget.hpp:19
libsnark::bls12_377_ate_add_gadget::_compute_D
Fqe_sqr_gadget< ppT > _compute_D
Definition: bls12_377_precomputation.hpp:219
libsnark::bls12_377_ate_add_gadget::_compute_C
Fqe_sqr_gadget< ppT > _compute_C
Definition: bls12_377_precomputation.hpp:217
libsnark::bls12_377_ate_add_gadget::_compute_E
Fqe_mul_gadget< ppT > _compute_E
Definition: bls12_377_precomputation.hpp:221
libsnark::bls12_377_ate_dbl_gadget::_in_R
bls12_377_G2_proj< ppT > _in_R
Definition: bls12_377_precomputation.hpp:126
libsnark::bls12_377_G2_proj::Y
Fqe_variable< ppT > Y
Definition: bls12_377_precomputation.hpp:42
libsnark::bls12_377_G2_precompute_gadget::_ate_adds
std::vector< std::shared_ptr< bls12_377_ate_add_gadget< ppT > > > _ate_adds
Definition: bls12_377_precomputation.hpp:268
libsnark::bls12_377_G2_precomputation::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_precomputation.hpp:82
libsnark::bls12_377_ate_add_gadget::_check_out_Rz
Fqe_mul_gadget< ppT > _check_out_Rz
Definition: bls12_377_precomputation.hpp:243
libsnark::bls12_377_ate_dbl_gadget::bls12_377_ate_dbl_gadget
bls12_377_ate_dbl_gadget(protoboard< FqT > &pb, const bls12_377_G2_proj< ppT > &R, const bls12_377_G2_proj< ppT > &out_R, const bls12_377_ate_ell_coeffs< ppT > &coeffs, const std::string &annotation_prefix)
libsnark::bls12_377_G2_precompute_gadget::FqeT
libff::Fqe< other_curve< ppT > > FqeT
Definition: bls12_377_precomputation.hpp:264
libsnark::bls12_377_ate_dbl_gadget::_compute_Y_plus_Z_squared
Fqe_sqr_gadget< ppT > _compute_Y_plus_Z_squared
Definition: bls12_377_precomputation.hpp:154
libsnark::gadget
Definition: gadget.hpp:16
libsnark::bls12_377_G2_proj::Z
Fqe_variable< ppT > Z
Definition: bls12_377_precomputation.hpp:43
libsnark::bls12_377_G2_precomputation::_coeffs
std::vector< std::shared_ptr< bls12_377_ate_ell_coeffs< ppT > > > _coeffs
Definition: bls12_377_precomputation.hpp:84
libsnark::bls12_377_ate_dbl_gadget::_compute_A
Fqe_mul_gadget< ppT > _compute_A
Definition: bls12_377_precomputation.hpp:136
libsnark::Fqe_sqr_gadget
typename pairing_selector< ppT >::Fqe_sqr_gadget_type Fqe_sqr_gadget
Definition: pairing_params.hpp:105
libsnark::bls12_377_G1_precomputation::_Py
std::shared_ptr< pb_linear_combination< FieldT > > _Py
Definition: bls12_377_precomputation.hpp:21
libsnark::bls12_377_ate_add_gadget::_Q_X
Fqe_variable< ppT > _Q_X
Definition: bls12_377_precomputation.hpp:194
libsnark::bls12_377_ate_add_gadget::_Q_Y
Fqe_variable< ppT > _Q_Y
Definition: bls12_377_precomputation.hpp:195
libsnark::bls12_377_G1_precompute_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_ate_add_gadget::_in_R
bls12_377_G2_proj< ppT > _in_R
Definition: bls12_377_precomputation.hpp:196
libsnark::bls12_377_ate_add_gadget::_compute_F
Fqe_mul_gadget< ppT > _compute_F
Definition: bls12_377_precomputation.hpp:223
libsnark::bls12_377_ate_ell_coeffs::ell_vv
Fqe_variable< ppT > ell_vv
Definition: bls12_377_precomputation.hpp:65
libsnark::bls12_377_ate_ell_coeffs::bls12_377_ate_ell_coeffs
bls12_377_ate_ell_coeffs(protoboard< FqT > &pb, const std::string &annotation_prefix)
libsnark::bls12_377_G2_precompute_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_ate_dbl_gadget::_compute_E_squared
Fqe_sqr_gadget< ppT > _compute_E_squared
Definition: bls12_377_precomputation.hpp:170
libsnark::bls12_377_ate_add_gadget
Definition: bls12_377_precomputation.hpp:188
libsnark::bls12_377_ate_add_gadget::_H
Fqe_variable< ppT > _H
Definition: bls12_377_precomputation.hpp:227
libsnark::bls12_377_G2_precompute_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_ate_dbl_gadget
Definition: bls12_377_precomputation.hpp:120
bls12_377_precomputation.tcc
libsnark::Fqe_mul_gadget
typename pairing_selector< ppT >::Fqe_mul_gadget_type Fqe_mul_gadget
Definition: pairing_params.hpp:98
libsnark::bls12_377_ate_add_gadget::_check_out_Ry
Fqe_mul_gadget< ppT > _check_out_Ry
Definition: bls12_377_precomputation.hpp:241
libsnark::bls12_377_ate_add_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_ate_add_gadget::_compute_lambda_times_Qy
Fqe_mul_gadget< ppT > _compute_lambda_times_Qy
Definition: bls12_377_precomputation.hpp:235
libsnark::bls12_377_ate_add_gadget::_check_out_Rx
Fqe_mul_gadget< ppT > _check_out_Rx
Definition: bls12_377_precomputation.hpp:238
libsnark::bls12_377_ate_dbl_gadget::_compute_J
Fqe_sqr_gadget< ppT > _compute_J
Definition: bls12_377_precomputation.hpp:163
libsnark::bls12_377_ate_add_gadget::_out_R
bls12_377_G2_proj< ppT > _out_R
Definition: bls12_377_precomputation.hpp:197
libsnark::G1_variable
Gadget that represents a G1 variable.
Definition: weierstrass_g1_gadget.hpp:28
libsnark::bls12_377_ate_dbl_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::bls12_377_G2_precompute_gadget::bls12_377_G2_precompute_gadget
bls12_377_G2_precompute_gadget(protoboard< libff::Fr< ppT >> &pb, const G2_variable< ppT > &Q, bls12_377_G2_precomputation< ppT > &Q_prec, const std::string &annotation_prefix)
libsnark::bls12_377_G2_precomputation
Definition: bls12_377_precomputation.hpp:79
libsnark::bls12_377_ate_dbl_gadget::_check_out_Rx
Fqe_mul_gadget< ppT > _check_out_Rx
Definition: bls12_377_precomputation.hpp:166
libsnark::Fqe_variable
typename pairing_selector< ppT >::Fqe_variable_type Fqe_variable
Definition: pairing_params.hpp:95
libsnark::bls12_377_G1_precompute_gadget::bls12_377_G1_precompute_gadget
bls12_377_G1_precompute_gadget(protoboard< libff::Fr< ppT >> &pb, const G1_variable< ppT > &P, bls12_377_G1_precomputation< ppT > &P_prec, const std::string &annotation_prefix)
libsnark::bls12_377_ate_add_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::bls12_377_ate_dbl_gadget::_compute_G_squared
Fqe_sqr_gadget< ppT > _compute_G_squared
Definition: bls12_377_precomputation.hpp:171
libsnark::bls12_377_G2_precomputation::bls12_377_G2_precomputation
bls12_377_G2_precomputation()
libsnark::other_curve
typename pairing_selector< ppT >::other_curve_type other_curve
Definition: pairing_params.hpp:117
libsnark::bls12_377_ate_add_gadget::FqT
libff::Fq< other_curve< ppT > > FqT
Definition: bls12_377_precomputation.hpp:191
libsnark::bls12_377_G1_precomputation::bls12_377_G1_precomputation
bls12_377_G1_precomputation()
libsnark::bls12_377_G2_proj
Definition: bls12_377_precomputation.hpp:38
libsnark::bls12_377_ate_add_gadget::_compute_B
Fqe_mul_gadget< ppT > _compute_B
Definition: bls12_377_precomputation.hpp:211
libsnark::bls12_377_G1_precompute_gadget::_Py
std::shared_ptr< pb_linear_combination< FieldT > > _Py
Definition: bls12_377_precomputation.hpp:103
libsnark::bls12_377_ate_dbl_gadget::_out_coeffs
bls12_377_ate_ell_coeffs< ppT > _out_coeffs
Definition: bls12_377_precomputation.hpp:128
libsnark::bls12_377_ate_ell_coeffs::ell_vw
Fqe_variable< ppT > ell_vw
Definition: bls12_377_precomputation.hpp:64
libsnark::bls12_377_ate_dbl_gadget::_out_R
bls12_377_G2_proj< ppT > _out_R
Definition: bls12_377_precomputation.hpp:127
libsnark::bls12_377_ate_add_gadget::_compute_I
Fqe_mul_gadget< ppT > _compute_I
Definition: bls12_377_precomputation.hpp:229
libsnark::bls12_377_G2_precompute_gadget::_ate_dbls
std::vector< std::shared_ptr< bls12_377_ate_dbl_gadget< ppT > > > _ate_dbls
Definition: bls12_377_precomputation.hpp:267
libsnark::bls12_377_G1_precomputation
Definition: bls12_377_precomputation.hpp:15
libsnark::bls12_377_G2_proj::generate_r1cs_witness
void generate_r1cs_witness(const libff::bls12_377_G2 &element)
libsnark::bls12_377_ate_add_gadget::_compute_A
Fqe_mul_gadget< ppT > _compute_A
Definition: bls12_377_precomputation.hpp:205
libsnark::bls12_377_G2_proj::X
Fqe_variable< ppT > X
Definition: bls12_377_precomputation.hpp:41
libsnark::bls12_377_G1_precompute_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_precomputation.hpp:100
libsnark::bls12_377_G1_precomputation::FieldT
libff::Fr< ppT > FieldT
Definition: bls12_377_precomputation.hpp:18
libsnark::bls12_377_ate_ell_coeffs::ell_0
Fqe_variable< ppT > ell_0
Definition: bls12_377_precomputation.hpp:63
libsnark::protoboard
Definition: pb_variable.hpp:22