27 #ifndef CRYPTO3_ZK_R1CS_GG_PPZKSNARK_BASIC_GENERATOR_HPP
28 #define CRYPTO3_ZK_R1CS_GG_PPZKSNARK_BASIC_GENERATOR_HPP
48 template<
typename CurveType, ProvingMode Mode = ProvingMode::Basic,
typename =
void>
57 template<
typename CurveType>
62 typedef typename CurveType::scalar_field_type scalar_field_type;
63 typedef typename CurveType::template g1_type<> g1_type;
64 typedef typename CurveType::template g2_type<> g2_type;
65 typedef typename CurveType::gt_type gt_type;
82 template<
typename DistributionType =
83 boost::random::uniform_int_distribution<typename scalar_field_type::integral_type>,
84 typename GeneratorType = boost::random::mt19937>
92 const typename scalar_field_type::value_type t =
93 algebra::random_element<scalar_field_type, DistributionType, GeneratorType>();
94 const typename scalar_field_type::value_type alpha =
95 algebra::random_element<scalar_field_type, DistributionType, GeneratorType>();
96 const typename scalar_field_type::value_type beta =
97 algebra::random_element<scalar_field_type, DistributionType, GeneratorType>();
98 const typename scalar_field_type::value_type gamma =
99 algebra::random_element<scalar_field_type, DistributionType, GeneratorType>();
100 const typename scalar_field_type::value_type delta =
101 algebra::random_element<scalar_field_type, DistributionType, GeneratorType>();
102 const typename scalar_field_type::value_type gamma_inverse = gamma.inversed();
103 const typename scalar_field_type::value_type delta_inverse = delta.inversed();
109 std::size_t non_zero_At = 0;
110 std::size_t non_zero_Bt = 0;
112 if (!qap.
At[i].is_zero()) {
115 if (!qap.
Bt[i].is_zero()) {
121 std::vector<typename scalar_field_type::value_type> At =
std::move(qap.
At);
122 std::vector<typename scalar_field_type::value_type> Bt =
std::move(qap.
Bt);
123 std::vector<typename scalar_field_type::value_type> Ct =
std::move(qap.
Ct);
124 std::vector<typename scalar_field_type::value_type> Ht =
std::move(qap.
Ht);
128 std::vector<typename scalar_field_type::value_type> gamma_ABC;
131 const typename scalar_field_type::value_type gamma_ABC_0 =
132 (beta * At[0] + alpha * Bt[0] + Ct[0]) * gamma_inverse;
133 for (std::size_t i = 1; i < qap.
num_inputs + 1; ++i) {
134 gamma_ABC.emplace_back((beta * At[i] + alpha * Bt[i] + Ct[i]) * gamma_inverse);
139 std::vector<typename scalar_field_type::value_type> Lt;
142 const std::size_t Lt_offset = qap.
num_inputs + 1;
144 Lt.emplace_back((beta * At[Lt_offset + i] + alpha * Bt[Lt_offset + i] + Ct[Lt_offset + i]) *
153 Ht.resize(Ht.size() - 2);
156 const std::size_t chunks = omp_get_max_threads();
159 const std::size_t chunks = 1;
162 const typename g1_type::value_type g1_generator = algebra::random_element<g1_type>();
164 const std::size_t g1_scalar_count = non_zero_At + non_zero_Bt + qap.
num_variables;
165 const std::size_t g1_scalar_size = scalar_field_type::value_bits;
166 const std::size_t g1_window_size = algebra::get_exp_window_size<g1_type>(g1_scalar_count);
169 algebra::get_window_table<g1_type>(g1_scalar_size, g1_window_size, g1_generator);
171 const typename g2_type::value_type G2_gen = algebra::random_element<g2_type>();
173 const std::size_t g2_scalar_count = non_zero_Bt;
174 const std::size_t g2_scalar_size = scalar_field_type::value_bits;
175 std::size_t g2_window_size = algebra::get_exp_window_size<g2_type>(g2_scalar_count);
178 algebra::get_window_table<g2_type>(g2_scalar_size, g2_window_size, G2_gen);
180 typename g1_type::value_type alpha_g1 = alpha * g1_generator;
181 typename g1_type::value_type beta_g1 = beta * g1_generator;
182 typename g2_type::value_type beta_g2 = beta * G2_gen;
183 typename g1_type::value_type delta_g1 = delta * g1_generator;
184 typename g2_type::value_type delta_g2 = delta * G2_gen;
186 typename std::vector<typename g1_type::value_type> A_query =
187 algebra::batch_exp<g1_type, scalar_field_type>(g1_scalar_size, g1_window_size, g1_table,
189 #ifdef USE_MIXED_ADDITION
190 algebra::batch_to_special<g1_type>(A_query);
194 kc_batch_exp<g2_type, g1_type, scalar_field_type>(
195 scalar_field_type::value_bits, g2_window_size, g1_window_size, g2_table, g1_table,
196 scalar_field_type::value_type::one(), scalar_field_type::value_type::one(), Bt, chunks);
201 typename std::vector<typename g1_type::value_type> H_query =
202 algebra::batch_exp_with_coeff<g1_type, scalar_field_type>(
203 g1_scalar_size, g1_window_size, g1_table, qap.
Zt * delta_inverse, Ht);
204 #ifdef USE_MIXED_ADDITION
205 algebra::batch_to_special<g1_type>(H_query);
208 typename std::vector<typename g1_type::value_type> L_query =
209 algebra::batch_exp<g1_type, scalar_field_type>(g1_scalar_size, g1_window_size, g1_table,
212 #ifdef USE_MIXED_ADDITION
213 algebra::batch_to_special<g1_type>(L_query);
216 typename gt_type::value_type alpha_g1_beta_g2 = pair_reduced<CurveType>(alpha_g1, beta_g2);
217 typename g2_type::value_type gamma_g2 = gamma * G2_gen;
219 typename g1_type::value_type gamma_ABC_g1_0 = gamma_ABC_0 * g1_generator;
221 typename std::vector<typename g1_type::value_type> gamma_ABC_g1_values =
222 algebra::batch_exp<g1_type, scalar_field_type>(g1_scalar_size, g1_window_size, g1_table,
225 typename g1_type::value_type gamma_g1 = gamma * g1_generator;
237 template<
typename KeyPairType,
238 typename DistributionType =
239 boost::random::uniform_int_distribution<typename scalar_field_type::integral_type>,
240 typename GeneratorType = boost::random::mt19937>
242 typename std::enable_if<std::is_same<keypair_type, KeyPairType>::value, KeyPairType>::type
245 auto [alpha_g1, beta_g1, beta_g2, delta_g1, delta_g2, gamma_g2, A_query, B_query, H_query,
246 L_query, r1cs_copy, alpha_g1_beta_g2, gamma_ABC_g1, gamma_g1] =
247 basic_process<DistributionType, GeneratorType>(constraint_system);
266 template<
typename KeyPairType,
267 typename DistributionType =
268 boost::random::uniform_int_distribution<typename scalar_field_type::integral_type>,
269 typename GeneratorType = boost::random::mt19937>
270 static inline typename std::enable_if<std::is_same<extended_keypair_type, KeyPairType>::value,
274 auto [alpha_g1, beta_g1, beta_g2, delta_g1, delta_g2, gamma_g2, A_query, B_query, H_query,
275 L_query, r1cs_copy, alpha_g1_beta_g2, gamma_ABC_g1, gamma_g1] =
276 basic_process<DistributionType, GeneratorType>(constraint_system);
279 alpha_g1_beta_g2, gamma_g2, delta_g2, delta_g1, gamma_ABC_g1, gamma_g1);
policy_type::auxiliary_input_type auxiliary_input_type
Definition: r1cs_gg_ppzksnark/generator.hpp:70
policy_type::extended_keypair_type extended_keypair_type
Definition: r1cs_gg_ppzksnark/generator.hpp:79
policy_type::extended_verification_key_type extended_verification_key_type
Definition: r1cs_gg_ppzksnark/generator.hpp:75
static auto basic_process(const constraint_system_type &constraint_system)
Definition: r1cs_gg_ppzksnark/generator.hpp:85
policy_type::proving_key_type proving_key_type
Definition: r1cs_gg_ppzksnark/generator.hpp:72
policy_type::processed_verification_key_type processed_verification_key_type
Definition: r1cs_gg_ppzksnark/generator.hpp:74
policy_type::processed_keypair_type processed_keypair_type
Definition: r1cs_gg_ppzksnark/generator.hpp:78
policy_type::primary_input_type primary_input_type
Definition: r1cs_gg_ppzksnark/generator.hpp:69
policy_type::proof_type proof_type
Definition: r1cs_gg_ppzksnark/generator.hpp:80
policy_type::verification_key_type verification_key_type
Definition: r1cs_gg_ppzksnark/generator.hpp:73
static std::enable_if< std::is_same< extended_keypair_type, KeyPairType >::value, KeyPairType >::type process(const constraint_system_type &constraint_system)
Definition: r1cs_gg_ppzksnark/generator.hpp:272
static std::enable_if< std::is_same< keypair_type, KeyPairType >::value, KeyPairType >::type process(const constraint_system_type &constraint_system)
Definition: r1cs_gg_ppzksnark/generator.hpp:243
policy_type::keypair_type keypair_type
Definition: r1cs_gg_ppzksnark/generator.hpp:77
policy_type::constraint_system_type constraint_system_type
Definition: r1cs_gg_ppzksnark/generator.hpp:68
Definition: r1cs_gg_ppzksnark/generator.hpp:49
std::vector< std::vector< typename GroupType::value_type > > window_table
Definition: multiexp.hpp:116
OutputIterator move(const SinglePassRange &rng, OutputIterator result)
Definition: move.hpp:45
ProvingMode
Definition: modes.hpp:33
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:78
r1cs_gg_ppzksnark_keypair< proving_key_type, verification_key_type > keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:135
r1cs_auxiliary_input< typename curve_type::scalar_field_type > auxiliary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:92
r1cs_primary_input< typename curve_type::scalar_field_type > primary_input_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:90
r1cs_gg_ppzksnark_keypair< proving_key_type, extended_verification_key_type > extended_keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:153
r1cs_gg_ppzksnark_keypair< proving_key_type, processed_verification_key_type > processed_keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/detail/basic_policy.hpp:144
std::vector< field_value_type > Ct
Definition: qap.hpp:196
std::size_t num_inputs
Definition: qap.hpp:190
std::vector< field_value_type > Bt
Definition: qap.hpp:196
std::vector< field_value_type > At
Definition: qap.hpp:196
field_value_type Zt
Definition: qap.hpp:198
std::size_t num_variables
Definition: qap.hpp:188
std::vector< field_value_type > Ht
Definition: qap.hpp:196
void swap_AB_if_beneficial()
Definition: r1cs.hpp:191
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:121
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:102
Definition: snark/systems/ppzksnark/r1cs_gg_ppzksnark/proof.hpp:40
Definition: systems/ppzksnark/r1cs_gg_ppzksnark/proving_key.hpp:39
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_gg_ppzksnark/verification_key.hpp:47
static qap_instance_evaluation< FieldType > instance_map_with_evaluation(const r1cs_constraint_system< FieldType > &cs, const typename FieldType::value_type &t)
Definition: r1cs_to_qap.hpp:140
Definition: sparse_vector.hpp:48