337     po::options_description options(
"Options");
 
  338     options.add_options()(
"help,h", 
"This help");
 
  339     options.add_options()(
 
  341         po::value<boost::filesystem::path>(),
 
  342         "file to load keypair from. If it doesn't exist, a new keypair will be " 
  343         "generated and written to this file. (default: " 
  344         "~/zeth_setup/keypair.bin)");
 
  345     options.add_options()(
 
  347         po::value<boost::filesystem::path>(),
 
  348         "file in which to export the r1cs (in json format)");
 
  349     options.add_options()(
 
  350         "proving-key-output",
 
  351         po::value<boost::filesystem::path>(),
 
  352         "write proving key to file (if generated)");
 
  353     options.add_options()(
 
  354         "verification-key-output",
 
  355         po::value<boost::filesystem::path>(),
 
  356         "write verification key to file (if generated)");
 
  357     options.add_options()(
 
  358         "extproof-json-output",
 
  359         po::value<boost::filesystem::path>(),
 
  360         "(DEBUG) write generated extended proofs (JSON) to file");
 
  361     options.add_options()(
 
  363         po::value<boost::filesystem::path>(),
 
  364         "(DEBUG) write generated proofs to file");
 
  365     options.add_options()(
 
  367         po::value<boost::filesystem::path>(),
 
  368         "(DEBUG) write primary input to file");
 
  369     options.add_options()(
 
  371         po::value<boost::filesystem::path>(),
 
  372         "(DEBUG) write full assignment to file (INSECURE!)");
 
  375         std::cout << 
"Usage:" 
  377                   << 
"  " << argv[0] << 
" [<options>]\n" 
  379         std::cout << options;
 
  380         std::cout << std::endl;
 
  383     boost::filesystem::path keypair_file;
 
  384     boost::filesystem::path r1cs_file;
 
  385     boost::filesystem::path proving_key_output_file;
 
  386     boost::filesystem::path verification_key_output_file;
 
  387     boost::filesystem::path extproof_json_output_file;
 
  388     boost::filesystem::path proof_output_file;
 
  389     boost::filesystem::path primary_output_file;
 
  390     boost::filesystem::path assignment_output_file;
 
  392         po::variables_map vm;
 
  394             po::command_line_parser(argc, argv).options(options).run(), vm);
 
  395         if (vm.count(
"help")) {
 
  399         if (vm.count(
"keypair")) {
 
  400             keypair_file = vm[
"keypair"].as<boost::filesystem::path>();
 
  402         if (vm.count(
"r1cs")) {
 
  403             r1cs_file = vm[
"r1cs"].as<boost::filesystem::path>();
 
  405         if (vm.count(
"proving-key-output")) {
 
  406             proving_key_output_file =
 
  407                 vm[
"proving-key-output"].as<boost::filesystem::path>();
 
  409         if (vm.count(
"verification-key-output")) {
 
  410             verification_key_output_file =
 
  411                 vm[
"verification-key-output"].as<boost::filesystem::path>();
 
  413         if (vm.count(
"extproof-json-output")) {
 
  414             extproof_json_output_file =
 
  415                 vm[
"extproof-json-output"].as<boost::filesystem::path>();
 
  417         if (vm.count(
"proof-output")) {
 
  419                 vm[
"proof-output"].as<boost::filesystem::path>();
 
  421         if (vm.count(
"primary-output")) {
 
  422             primary_output_file =
 
  423                 vm[
"primary-output"].as<boost::filesystem::path>();
 
  425         if (vm.count(
"assignment-output")) {
 
  426             assignment_output_file =
 
  427                 vm[
"assignment-output"].as<boost::filesystem::path>();
 
  429     } 
catch (po::error &error) {
 
  430         std::cerr << 
" ERROR: " << error.what() << std::endl;
 
  436     if (keypair_file.empty()) {
 
  437         boost::filesystem::path setup_dir =
 
  439         if (!setup_dir.empty()) {
 
  440             boost::filesystem::create_directories(setup_dir);
 
  442         keypair_file = setup_dir / 
"keypair.bin";
 
  446     std::cout << 
"[INFO] Init params (" << libzeth::pp_name<pp>() << 
")\n";
 
  447     pp::init_public_params();
 
  452     snark::keypair keypair = [&keypair_file,
 
  453                               &proving_key_output_file,
 
  454                               &verification_key_output_file,
 
  456         if (boost::filesystem::exists(keypair_file)) {
 
  457             std::cout << 
"[INFO] Loading keypair: " << keypair_file << 
"\n";
 
  459             snark::keypair keypair;
 
  462             snark::keypair_read_bytes(keypair, in_s);
 
  466         std::cout << 
"[INFO] No keypair file " << keypair_file
 
  467                   << 
". Generating.\n";
 
  470         if (!proving_key_output_file.empty()) {
 
  471             std::cout << 
"[DEBUG] Writing separate proving key to " 
  472                       << proving_key_output_file << 
"\n";
 
  474                 proving_key_output_file.c_str());
 
  475             snark::proving_key_write_bytes(keypair.pk, out_s);
 
  477         if (!verification_key_output_file.empty()) {
 
  478             std::cout << 
"[DEBUG] Writing separate verification key to " 
  479                       << verification_key_output_file << 
"\n";
 
  481                 verification_key_output_file.c_str());
 
  482             snark::verification_key_write_bytes(keypair.vk, out_s);
 
  487         std::cout << 
"[INFO] Writing new keypair to " << keypair_file << 
"\n";
 
  488         std::ofstream out_s =
 
  490         snark::keypair_write_bytes(keypair, out_s);
 
  497     if (!r1cs_file.empty()) {
 
  498         std::cout << 
"[INFO] Writing R1CS to " << r1cs_file << 
"\n";
 
  499         std::ofstream r1cs_stream(r1cs_file.c_str());
 
  503     std::cout << 
"[INFO] Setup successful, starting the server..." << std::endl;
 
  507         extproof_json_output_file,
 
  510         assignment_output_file);