Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
groth16_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_GROTH16_GROTH16_API_HANDLER_TCC__
6 #define __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__
7 
8 #include "libzeth/core/field_element_utils.hpp"
9 #include "libzeth/serialization/proto_utils.hpp"
10 #include "libzeth/serialization/r1cs_serialization.hpp"
11 #include "libzeth/snarks/groth16/groth16_api_handler.hpp"
12 
13 namespace libzeth
14 {
15 
16 template<typename ppT>
17 void groth16_api_handler<ppT>::verification_key_to_proto(
18  const typename groth16_api_handler<ppT>::snark::verification_key &vk,
19  zeth_proto::VerificationKey *message)
20 {
21  zeth_proto::Group1Point *alpha = new zeth_proto::Group1Point();
22  zeth_proto::Group2Point *beta = new zeth_proto::Group2Point();
23  zeth_proto::Group2Point *delta = new zeth_proto::Group2Point();
24 
25  alpha->CopyFrom(point_g1_affine_to_proto<ppT>(vk.alpha_g1));
26  beta->CopyFrom(point_g2_affine_to_proto<ppT>(vk.beta_g2));
27  delta->CopyFrom(point_g2_affine_to_proto<ppT>(vk.delta_g2));
28 
29  std::string abc_json_str = accumulation_vector_to_json<ppT>(vk.ABC_g1);
30 
31  // Note on memory safety: set_allocated deleted the allocated objects
32  // See:
33  // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
34  zeth_proto::VerificationKeyGROTH16 *grpc_verification_key_groth16 =
35  message->mutable_groth16_verification_key();
36 
37  grpc_verification_key_groth16->set_allocated_alpha_g1(alpha);
38  grpc_verification_key_groth16->set_allocated_beta_g2(beta);
39  grpc_verification_key_groth16->set_allocated_delta_g2(delta);
40  grpc_verification_key_groth16->set_abc_g1(abc_json_str);
41 }
42 
43 template<typename ppT>
44 typename groth16_snark<ppT>::verification_key groth16_api_handler<
45  ppT>::verification_key_from_proto(const zeth_proto::VerificationKey
46  &verification_key)
47 {
48  const zeth_proto::VerificationKeyGROTH16 &verif_key =
49  verification_key.groth16_verification_key();
50  libff::G1<ppT> alpha_g1 =
51  point_g1_affine_from_proto<ppT>(verif_key.alpha_g1());
52  libff::G2<ppT> beta_g2 =
53  point_g2_affine_from_proto<ppT>(verif_key.beta_g2());
54 
55  libff::G2<ppT> delta_g2 =
56  point_g2_affine_from_proto<ppT>(verif_key.delta_g2());
57 
58  libsnark::accumulation_vector<libff::G1<ppT>> abc_g1 =
59  accumulation_vector_from_json<ppT>(verif_key.abc_g1());
60 
61  libsnark::r1cs_gg_ppzksnark_verification_key<ppT> vk(
62  alpha_g1, beta_g2, delta_g2, abc_g1);
63 
64  return vk;
65 }
66 
67 template<typename ppT>
68 void groth16_api_handler<ppT>::extended_proof_to_proto(
69  const extended_proof<ppT, groth16_api_handler<ppT>::snark> &ext_proof,
70  zeth_proto::ExtendedProof *message)
71 {
72  const libsnark::r1cs_gg_ppzksnark_proof<ppT> &proof_obj =
73  ext_proof.get_proof();
74 
75  zeth_proto::Group1Point *a = new zeth_proto::Group1Point();
76  zeth_proto::Group2Point *b = new zeth_proto::Group2Point();
77  zeth_proto::Group1Point *c = new zeth_proto::Group1Point();
78 
79  a->CopyFrom(point_g1_affine_to_proto<ppT>(proof_obj.g_A));
80  b->CopyFrom(point_g2_affine_to_proto<ppT>(proof_obj.g_B));
81  c->CopyFrom(point_g1_affine_to_proto<ppT>(proof_obj.g_C));
82 
83  std::stringstream ss;
84  primary_inputs_write_json(ext_proof.get_primary_inputs(), ss);
85 
86  // Note on memory safety: set_allocated deleted the allocated objects.
87  // See:
88  // https://stackoverflow.com/questions/33960999/protobuf-will-set-allocated-delete-the-allocated-object
89  zeth_proto::ExtendedProofGROTH16 *grpc_extended_groth16_proof_obj =
90  message->mutable_groth16_extended_proof();
91 
92  grpc_extended_groth16_proof_obj->set_allocated_a(a);
93  grpc_extended_groth16_proof_obj->set_allocated_b(b);
94  grpc_extended_groth16_proof_obj->set_allocated_c(c);
95  grpc_extended_groth16_proof_obj->set_inputs(ss.str());
96 }
97 
98 template<typename ppT>
99 libzeth::extended_proof<ppT, groth16_snark<ppT>> groth16_api_handler<
100  ppT>::extended_proof_from_proto(const zeth_proto::ExtendedProof &ext_proof)
101 {
102  const zeth_proto::ExtendedProofGROTH16 &e_proof =
103  ext_proof.groth16_extended_proof();
104  libff::G1<ppT> a = point_g1_affine_from_proto<ppT>(e_proof.a());
105  libff::G2<ppT> b = point_g2_affine_from_proto<ppT>(e_proof.b());
106  libff::G1<ppT> c = point_g1_affine_from_proto<ppT>(e_proof.c());
107 
108  std::vector<libff::Fr<ppT>> inputs;
109  std::stringstream ss(e_proof.inputs());
110  primary_inputs_read_json(inputs, ss);
111 
112  libsnark::r1cs_gg_ppzksnark_proof<ppT> proof(
113  std::move(a), std::move(b), std::move(c));
114  libzeth::extended_proof<ppT, groth16_snark<ppT>> res(
115  std::move(proof), std::move(inputs));
116 
117  return res;
118 }
119 
120 } // namespace libzeth
121 
122 #endif // __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__