Added puzzle solution

This commit is contained in:
Sean Bowe 2015-12-04 21:16:59 -07:00
parent 86beff8c7f
commit 84d1e5b519
5 changed files with 22 additions and 9 deletions

View File

@ -13,11 +13,13 @@ public:
std::shared_ptr<multipacking_gadget<FieldT> > unpack_inputs; /* multipacking gadget */ std::shared_ptr<multipacking_gadget<FieldT> > unpack_inputs; /* multipacking gadget */
std::vector<pb_variable_array<FieldT>> puzzle_values; std::vector<pb_variable_array<FieldT>> puzzle_values;
std::vector<pb_variable_array<FieldT>> solution_values;
l_gadget(protoboard<FieldT> &pb, unsigned int n); l_gadget(protoboard<FieldT> &pb, unsigned int n);
void generate_r1cs_constraints(); void generate_r1cs_constraints();
void generate_r1cs_witness(std::vector<bit_vector> &puzzle_values); void generate_r1cs_witness(std::vector<bit_vector> &puzzle_values,
std::vector<bit_vector> &input_solution_values);
}; };
template<typename FieldT> template<typename FieldT>

View File

@ -12,9 +12,11 @@ l_gadget<FieldT>::l_gadget(protoboard<FieldT> &pb, unsigned int n) :
} }
puzzle_values.resize(n*n); puzzle_values.resize(n*n);
solution_values.resize(n*n);
for (unsigned int i = 0; i < (n*n); i++) { for (unsigned int i = 0; i < (n*n); i++) {
puzzle_values[i].allocate(pb, 8, "puzzle_value[i]"); puzzle_values[i].allocate(pb, 8, "puzzle_values[i]");
solution_values[i].allocate(pb, 8, "solution_values[i]");
input_as_bits.insert(input_as_bits.end(), puzzle_values[i].begin(), puzzle_values[i].end()); input_as_bits.insert(input_as_bits.end(), puzzle_values[i].begin(), puzzle_values[i].end());
} }
@ -29,12 +31,17 @@ void l_gadget<FieldT>::generate_r1cs_constraints()
} }
template<typename FieldT> template<typename FieldT>
void l_gadget<FieldT>::generate_r1cs_witness(std::vector<bit_vector> &input_puzzle_values) void l_gadget<FieldT>::generate_r1cs_witness(std::vector<bit_vector> &input_puzzle_values,
std::vector<bit_vector> &input_solution_values
)
{ {
assert(input_puzzle_values.size() == dimension*dimension); assert(input_puzzle_values.size() == dimension*dimension);
assert(input_solution_values.size() == dimension*dimension);
for (unsigned int i = 0; i < dimension*dimension; i++) { for (unsigned int i = 0; i < dimension*dimension; i++) {
assert(input_puzzle_values[i].size() == 8); assert(input_puzzle_values[i].size() == 8);
assert(input_solution_values[i].size() == 8);
puzzle_values[i].fill_with_bits(this->pb, input_puzzle_values[i]); puzzle_values[i].fill_with_bits(this->pb, input_puzzle_values[i]);
solution_values[i].fill_with_bits(this->pb, input_solution_values[i]);
} }
unpack_inputs->generate_r1cs_witness_from_bits(); unpack_inputs->generate_r1cs_witness_from_bits();

View File

@ -13,7 +13,8 @@ r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
template<typename ppzksnark_ppT> template<typename ppzksnark_ppT>
boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key, boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key,
std::vector<uint8_t> &puzzle std::vector<uint8_t> &puzzle,
std::vector<uint8_t> &solution
); );
template<typename ppzksnark_ppT> template<typename ppzksnark_ppT>

View File

@ -40,7 +40,8 @@ r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair()
template<typename ppzksnark_ppT> template<typename ppzksnark_ppT>
boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key, boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksnark_proving_key<ppzksnark_ppT> proving_key,
vector<uint8_t> &puzzle vector<uint8_t> &puzzle,
vector<uint8_t> &solution
) )
{ {
typedef Fr<ppzksnark_ppT> FieldT; typedef Fr<ppzksnark_ppT> FieldT;
@ -50,8 +51,9 @@ boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> generate_proof(r1cs_ppzksna
g.generate_r1cs_constraints(); g.generate_r1cs_constraints();
auto new_puzzle = convertPuzzleToBool(puzzle); auto new_puzzle = convertPuzzleToBool(puzzle);
auto new_solution = convertPuzzleToBool(solution);
g.generate_r1cs_witness(new_puzzle); g.generate_r1cs_witness(new_puzzle, new_solution);
if (!pb.is_satisfied()) { if (!pb.is_satisfied()) {
return boost::none; return boost::none;

View File

@ -20,16 +20,17 @@ int main()
bool run_test(r1cs_ppzksnark_keypair<default_r1cs_ppzksnark_pp>& keypair bool run_test(r1cs_ppzksnark_keypair<default_r1cs_ppzksnark_pp>& keypair
) { ) {
vector<uint8_t> v(81, 0); vector<uint8_t> puzzle(81, 0);
vector<uint8_t> solution(81, 1);
cout << "Trying to generate proof..." << endl; cout << "Trying to generate proof..." << endl;
auto proof = generate_proof<default_r1cs_ppzksnark_pp>(keypair.pk, v); auto proof = generate_proof<default_r1cs_ppzksnark_pp>(keypair.pk, puzzle, solution);
cout << "Proof generated!" << endl; cout << "Proof generated!" << endl;
if (!proof) { if (!proof) {
return false; return false;
} else { } else {
assert(verify_proof(keypair.vk, *proof, v)); assert(verify_proof(keypair.vk, *proof, puzzle));
return true; return true;
} }
} }