26 #ifndef CRYPTO3_ZK_R1CS_SE_PPZKSNARK_BASIC_GENERATOR_HPP
27 #define CRYPTO3_ZK_R1CS_SE_PPZKSNARK_BASIC_GENERATOR_HPP
36 #include <nil/crypto3/zk/snark/schemes/ppzksnark/r1cs_se_ppzksnark/detail/basic_policy.hpp>
49 template<
typename CurveType>
53 using g1_type =
typename CurveType::template g1_type<>;
54 using g2_type =
typename CurveType::template g2_type<>;
72 const std::shared_ptr<math::evaluation_domain<typename CurveType::scalar_field_type>> domain =
75 typename CurveType::scalar_field_type::value_type t;
77 t = algebra::random_element<typename CurveType::scalar_field_type>();
78 }
while (domain->compute_vanishing_polynomial(t).is_zero());
82 typename CurveType::scalar_field_type>::instance_map_with_evaluation(constraint_system,
85 std::size_t non_zero_At = 0;
86 for (std::size_t i = 0; i < sap_inst.
num_variables + 1; ++i) {
87 if (!sap_inst.
At[i].is_zero()) {
92 std::vector<typename CurveType::scalar_field_type::value_type> At =
std::move(sap_inst.
At);
93 std::vector<typename CurveType::scalar_field_type::value_type> Ct =
std::move(sap_inst.
Ct);
94 std::vector<typename CurveType::scalar_field_type::value_type> Ht =
std::move(sap_inst.
Ht);
100 const typename CurveType::scalar_field_type::value_type
101 alpha = algebra::random_element<typename CurveType::scalar_field_type>(),
102 beta = algebra::random_element<typename CurveType::scalar_field_type>(),
103 gamma = algebra::random_element<typename CurveType::scalar_field_type>();
104 const typename g1_type::value_type G =
105 algebra::random_element<g1_type>();
106 const typename g2_type::value_type H =
107 algebra::random_element<g2_type>();
109 std::size_t G_exp_count = sap_inst.
num_inputs + 1
116 G_window = algebra::get_exp_window_size<g1_type>(G_exp_count);
119 algebra::get_window_table<g1_type>(CurveType::scalar_field_type::value_bits, G_window, G);
121 typename g2_type::value_type H_gamma = gamma * H;
122 std::size_t H_gamma_exp_count = non_zero_At,
124 algebra::get_exp_window_size<g2_type>(H_gamma_exp_count);
126 CurveType::scalar_field_type::value_bits, H_gamma_window, H_gamma);
128 typename g1_type::value_type G_alpha = alpha * G;
129 typename g2_type::value_type H_beta = beta * H;
131 std::vector<typename CurveType::scalar_field_type::value_type> tmp_exponents;
132 tmp_exponents.reserve(sap_inst.
num_inputs + 1);
133 for (std::size_t i = 0; i <= sap_inst.
num_inputs; ++i) {
134 tmp_exponents.emplace_back(gamma * Ct[i] + (alpha + beta) * At[i]);
136 typename std::vector<typename g1_type::value_type> verifier_query =
137 algebra::batch_exp<g1_type, typename CurveType::scalar_field_type>(
138 CurveType::scalar_field_type::value_bits, G_window, G_table, tmp_exponents);
139 tmp_exponents.clear();
142 for (std::size_t i = 0; i < At.size(); i++) {
143 tmp_exponents.emplace_back(gamma * At[i]);
146 typename std::vector<typename g1_type::value_type> A_query =
147 algebra::batch_exp<g1_type, typename CurveType::scalar_field_type>(
148 CurveType::scalar_field_type::value_bits, G_window, G_table, tmp_exponents);
149 tmp_exponents.clear();
150 #ifdef USE_MIXED_ADDITION
151 algebra::batch_to_special<g1_type>(A_query);
153 typename std::vector<typename g2_type::value_type> B_query =
154 algebra::batch_exp<g2_type, typename CurveType::scalar_field_type>(
155 CurveType::scalar_field_type::value_bits, H_gamma_window, H_gamma_table, At);
156 #ifdef USE_MIXED_ADDITION
157 algebra::batch_to_special<g2_type>(B_query);
159 typename g1_type::value_type G_gamma = gamma * G;
160 typename g1_type::value_type G_gamma_Z = sap_inst.
Zt * G_gamma;
161 typename g2_type::value_type H_gamma_Z = sap_inst.
Zt * H_gamma;
162 typename g1_type::value_type G_ab_gamma_Z = (alpha + beta) * G_gamma_Z;
163 typename g1_type::value_type G_gamma2_Z2 = (sap_inst.
Zt * gamma) * G_gamma_Z;
165 tmp_exponents.reserve(sap_inst.
degree + 1);
168 typename CurveType::scalar_field_type::value_type gamma2_Z_t = sap_inst.
Zt * gamma.squared();
169 for (std::size_t i = 0; i < sap_inst.
degree + 1; ++i) {
170 tmp_exponents.emplace_back(gamma2_Z_t);
173 typename std::vector<typename g1_type::value_type> G_gamma2_Z_t =
174 algebra::batch_exp<g1_type, typename CurveType::scalar_field_type>(
175 CurveType::scalar_field_type::value_bits, G_window, G_table, tmp_exponents);
176 tmp_exponents.clear();
177 #ifdef USE_MIXED_ADDITION
178 algebra::batch_to_special<g1_type>(G_gamma2_Z_t);
182 tmp_exponents.emplace_back(gamma * (gamma * Ct[i] + (alpha + beta) * At[i]));
184 typename std::vector<typename g1_type::value_type> C_query_1 =
185 algebra::batch_exp<g1_type, typename CurveType::scalar_field_type>(
186 CurveType::scalar_field_type::value_bits, G_window, G_table, tmp_exponents);
187 tmp_exponents.clear();
188 #ifdef USE_MIXED_ADDITION
189 algebra::batch_to_special<g1_type>(C_query_1);
193 typename CurveType::scalar_field_type::value_type double_gamma2_Z = gamma * gamma * sap_inst.
Zt;
194 double_gamma2_Z = double_gamma2_Z + double_gamma2_Z;
196 tmp_exponents.emplace_back(double_gamma2_Z * At[i]);
198 typename std::vector<typename g1_type::value_type> C_query_2 =
199 algebra::batch_exp<g1_type, typename CurveType::scalar_field_type>(
200 CurveType::scalar_field_type::value_bits, G_window, G_table, tmp_exponents);
201 tmp_exponents.clear();
202 #ifdef USE_MIXED_ADDITION
203 algebra::batch_to_special<g1_type>(C_query_2);
213 std::move(C_query_2), G_gamma_Z, H_gamma_Z, G_ab_gamma_Z, G_gamma2_Z2,
Definition: r1cs_se_ppzksnark/generator.hpp:50
policy_type::constraint_system_type constraint_system_type
Definition: r1cs_se_ppzksnark/generator.hpp:59
policy_type::verification_key_type verification_key_type
Definition: r1cs_se_ppzksnark/generator.hpp:62
static keypair_type process(const constraint_system_type &constraint_system)
Definition: r1cs_se_ppzksnark/generator.hpp:66
policy_type::proving_key_type proving_key_type
Definition: r1cs_se_ppzksnark/generator.hpp:61
policy_type::keypair_type keypair_type
Definition: r1cs_se_ppzksnark/generator.hpp:64
CurveType curve_type
Definition: r1cs_se_ppzksnark/generator.hpp:57
Definition: systems/ppzksnark/r1cs_se_ppzksnark/proving_key.hpp:39
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_se_ppzksnark/verification_key.hpp:40
Definition: r1cs_to_sap.hpp:64
static std::shared_ptr< math::evaluation_domain< FieldType > > get_domain(const r1cs_constraint_system< FieldType > &cs)
Definition: r1cs_to_sap.hpp:81
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
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_se_ppzksnark/detail/basic_policy.hpp:82
r1cs_se_ppzksnark_keypair< proving_key_type, verification_key_type > keypair_type
Definition: zk/include/nil/crypto3/zk/snark/systems/ppzksnark/r1cs_se_ppzksnark/detail/basic_policy.hpp:126
std::vector< typename FieldType::value_type > At
Definition: sap.hpp:183
std::size_t num_inputs
Definition: sap.hpp:177
FieldType::value_type Zt
Definition: sap.hpp:185
std::vector< typename FieldType::value_type > Ct
Definition: sap.hpp:183
std::size_t degree
Definition: sap.hpp:176
std::size_t num_variables
Definition: sap.hpp:175
std::vector< typename FieldType::value_type > Ht
Definition: sap.hpp:183