2 *****************************************************************************
4 Implementation of functionality that runs the TBCS ppzkSNARK for
7 See run_tbcs_ppzksnark.hpp .
9 *****************************************************************************
10 * @author This file is part of libsnark, developed by SCIPR Lab
11 * and contributors (see AUTHORS).
12 * @copyright MIT license (see LICENSE file)
13 *****************************************************************************/
15 #ifndef RUN_TBCS_PPZKSNARK_TCC_
16 #define RUN_TBCS_PPZKSNARK_TCC_
18 #include <libff/common/profiling.hpp>
19 #include <libsnark/zk_proof_systems/ppzksnark/tbcs_ppzksnark/tbcs_ppzksnark.hpp>
26 * The code below provides an example of all stages of running a TBCS ppzkSNARK.
28 * Of course, in a real-life scenario, we would have three distinct entities,
29 * mangled into one in the demonstration below. The three entities are as
30 * follows. (1) The "generator", which runs the ppzkSNARK generator on input a
31 * given circuit C to create a proving and a verification key for C. (2) The
32 * "prover", which runs the ppzkSNARK prover on input the proving key, a primary
33 * input for C, and an auxiliary input for C. (3) The "verifier", which runs the
34 * ppzkSNARK verifier on input the verification key, a primary input for C, and
37 template<typename ppT>
38 bool run_tbcs_ppzksnark(
39 const tbcs_example &example, const bool test_serialization)
41 libff::enter_block("Call to run_tbcs_ppzksnark");
43 libff::print_header("TBCS ppzkSNARK Generator");
44 tbcs_ppzksnark_keypair<ppT> keypair =
45 tbcs_ppzksnark_generator<ppT>(example.circuit);
47 libff::print_indent();
48 libff::print_mem("after generator");
50 libff::print_header("Preprocess verification key");
51 tbcs_ppzksnark_processed_verification_key<ppT> pvk =
52 tbcs_ppzksnark_verifier_process_vk<ppT>(keypair.vk);
54 if (test_serialization) {
55 libff::enter_block("Test serialization of keys");
57 libff::reserialize<tbcs_ppzksnark_proving_key<ppT>>(keypair.pk);
58 keypair.vk = libff::reserialize<tbcs_ppzksnark_verification_key<ppT>>(
61 libff::reserialize<tbcs_ppzksnark_processed_verification_key<ppT>>(
63 libff::leave_block("Test serialization of keys");
66 libff::print_header("TBCS ppzkSNARK Prover");
67 tbcs_ppzksnark_proof<ppT> proof = tbcs_ppzksnark_prover<ppT>(
68 keypair.pk, example.primary_input, example.auxiliary_input);
70 libff::print_indent();
71 libff::print_mem("after prover");
73 if (test_serialization) {
74 libff::enter_block("Test serialization of proof");
75 proof = libff::reserialize<tbcs_ppzksnark_proof<ppT>>(proof);
76 libff::leave_block("Test serialization of proof");
79 libff::print_header("TBCS ppzkSNARK Verifier");
80 bool ans = tbcs_ppzksnark_verifier_strong_IC<ppT>(
81 keypair.vk, example.primary_input, proof);
83 libff::print_indent();
84 libff::print_mem("after verifier");
85 printf("* The verification result is: %s\n", (ans ? "PASS" : "FAIL"));
87 libff::print_header("TBCS ppzkSNARK Online Verifier");
88 bool ans2 = tbcs_ppzksnark_online_verifier_strong_IC<ppT>(
89 pvk, example.primary_input, proof);
93 libff::leave_block("Call to run_tbcs_ppzksnark");
98 } // namespace libsnark
100 #endif // RUN_TBCS_PPZKSNARK_TCC_