1 // Copyright (c) 2015-2022 Clearmatics Technologies Ltd
3 // SPDX-License-Identifier: LGPL-3.0+
5 #ifndef __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__
6 #define __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__
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"
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)
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();
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));
29 std::string abc_json_str = accumulation_vector_to_json<ppT>(vk.ABC_g1);
31 // Note on memory safety: set_allocated deleted the allocated objects
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();
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);
43 template<typename ppT>
44 typename groth16_snark<ppT>::verification_key groth16_api_handler<
45 ppT>::verification_key_from_proto(const zeth_proto::VerificationKey
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());
55 libff::G2<ppT> delta_g2 =
56 point_g2_affine_from_proto<ppT>(verif_key.delta_g2());
58 libsnark::accumulation_vector<libff::G1<ppT>> abc_g1 =
59 accumulation_vector_from_json<ppT>(verif_key.abc_g1());
61 libsnark::r1cs_gg_ppzksnark_verification_key<ppT> vk(
62 alpha_g1, beta_g2, delta_g2, abc_g1);
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)
72 const libsnark::r1cs_gg_ppzksnark_proof<ppT> &proof_obj =
73 ext_proof.get_proof();
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();
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));
84 primary_inputs_write_json(ext_proof.get_primary_inputs(), ss);
86 // Note on memory safety: set_allocated deleted the allocated objects.
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();
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());
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)
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());
108 std::vector<libff::Fr<ppT>> inputs;
109 std::stringstream ss(e_proof.inputs());
110 primary_inputs_read_json(inputs, ss);
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));
120 } // namespace libzeth
122 #endif // __ZETH_SNARKS_GROTH16_GROTH16_API_HANDLER_TCC__