Clearmatics Libsnark  0.1
C++ library for zkSNARK proofs
demo_arithmetization.cpp
Go to the documentation of this file.
1 
7 #include <algorithm>
8 #include <fstream>
9 #include <iostream>
10 #include <sstream>
11 #include <string>
12 #ifndef MINDEPS
13 #include <boost/program_options.hpp>
14 #endif
15 
16 #include <libff/common/default_types/ec_pp.hpp>
17 #include <libff/common/profiling.hpp>
22 
23 #ifndef MINDEPS
24 namespace po = boost::program_options;
25 
27  const int argc,
28  const char **argv,
29  std::string &assembly_fn,
30  std::string &processed_assembly_fn,
31  std::string &architecture_params_fn,
32  std::string &computation_bounds_fn,
33  std::string &primary_input_fn,
34  std::string &auxiliary_input_fn)
35 {
36  try {
37  po::options_description desc("Usage");
38  desc.add_options()("help", "print this help message")(
39  "assembly", po::value<std::string>(&assembly_fn)->required())(
40  "processed_assembly",
41  po::value<std::string>(&processed_assembly_fn)->required())(
42  "architecture_params",
43  po::value<std::string>(&architecture_params_fn)->required())(
44  "computation_bounds",
45  po::value<std::string>(&computation_bounds_fn)->required())(
46  "primary_input",
47  po::value<std::string>(&primary_input_fn)->required())(
48  "auxiliary_input",
49  po::value<std::string>(&auxiliary_input_fn)->required());
50 
51  po::variables_map vm;
52  po::store(po::parse_command_line(argc, argv, desc), vm);
53 
54  if (vm.count("help")) {
55  std::cout << desc << "\n";
56  return false;
57  }
58 
59  po::notify(vm);
60  } catch (std::exception &e) {
61  std::cerr << "Error: " << e.what() << "\n";
62  return false;
63  }
64 
65  return true;
66 }
67 #endif
68 
69 using namespace libsnark;
70 
71 int main(int argc, const char *argv[])
72 {
73  typedef libff::Fr<libff::default_ec_pp> FieldT;
74  typedef ram_tinyram<FieldT> default_ram;
75 
76  libff::default_ec_pp::init_public_params();
77 
78 #ifdef MINDEPS
79  std::string assembly_fn = "assembly.s";
80  std::string processed_assembly_fn = "processed.txt";
81  std::string architecture_params_fn = "architecture_params.txt";
82  std::string computation_bounds_fn = "computation_bounds.txt";
83  std::string primary_input_fn = "primary_input.txt";
84  std::string auxiliary_input_fn = "auxiliary_input.txt";
85 #else
86  std::string assembly_fn;
87  std::string processed_assembly_fn;
88  std::string architecture_params_fn;
89  std::string computation_bounds_fn;
90  std::string primary_input_fn;
91  std::string auxiliary_input_fn;
92 
94  argc,
95  argv,
96  assembly_fn,
97  processed_assembly_fn,
98  architecture_params_fn,
99  computation_bounds_fn,
100  primary_input_fn,
101  auxiliary_input_fn)) {
102  return 1;
103  }
104 #endif
105  libff::start_profiling();
106 
107  printf("==================================================================="
108  "=============\n");
109  printf("TinyRAM example loader\n");
110  printf("==================================================================="
111  "=============\n\n");
112 
113  /* load everything */
115  std::ifstream f_ap(architecture_params_fn);
116  f_ap >> ap;
117 
118  printf("Will run on %zu register machine (word size = %zu)\n", ap.k, ap.w);
119 
120  std::ifstream f_rp(computation_bounds_fn);
121  size_t tinyram_input_size_bound, tinyram_program_size_bound, time_bound;
122  f_rp >> tinyram_input_size_bound >> tinyram_program_size_bound >>
123  time_bound;
124 
125  std::ifstream processed(processed_assembly_fn);
126  std::ifstream raw(assembly_fn);
127  tinyram_program program = load_preprocessed_program(ap, processed);
128  printf(
129  "Program:\n%s\n",
130  std::string(
131  (std::istreambuf_iterator<char>(raw)),
132  std::istreambuf_iterator<char>())
133  .c_str());
134 
135  std::ifstream f_primary_input(primary_input_fn);
136  std::ifstream f_auxiliary_input(auxiliary_input_fn);
137 
138  libff::enter_block("Loading primary input");
139  tinyram_input_tape primary_input(load_tape(f_primary_input));
140  libff::leave_block("Loading primary input");
141 
142  libff::enter_block("Loading auxiliary input");
143  tinyram_input_tape auxiliary_input = load_tape(f_auxiliary_input);
144  libff::leave_block("Loading auxiliary input");
145 
146  const size_t boot_trace_size_bound =
147  tinyram_input_size_bound + tinyram_program_size_bound;
148  const ram_boot_trace<default_ram> boot_trace =
150  ap, boot_trace_size_bound, program, primary_input);
151 
153 
154  ram_to_r1cs<default_ram> r(ap, boot_trace_size_bound, time_bound);
155  r.instance_map();
156 
159  ap, boot_trace_size_bound, boot_trace);
161  r.auxiliary_input_map(boot_trace, auxiliary_input);
162  const r1cs_constraint_system<FieldT> constraint_system =
164 
166  assert(constraint_system.is_satisfied(
168 }
libsnark::ram_architecture_params
typename ramT::architecture_params_type ram_architecture_params
Definition: ram_params.hpp:53
tinyram_params.hpp
libsnark::r1cs_constraint_system::is_satisfied
bool is_satisfied(const r1cs_primary_input< FieldT > &primary_input, const r1cs_auxiliary_input< FieldT > &auxiliary_input) const
tinyram_ppzksnark_pp.hpp
libsnark::ram_to_r1cs::print_execution_trace
void print_execution_trace() const
libsnark::ram_to_r1cs::instance_map
void instance_map()
libsnark
Definition: accumulation_vector.hpp:18
libsnark::load_preprocessed_program
tinyram_program load_preprocessed_program(const tinyram_architecture_params &ap, std::istream &preprocessed)
Definition: tinyram_aux.cpp:312
libsnark::ram_to_r1cs::auxiliary_input_map
r1cs_auxiliary_input< FieldT > auxiliary_input_map(const ram_boot_trace< ramT > &boot_trace, const ram_input_tape< ramT > &auxiliary_input)
main
int main(int argc, const char *argv[])
Definition: demo_arithmetization.cpp:71
libsnark::tinyram_input_tape
std::vector< size_t > tinyram_input_tape
Definition: tinyram_aux.hpp:122
process_arithm_command_line
bool process_arithm_command_line(const int argc, const char **argv, std::string &assembly_fn, std::string &processed_assembly_fn, std::string &architecture_params_fn, std::string &computation_bounds_fn, std::string &primary_input_fn, std::string &auxiliary_input_fn)
Definition: demo_arithmetization.cpp:26
libsnark::ram_tinyram
Definition: tinyram_params.hpp:22
libsnark::ram_to_r1cs
Definition: ram_to_r1cs.hpp:25
libsnark::ram_ppzksnark_machine_pp
typename ram_ppzksnark_ppT::machine_pp ram_ppzksnark_machine_pp
Definition: ram_ppzksnark_params.hpp:64
libsnark::memory_store_trace
Definition: memory_store_trace.hpp:29
libsnark::r1cs_auxiliary_input
std::vector< FieldT > r1cs_auxiliary_input
Definition: r1cs.hpp:84
libsnark::load_tape
tinyram_input_tape load_tape(std::istream &tape)
Definition: tinyram_aux.cpp:369
libsnark::r1cs_constraint_system
Definition: protoboard.hpp:25
libsnark::ram_to_r1cs::get_constraint_system
r1cs_constraint_system< FieldT > get_constraint_system() const
libsnark::tinyram_boot_trace_from_program_and_input
memory_store_trace tinyram_boot_trace_from_program_and_input(const tinyram_architecture_params &ap, const size_t boot_trace_size_bound, const tinyram_program &program, const tinyram_input_tape &primary_input)
Definition: tinyram_aux.cpp:338
ram_ppzksnark.hpp
libsnark::tinyram_program
Definition: tinyram_aux.hpp:200
ram_to_r1cs.hpp
libsnark::ram_to_r1cs::primary_input_map
static r1cs_primary_input< ram_base_field< ramT > > primary_input_map(const ram_architecture_params< ramT > &ap, const size_t boot_trace_size_bound, const ram_boot_trace< ramT > &boot_trace)
libsnark::r1cs_primary_input
std::vector< FieldT > r1cs_primary_input
Definition: r1cs.hpp:82