Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
kzg10_verifier_gadget.hpp
Go to the documentation of this file.
1 
9 #ifndef LIBSNARK_GADGETLIB1_GADGETS_VERIFIERS_KZG10_VERIFIER_GADGET_HPP_
10 #define LIBSNARK_GADGETLIB1_GADGETS_VERIFIERS_KZG10_VERIFIER_GADGET_HPP_
11 
17 
25 
26 namespace libsnark
27 {
28 
31 template<typename ppT> class kzg10_srs_variable
32 {
33 public:
35 
36  std::vector<G1_variable<ppT>> alpha_powers_g1;
38 
40  protoboard<libff::Fr<ppT>> &pb,
41  const size_t max_degree,
42  const std::string &annotation_prefix);
43 
44  void generate_r1cs_witness(const typename kzg10<npp>::srs &srs);
45 };
46 
49 template<typename ppT> using kzg10_commitment_variable = G1_variable<ppT>;
50 
53 template<typename ppT> using kzg10_witness_variable = G1_variable<ppT>;
54 
62 template<typename ppT>
63 class kzg10_verifier_gadget : public gadget<libff::Fr<ppT>>
64 {
65 public:
66  using FieldT = libff::Fr<ppT>;
67 
68  // From kzg10.tcc: We verify the equality:
69  //
70  // \psi(\alpha) (\alpha - i) = \phi(\alpha) - \phi(i)
71  // = commit - phi_i
72  //
73  // via the pairing equality:
74  //
75  // e([\psi(\alpha)]_1, [\alpha - i]_2) = e(commit - [phi_i]_1, [1]_2)
76  //
77  // We use check_e_equals_e_gadget to check that:
78  // e(A, B) = e(C, D)
79  // where:
80  // A = witness
81  // B = srs.alpha_g2 - i * G2::one()
82  // C = commit - poly_eval * G1::one()
83  // D = G2::one()
84 
85  // B = srs.alpha_g2 - i * G2::one()
90 
91  // C = commit - poly_eval * G1::one()
96 
97  // Pairing computation
104  // D_precomp is computed from (constant) G2::one(), and baked into the
105  // circuit, saving a few constraints.
107 
110 
111  // group_elements_non_zero =
112  // (1 - i_in_G2.is_zero) * (1 - poly_eval_in_G1.is_zero)
114 
115  // result = group_elements_non_zero * check_result
117 
119  protoboard<libff::Fr<ppT>> &pb,
120  const kzg10_srs_variable<ppT> &srs,
121  const kzg10_commitment_variable<ppT> &commitmennt,
122  pb_linear_combination<libff::Fr<ppT>> i,
123  pb_linear_combination<libff::Fr<ppT>> poly_eval,
124  const kzg10_witness_variable<ppT> &witness,
125  pb_variable<libff::Fr<ppT>> result,
126  const std::string &annotation_prefix);
127 
129  void generate_r1cs_witness();
130 };
131 
132 } // namespace libsnark
133 
135 
136 #endif // LIBSNARK_GADGETLIB1_GADGETS_VERIFIERS_KZG10_VERIFIER_GADGET_HPP_
libsnark::kzg10_verifier_gadget::generate_r1cs_witness
void generate_r1cs_witness()
libsnark::kzg10_verifier_gadget::C
G1_variable< ppT > C
Definition: kzg10_verifier_gadget.hpp:94
kzg10_verifier_gadget.tcc
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::kzg10_verifier_gadget::D_precomp
G2_precomputation< ppT > D_precomp
Definition: kzg10_verifier_gadget.hpp:106
libsnark::precompute_G2_gadget
typename pairing_selector< ppT >::precompute_G2_gadget_type precompute_G2_gadget
Definition: pairing_params.hpp:139
libsnark
Definition: accumulation_vector.hpp:18
libsnark::kzg10_srs_variable::kzg10_srs_variable
kzg10_srs_variable(protoboard< libff::Fr< ppT >> &pb, const size_t max_degree, const std::string &annotation_prefix)
libsnark::kzg10_verifier_gadget::i_in_G2
G2_variable_or_identity< ppT > i_in_G2
Definition: kzg10_verifier_gadget.hpp:86
libsnark::kzg10_verifier_gadget::C_precomp
G1_precomputation< ppT > C_precomp
Definition: kzg10_verifier_gadget.hpp:102
libsnark::kzg10_verifier_gadget::B_precomp
G2_precomputation< ppT > B_precomp
Definition: kzg10_verifier_gadget.hpp:100
libsnark::gadget< libff::Fr< ppT > >::pb
protoboard< libff::Fr< ppT > > & pb
Definition: gadget.hpp:19
libsnark::kzg10_verifier_gadget::FieldT
libff::Fr< ppT > FieldT
Definition: kzg10_verifier_gadget.hpp:66
libsnark::kzg10_verifier_gadget::compute_poly_eval_in_G1
G1_mul_by_scalar_gadget< ppT > compute_poly_eval_in_G1
Definition: kzg10_verifier_gadget.hpp:93
libsnark::kzg10_verifier_gadget::compute_B
G2_add_gadget< ppT > compute_B
Definition: kzg10_verifier_gadget.hpp:89
libsnark::G1_add_gadget
Definition: weierstrass_g1_gadget.hpp:114
libsnark::G1_precomputation
typename pairing_selector< ppT >::G1_precomputation_type G1_precomputation
Definition: pairing_params.hpp:127
libsnark::kzg10_verifier_gadget::check_result
pb_variable< libff::Fr< ppT > > check_result
Definition: kzg10_verifier_gadget.hpp:108
libsnark::kzg10_srs_variable::generate_r1cs_witness
void generate_r1cs_witness(const typename kzg10< npp >::srs &srs)
libsnark::kzg10_verifier_gadget::B
G2_variable< ppT > B
Definition: kzg10_verifier_gadget.hpp:88
libsnark::kzg10_verifier_gadget
Definition: kzg10_verifier_gadget.hpp:63
libsnark::gadget
Definition: gadget.hpp:16
protoboard.hpp
libsnark::precompute_G1_gadget
typename pairing_selector< ppT >::precompute_G1_gadget_type precompute_G1_gadget
Definition: pairing_params.hpp:135
libsnark::kzg10_verifier_gadget::kzg10_verifier_gadget
kzg10_verifier_gadget(protoboard< libff::Fr< ppT >> &pb, const kzg10_srs_variable< ppT > &srs, const kzg10_commitment_variable< ppT > &commitmennt, pb_linear_combination< libff::Fr< ppT >> i, pb_linear_combination< libff::Fr< ppT >> poly_eval, const kzg10_witness_variable< ppT > &witness, pb_variable< libff::Fr< ppT >> result, const std::string &annotation_prefix)
libsnark::kzg10_verifier_gadget::compute_A_precomp
precompute_G1_gadget< ppT > compute_A_precomp
Definition: kzg10_verifier_gadget.hpp:99
libsnark::kzg10_verifier_gadget::group_elements_non_zero
pb_variable< libff::Fr< ppT > > group_elements_non_zero
Definition: kzg10_verifier_gadget.hpp:113
libsnark::kzg10_verifier_gadget::compute_B_precomp
precompute_G2_gadget< ppT > compute_B_precomp
Definition: kzg10_verifier_gadget.hpp:101
kzg10.hpp
libsnark::kzg10_srs_variable::alpha_powers_g1
std::vector< G1_variable< ppT > > alpha_powers_g1
Definition: kzg10_verifier_gadget.hpp:36
libsnark::kzg10_verifier_gadget::result
pb_variable< libff::Fr< ppT > > result
Definition: kzg10_verifier_gadget.hpp:116
weierstrass_g2_gadget.hpp
libsnark::kzg10_srs_variable
Definition: kzg10_verifier_gadget.hpp:31
libsnark::kzg10_verifier_gadget::compute_C
G1_add_gadget< ppT > compute_C
Definition: kzg10_verifier_gadget.hpp:95
libsnark::pb_linear_combination
Definition: pb_variable.hpp:101
libsnark::variable_or_identity
Definition: scalar_multiplication.hpp:35
libsnark::G1_variable
Gadget that represents a G1 variable.
Definition: weierstrass_g1_gadget.hpp:28
libsnark::kzg10_verifier_gadget::A_precomp
G1_precomputation< ppT > A_precomp
Definition: kzg10_verifier_gadget.hpp:98
libsnark::pb_variable
Definition: pb_variable.hpp:24
libsnark::other_curve
typename pairing_selector< ppT >::other_curve_type other_curve
Definition: pairing_params.hpp:117
libsnark::kzg10_verifier_gadget::poly_eval_in_G1
G1_variable_or_identity< ppT > poly_eval_in_G1
Definition: kzg10_verifier_gadget.hpp:92
libsnark::G2_add_gadget< ppT >
libsnark::kzg10_verifier_gadget::compute_C_precomp
precompute_G1_gadget< ppT > compute_C_precomp
Definition: kzg10_verifier_gadget.hpp:103
pairing_checks.hpp
libsnark::G2_precomputation
typename pairing_selector< ppT >::G2_precomputation_type G2_precomputation
Definition: pairing_params.hpp:131
libsnark::kzg10_srs_variable::alpha_g2
G2_variable< ppT > alpha_g2
Definition: kzg10_verifier_gadget.hpp:37
libsnark::kzg10_verifier_gadget::generate_r1cs_constraints
void generate_r1cs_constraints()
libsnark::kzg10::srs
Definition: kzg10.hpp:37
libsnark::kzg10_verifier_gadget::check_pairing_equality
check_e_equals_e_gadget< ppT > check_pairing_equality
Definition: kzg10_verifier_gadget.hpp:109
libsnark::check_e_equals_e_gadget
Definition: pairing_checks.hpp:29
weierstrass_g1_gadget.hpp
libsnark::kzg10_verifier_gadget::compute_i_in_G2
G2_mul_by_scalar_gadget< ppT > compute_i_in_G2
Definition: kzg10_verifier_gadget.hpp:87
libsnark::point_mul_by_scalar_gadget
Definition: scalar_multiplication.hpp:342
libsnark::protoboard
Definition: pb_variable.hpp:22
libsnark::kzg10_srs_variable::npp
other_curve< ppT > npp
Definition: kzg10_verifier_gadget.hpp:34