Zeth - Zerocash on Ethereum  0.8
Reference implementation of the Zeth protocol by Clearmatics
tool_common.hpp
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_TOOL_TOOL_COMMON_HPP__
6 #define __ZETH_TOOL_TOOL_COMMON_HPP__
7 
8 #include "libtool/subcommand.hpp"
11 
12 #include <libff/algebra/curves/alt_bn128/alt_bn128_pp.hpp>
13 #include <libff/algebra/curves/bls12_377/bls12_377_pp.hpp>
14 #include <libff/algebra/curves/bw6_761/bw6_761_pp.hpp>
15 
16 namespace zethtool
17 {
18 
19 using global_options = bool;
21 
34 template<template<typename, typename> class Callee>
36 {
37 public:
38  template<typename... Args>
39  static int resolve(
40  const std::string &curve_name,
41  const std::string &snark_name,
42  Args... args)
43  {
44  if (curve_name == "alt-bn128") {
45  return resolve_snark<libff::alt_bn128_pp>(snark_name, args...);
46  } else if (curve_name == "bls12-377") {
47  return resolve_snark<libff::bls12_377_pp>(snark_name, args...);
48  // Disabled for now (missing implementation of some functionality)
49  // } else if (curve_name == "bw6-761") {
50  // return resolve_snark<libff::bw6_761_pp>(snark_name, args...);
51  }
52 
53  throw po::error("unrecognized curve");
54  }
55 
56 protected:
57  template<typename ppT, typename... Args>
58  static int resolve_snark(const std::string &snark_name, Args... args)
59  {
60  if (snark_name == "groth16") {
61  return Callee<ppT, libzeth::groth16_snark<ppT>>::execute(args...);
62  } else if (snark_name == "pghr13") {
63  return Callee<ppT, libzeth::pghr13_snark<ppT>>::execute(args...);
64  }
65 
66  throw po::error("unrecognized snark");
67  }
68 };
69 
87 template<class CommandT> class generic_subcommand : public zeth_subcommand
88 {
89 public:
91  const std::string &subcommand_name, const std::string &description)
93  {
94  }
95 
96 protected:
98  boost::program_options::options_description &options,
99  boost::program_options::options_description &,
100  boost::program_options::positional_options_description &) override
101  {
102  // Options
103  options.add_options()(
104  "curve,c",
105  po::value<std::string>(),
106  "Curve: alt-bn128, bls12-377 or bw6-761");
107  options.add_options()(
108  "snark,s", po::value<std::string>(), "Snark: groth16 or pghr13");
109  }
110 
112  const boost::program_options::variables_map &vm) override
113  {
114  curve = vm.count("curve") ? vm["curve"].as<std::string>() : "alt-bn128";
115  snark = vm.count("snark") ? vm["snark"].as<std::string>() : "groth16";
116  }
117 
118  int execute_subcommand(const global_options &options) override
119  {
121  curve, snark, this, options);
122  }
123 
124 protected:
125  template<typename ppT, typename snarkT> class this_caller
126  {
127  public:
128  static int execute(
130  {
131  return ((CommandT *)that)->template execute_generic<ppT, snarkT>(o);
132  }
133  };
134 
135  std::string curve;
136  std::string snark;
137 };
138 
139 } // namespace zethtool
140 
141 #endif // __ZETH_TOOL_TOOL_COMMON_HPP__
zethtool::generic_subcommand::parse_suboptions
void parse_suboptions(const boost::program_options::variables_map &vm) override
Definition: tool_common.hpp:111
libtool::subcommand::description
const std::string & description() const
zethtool::generic_subcommand::generic_subcommand
generic_subcommand(const std::string &subcommand_name, const std::string &description)
Definition: tool_common.hpp:90
groth16_snark.hpp
zethtool::generic_subcommand::execute_subcommand
int execute_subcommand(const global_options &options) override
Definition: tool_common.hpp:118
zethtool::generic_subcommand::initialize_suboptions
void initialize_suboptions(boost::program_options::options_description &options, boost::program_options::options_description &, boost::program_options::positional_options_description &) override
Instantiation can now set up the boost program_options structures.
Definition: tool_common.hpp:97
zethtool::generic_subcommand
Definition: tool_common.hpp:87
global_options
Definition: mpc_subcommand.hpp:15
zethtool::curve_and_snark_resolver::resolve
static int resolve(const std::string &curve_name, const std::string &snark_name, Args... args)
Definition: tool_common.hpp:39
libtool::subcommand::subcommand_name
std::string subcommand_name
Definition: subcommand.hpp:54
zethtool::generic_subcommand::snark
std::string snark
Definition: tool_common.hpp:136
zethtool::generic_subcommand::this_caller::execute
static int execute(generic_subcommand< CommandT > *that, const global_options &o)
Definition: tool_common.hpp:128
subcommand.hpp
pghr13_snark.hpp
zethtool::generic_subcommand::this_caller
Definition: tool_common.hpp:125
libtool::subcommand
Class representing a tool subcommand.
Definition: subcommand.hpp:18
zethtool::curve_and_snark_resolver
Definition: tool_common.hpp:35
zethtool::generic_subcommand::curve
std::string curve
Definition: tool_common.hpp:135
zethtool::curve_and_snark_resolver::resolve_snark
static int resolve_snark(const std::string &snark_name, Args... args)
Definition: tool_common.hpp:58
zethtool
Definition: dump_proof_cmd.cpp:11
snark
libzeth::defaults::snark snark
Definition: prover_server.cpp:30