Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
pghr13_snark.tcc
Go to the documentation of this file.
1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
2 //
3 // SPDX-License-Identifier: LGPL-3.0+
4 
5 #ifndef __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__
6 #define __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__
7 
8 #include "libzeth/core/field_element_utils.hpp"
9 #include "libzeth/core/group_element_utils.hpp"
10 #include "libzeth/snarks/pghr13/pghr13_snark.hpp"
11 
12 namespace libzeth
13 {
14 
15 template<typename ppT> const std::string pghr13_snark<ppT>::name("PGHR13");
16 
17 template<typename ppT>
18 typename pghr13_snark<ppT>::keypair pghr13_snark<ppT>::generate_setup(
19  const libsnark::protoboard<libff::Fr<ppT>> &pb)
20 {
21  return libsnark::r1cs_ppzksnark_generator<ppT>(pb.get_constraint_system());
22 }
23 
24 template<typename ppT>
25 typename pghr13_snark<ppT>::proof pghr13_snark<ppT>::generate_proof(
26  const pghr13_snark<ppT>::proving_key &proving_key,
27  const libsnark::protoboard<libff::Fr<ppT>> &pb)
28 {
29  return generate_proof(
30  proving_key, pb.primary_input(), pb.auxiliary_input());
31 }
32 
33 template<typename ppT>
34 typename pghr13_snark<ppT>::proof pghr13_snark<ppT>::generate_proof(
35  const pghr13_snark<ppT>::proving_key &proving_key,
36  const libsnark::r1cs_primary_input<libff::Fr<ppT>> &primary_input,
37  const libsnark::r1cs_auxiliary_input<libff::Fr<ppT>> auxiliary_input)
38 {
39  // Generate proof from public input, auxiliary input (private/secret data),
40  // and proving key
41  return libsnark::r1cs_ppzksnark_prover(
42  proving_key, primary_input, auxiliary_input);
43 }
44 
45 template<typename ppT>
46 bool pghr13_snark<ppT>::verify(
47  const libsnark::r1cs_primary_input<libff::Fr<ppT>> &primary_inputs,
48  const pghr13_snark<ppT>::proof &proof,
49  const pghr13_snark<ppT>::verification_key &verification_key)
50 {
51  return libsnark::r1cs_ppzksnark_verifier_strong_IC<ppT>(
52  verification_key, primary_inputs, proof);
53 }
54 
55 template<typename ppT>
56 void pghr13_snark<ppT>::verification_key_write_json(
57  const pghr13_snark<ppT>::verification_key &vk, std::ostream &os)
58 {
59  unsigned ic_length = vk.encoded_IC_query.rest.indices.size() + 1;
60 
61  os << "{\n";
62  os << " \"a\": " << group_element_to_json(vk.alphaA_g2) << ",\n";
63  os << " \"b\": " << group_element_to_json(vk.alphaB_g1) << ",\n";
64  os << " \"c\": " << group_element_to_json(vk.alphaC_g2) << ",\n";
65  os << " \"g\": " << group_element_to_json(vk.gamma_g2) << ",\n";
66  os << " \"gb1\": " << group_element_to_json(vk.gamma_beta_g1) << ",\n";
67  os << " \"gb2\": " << group_element_to_json(vk.gamma_beta_g2) << ",\n";
68  os << " \"z\": " << group_element_to_json(vk.rC_Z_g2) << ",\n";
69 
70  os << "\"IC\" :[" << group_element_to_json(vk.encoded_IC_query.first);
71 
72  for (size_t i = 1; i < ic_length; ++i) {
73  os << ","
74  << group_element_to_json(vk.encoded_IC_query.rest.values[i - 1]);
75  }
76 
77  os << "]\n";
78  os << "}";
79 }
80 
81 template<typename ppT>
82 void pghr13_snark<ppT>::verification_key_write_bytes(
83  const typename pghr13_snark<ppT>::verification_key &vk, std::ostream &os)
84 {
85  os << vk;
86 }
87 
88 template<typename ppT>
89 void pghr13_snark<ppT>::verification_key_read_bytes(
90  typename pghr13_snark<ppT>::verification_key &vk, std::istream &in_s)
91 {
92  in_s >> vk;
93 }
94 
95 template<typename ppT>
96 void pghr13_snark<ppT>::proving_key_write_bytes(
97  const typename pghr13_snark<ppT>::proving_key &pk, std::ostream &os)
98 {
99  os << pk;
100 }
101 
102 template<typename ppT>
103 void pghr13_snark<ppT>::proving_key_read_bytes(
104  typename pghr13_snark<ppT>::proving_key &pk, std::istream &in_s)
105 {
106  in_s >> pk;
107 }
108 
109 template<typename ppT>
110 void pghr13_snark<ppT>::proof_write_json(
111  const typename pghr13_snark<ppT>::proof &proof, std::ostream &os)
112 {
113  os << "{\n";
114  os << " \"a\": " << group_element_to_json(proof.g_A.g) << ",\n";
115  os << " \"a_p\": " << group_element_to_json(proof.g_A.h) << ",\n";
116  os << " \"b\": " << group_element_to_json(proof.g_B.g) << ",\n";
117  os << " \"b_p\": " << group_element_to_json(proof.g_B.h) << ",\n";
118  os << " \"c\": " << group_element_to_json(proof.g_C.g) << ",\n";
119  os << " \"c_p\": " << group_element_to_json(proof.g_C.h) << ",\n";
120  os << " \"h\": " << group_element_to_json(proof.g_H) << ",\n";
121  os << " \"k\": " << group_element_to_json(proof.g_K) << "\n";
122  os << "}";
123 }
124 
125 template<typename ppT>
126 void pghr13_snark<ppT>::proof_write_bytes(
127  const typename pghr13_snark<ppT>::proof &proof, std::ostream &out_s)
128 {
129  knowledge_commitment_write_bytes(proof.g_A, out_s);
130  knowledge_commitment_write_bytes(proof.g_B, out_s);
131  knowledge_commitment_write_bytes(proof.g_C, out_s);
132  group_element_write_bytes(proof.g_H, out_s);
133  group_element_write_bytes(proof.g_K, out_s);
134 }
135 
136 template<typename ppT>
137 void pghr13_snark<ppT>::proof_read_bytes(
138  typename pghr13_snark<ppT>::proof &proof, std::istream &in_s)
139 {
140  knowledge_commitment_read_bytes(proof.g_A, in_s);
141  knowledge_commitment_read_bytes(proof.g_B, in_s);
142  knowledge_commitment_read_bytes(proof.g_C, in_s);
143  group_element_read_bytes(proof.g_H, in_s);
144  group_element_read_bytes(proof.g_K, in_s);
145 }
146 
147 template<typename ppT>
148 void pghr13_snark<ppT>::keypair_write_bytes(
149  const typename pghr13_snark<ppT>::keypair &keypair, std::ostream &os)
150 {
151  proving_key_write_bytes(keypair.pk, os);
152  verification_key_write_bytes(keypair.vk, os);
153 }
154 
155 template<typename ppT>
156 void pghr13_snark<ppT>::keypair_read_bytes(
157  typename pghr13_snark<ppT>::keypair &keypair, std::istream &in_s)
158 {
159  proving_key_read_bytes(keypair.pk, in_s);
160  verification_key_read_bytes(keypair.vk, in_s);
161 }
162 
163 } // namespace libzeth
164 
165 #endif // __ZETH_SNARKS_PGHR13_PGHR13_SNARK_TCC__