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);