Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
pghr13_api_handler.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_API_HANDLER_TCC__
6 #define __ZETH_SNARKS_PGHR13_PGHR13_API_HANDLER_TCC__
7 
8 #include "libzeth/core/field_element_utils.hpp"
9 #include "libzeth/core/group_element_utils.hpp"
10 #include "libzeth/serialization/proto_utils.hpp"
11 #include "libzeth/serialization/r1cs_serialization.hpp"
12 #include "libzeth/snarks/pghr13/pghr13_api_handler.hpp"
13 
14 namespace libzeth
15 {
16 
17 template<typename ppT>
18 void pghr13_api_handler<ppT>::verification_key_to_proto(
19  const typename snark::verification_key &vk,
20  zeth_proto::VerificationKey *message)
21 {
22  zeth_proto::Group2Point *a = new zeth_proto::Group2Point();
23  zeth_proto::Group1Point *b = new zeth_proto::Group1Point();
24  zeth_proto::Group2Point *c = new zeth_proto::Group2Point();
25  zeth_proto::Group2Point *g = new zeth_proto::Group2Point();
26  zeth_proto::Group1Point *gb1 = new zeth_proto::Group1Point();
27  zeth_proto::Group2Point *gb2 = new zeth_proto::Group2Point();
28  zeth_proto::Group2Point *z = new zeth_proto::Group2Point();
29 
30  a->CopyFrom(point_g2_affine_to_proto<ppT>(vk.alphaA_g2));
31  b->CopyFrom(point_g1_affine_to_proto<ppT>(vk.alphaB_g1));
32  c->CopyFrom(point_g2_affine_to_proto<ppT>(vk.alphaC_g2));
33  g->CopyFrom(point_g2_affine_to_proto<ppT>(vk.gamma_g2));
34  gb1->CopyFrom(point_g1_affine_to_proto<ppT>(vk.gamma_beta_g1));
35  gb2->CopyFrom(point_g2_affine_to_proto<ppT>(vk.gamma_beta_g2));
36  z->CopyFrom(point_g2_affine_to_proto<ppT>(vk.rC_Z_g2));
37 
38  std::string ic_json = accumulation_vector_to_json<ppT>(vk.encoded_IC_query);
39 
40  // Note on memory safety: set_allocated deleted the allocated objects
41  // See:
42  // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
43  zeth_proto::VerificationKeyPGHR13 *grpc_verification_key_pghr13 =
44  message->mutable_pghr13_verification_key();
45 
46  grpc_verification_key_pghr13->set_allocated_a(a);
47  grpc_verification_key_pghr13->set_allocated_b(b);
48  grpc_verification_key_pghr13->set_allocated_c(c);
49  grpc_verification_key_pghr13->set_allocated_gamma(g);
50  grpc_verification_key_pghr13->set_allocated_gamma_beta_g1(gb1);
51  grpc_verification_key_pghr13->set_allocated_gamma_beta_g2(gb2);
52  grpc_verification_key_pghr13->set_allocated_z(z);
53  grpc_verification_key_pghr13->set_ic(ic_json);
54 }
55 
56 template<typename ppT>
57 typename pghr13_snark<ppT>::verification_key pghr13_api_handler<
58  ppT>::verification_key_from_proto(const zeth_proto::VerificationKey
59  &verification_key)
60 {
61  const zeth_proto::VerificationKeyPGHR13 &verif_key =
62  verification_key.pghr13_verification_key();
63  libff::G2<ppT> a = point_g2_affine_from_proto<ppT>(verif_key.a());
64  libff::G1<ppT> b = point_g1_affine_from_proto<ppT>(verif_key.b());
65  libff::G2<ppT> c = point_g2_affine_from_proto<ppT>(verif_key.c());
66  libff::G2<ppT> gamma = point_g2_affine_from_proto<ppT>(verif_key.gamma());
67  libff::G1<ppT> gamma_beta_g1 =
68  point_g1_affine_from_proto<ppT>(verif_key.gamma_beta_g1());
69  libff::G2<ppT> gamma_beta_g2 =
70  point_g2_affine_from_proto<ppT>(verif_key.gamma_beta_g2());
71  libff::G2<ppT> z = point_g2_affine_from_proto<ppT>(verif_key.z());
72 
73  libsnark::accumulation_vector<libff::G1<ppT>> ic =
74  accumulation_vector_from_json<ppT>(verif_key.ic());
75 
76  libsnark::r1cs_ppzksnark_verification_key<ppT> vk(
77  a, b, c, gamma, gamma_beta_g1, gamma_beta_g2, z, ic);
78 
79  return vk;
80 }
81 
82 template<typename ppT>
83 void pghr13_api_handler<ppT>::extended_proof_to_proto(
84  const extended_proof<ppT, snark> &ext_proof,
85  zeth_proto::ExtendedProof *message)
86 {
87  libsnark::r1cs_ppzksnark_proof<ppT> proofObj = ext_proof.get_proof();
88 
89  zeth_proto::Group1Point *a = new zeth_proto::Group1Point();
90  zeth_proto::Group1Point *a_p = new zeth_proto::Group1Point();
91  zeth_proto::Group2Point *b = new zeth_proto::Group2Point();
92  zeth_proto::Group1Point *b_p = new zeth_proto::Group1Point();
93  zeth_proto::Group1Point *c = new zeth_proto::Group1Point();
94  zeth_proto::Group1Point *c_p = new zeth_proto::Group1Point();
95  zeth_proto::Group1Point *h = new zeth_proto::Group1Point();
96  zeth_proto::Group1Point *k = new zeth_proto::Group1Point();
97 
98  a->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_A.g));
99  a_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_A.h));
100  b->CopyFrom(point_g2_affine_to_proto<ppT>(proofObj.g_B.g));
101  b_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_B.h));
102  c->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_C.g));
103  c_p->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_C.h));
104  h->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_H));
105  k->CopyFrom(point_g1_affine_to_proto<ppT>(proofObj.g_K));
106 
107  libsnark::r1cs_ppzksnark_primary_input<ppT> pub_inputs =
108  ext_proof.get_primary_inputs();
109 
110  std::stringstream ss;
111  primary_inputs_write_json(pub_inputs, ss);
112 
113  // Note on memory safety: set_allocated deleted the allocated objects
114  // See:
115  // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
116  zeth_proto::ExtendedProofPGHR13 *grpc_extended_pghr13_proof_obj =
117  message->mutable_pghr13_extended_proof();
118 
119  grpc_extended_pghr13_proof_obj->set_allocated_a(a);
120  grpc_extended_pghr13_proof_obj->set_allocated_a_p(a_p);
121  grpc_extended_pghr13_proof_obj->set_allocated_b(b);
122  grpc_extended_pghr13_proof_obj->set_allocated_b_p(b_p);
123  grpc_extended_pghr13_proof_obj->set_allocated_c(c);
124  grpc_extended_pghr13_proof_obj->set_allocated_c_p(c_p);
125  grpc_extended_pghr13_proof_obj->set_allocated_h(h);
126  grpc_extended_pghr13_proof_obj->set_allocated_k(k);
127  grpc_extended_pghr13_proof_obj->set_inputs(ss.str());
128 }
129 
130 template<typename ppT>
131 libzeth::extended_proof<ppT, pghr13_snark<ppT>> pghr13_api_handler<
132  ppT>::extended_proof_from_proto(const zeth_proto::ExtendedProof &ext_proof)
133 {
134  const zeth_proto::ExtendedProofPGHR13 &e_proof =
135  ext_proof.pghr13_extended_proof();
136 
137  libff::G1<ppT> a = point_g1_affine_from_proto<ppT>(e_proof.a());
138  libff::G1<ppT> a_p = point_g1_affine_from_proto<ppT>(e_proof.a_p());
139  libsnark::knowledge_commitment<libff::G1<ppT>, libff::G1<ppT>> g_A(a, a_p);
140 
141  libff::G2<ppT> b = point_g2_affine_from_proto<ppT>(e_proof.b());
142  libff::G1<ppT> b_p = point_g1_affine_from_proto<ppT>(e_proof.b_p());
143  libsnark::knowledge_commitment<libff::G2<ppT>, libff::G1<ppT>> g_B(b, b_p);
144 
145  libff::G1<ppT> c = point_g1_affine_from_proto<ppT>(e_proof.c());
146  libff::G1<ppT> c_p = point_g1_affine_from_proto<ppT>(e_proof.c_p());
147  libsnark::knowledge_commitment<libff::G1<ppT>, libff::G1<ppT>> g_C(c, c_p);
148 
149  libff::G1<ppT> h = point_g1_affine_from_proto<ppT>(e_proof.h());
150  libff::G1<ppT> k = point_g1_affine_from_proto<ppT>(e_proof.k());
151 
152  libsnark::r1cs_ppzksnark_proof<ppT> proof(
153  std::move(g_A),
154  std::move(g_B),
155  std::move(g_C),
156  std::move(h),
157  std::move(k));
158  libsnark::r1cs_primary_input<libff::Fr<ppT>> inputs;
159  std::stringstream ss(e_proof.inputs());
160  primary_inputs_read_json(inputs, ss);
161 
162  return libzeth::extended_proof<ppT, pghr13_snark<ppT>>(
163  std::move(proof), std::move(inputs));
164 }
165 
166 } // namespace libzeth
167 
168 #endif // __ZETH_SNARKS_PGHR13_PGHR13_API_HANDLER_TCC__