void clear_del_vec_array(mpz_t **array, const uint32_t n, const uint32_t vecSize) { for (uint32_t i = 0; i < n; i++) { clear_del_vec(array[i], vecSize); } delete[] array; }
//Refer to apps_sfdl_gen/cql_rw_si_cons.h for constants to use when generating input. // this name stands for cql read/write select insert. void cql_rw_siVerifierInpGenHw::create_input(mpq_t* input_q, int num_inputs) { srand(time(NULL)); mpq_t* full_db_handle; int num_ints = sizeof(Student_handle_t) / sizeof(uint64_t); alloc_init_vec(&full_db_handle, num_ints); Student_handle_t handle; if (generate_states) { // SIZE should be a power of 2. int number_of_rows = SIZE - 1; // get the full handle of a DB. handle = create_db(number_of_rows, ("prover_1_" + shared_bstore_file_name).c_str()); uint64_t* input_ptr = (uint64_t*)&handle; for(int i = 0; i < num_ints; i++) { mpq_set_ui(full_db_handle[i], input_ptr[i], 1); } dump_vector(num_ints, full_db_handle, "db_handle", FOLDER_PERSIST_STATE); } else { // import the root hash from a place. load_vector(num_ints, full_db_handle, "db_handle", FOLDER_PERSIST_STATE); uint64_t* input_ptr = (uint64_t*)&handle; for(int i = 0; i < num_ints; i++) { input_ptr[i] = mpz_get_ui(mpq_numref(full_db_handle[i])); } } struct In input; Student_handle_t empty_handle; memset(&input, 0, sizeof(input)); // get a succinct handle of a DB using hashput. char db_file_path[BUFLEN]; snprintf(db_file_path, BUFLEN - 1, "%s/block_stores/prover_1_%s", FOLDER_STATE, shared_bstore_file_name.c_str()); HashBlockStore* bs = new ConfigurableBlockStore(db_file_path); hashput2(bs, &(input.db_handle), &handle); delete bs; // assign it to input_q uint64_t* input_ptr = (uint64_t*)&input.db_handle; int number_of_hash_elements = sizeof(hash_t) / sizeof(uint64_t); for(int i = 0; i < number_of_hash_elements; i++) { mpq_set_ui(input_q[i], input_ptr[i], 1); } for (int i = number_of_hash_elements; i < num_inputs; i++) { mpq_set_ui(input_q[i], rand(), 1); } clear_del_vec(full_db_handle, num_ints); }
int main (int argc, char* argv[]) { if (argc <= 2) { print_usage(argv); exit(1); } struct comp_params p = parse_params("./bin/" + string(NAME) + ".params"); mpz_t prime; mpz_init_set_str(prime, "21888242871839275222246405745257275088548364400416034343698204186575808495617", 10); if (!strcmp(argv[1], "setup")) { if (argc != 4 && argc != 5) { print_usage(argv); exit(1); } string verification_key_fn = std::string(v_dir) + argv[2]; string proving_key_fn = std::string(p_dir) + argv[3]; string unprocessed_vkey_fn; if (argc == 5) { unprocessed_vkey_fn = std::string(v_dir) + argv[4]; } std::cout << "Creating proving/verification keys, will write to " << verification_key_fn << ", " << proving_key_fn << std::endl; run_setup(p.n_constraints, p.n_inputs, p.n_outputs, p.n_vars, prime, verification_key_fn, proving_key_fn, unprocessed_vkey_fn); } else if (!strcmp(argv[1], "gen_input")) { if (argc < 3) { print_usage(argv); exit(1); } std::string input_filename = std::string(shared_dir) + argv[2]; std::cout << "Generating inputs, will write to " << input_filename << std::endl; mpq_t * input_q; alloc_init_vec(&input_q, p.n_inputs); gen_input(input_q, p.n_inputs, argv); std::ofstream inputs_file(input_filename); for (int i = 0; i < p.n_inputs; i++) { inputs_file << input_q[i] << std::endl; } inputs_file.close(); clear_del_vec(input_q, p.n_inputs); } else if(!strcmp(argv[1], "verify")) { if(argc != 6) { print_usage(argv); exit(1); } std::string verification_key_fn = std::string(v_dir) + argv[2]; std::string inputs_fn = std::string(shared_dir) + argv[3]; std::string outputs_fn = std::string(shared_dir) + argv[4]; std::string proof_fn = std::string(shared_dir) + argv[5]; verify(verification_key_fn, inputs_fn, outputs_fn, proof_fn, p.n_inputs, p.n_outputs, prime); } else { print_usage(argv); exit(1); } }