From 84d1e5b519e8b2f05988febb898a318deb6dfaef Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Fri, 4 Dec 2015 21:16:59 -0700 Subject: [PATCH] Added puzzle solution --- src/gadget.hpp | 4 +++- src/gadget.tcc | 11 +++++++++-- src/snark.hpp | 3 ++- src/snark.tcc | 6 ++++-- src/test.cpp | 7 ++++--- 5 files changed, 22 insertions(+), 9 deletions(-) diff --git a/src/gadget.hpp b/src/gadget.hpp index e6250db..50a973e 100644 --- a/src/gadget.hpp +++ b/src/gadget.hpp @@ -13,11 +13,13 @@ public: std::shared_ptr > unpack_inputs; /* multipacking gadget */ std::vector> puzzle_values; + std::vector> solution_values; l_gadget(protoboard &pb, unsigned int n); void generate_r1cs_constraints(); - void generate_r1cs_witness(std::vector &puzzle_values); + void generate_r1cs_witness(std::vector &puzzle_values, + std::vector &input_solution_values); }; template diff --git a/src/gadget.tcc b/src/gadget.tcc index f7a8558..b910c4f 100644 --- a/src/gadget.tcc +++ b/src/gadget.tcc @@ -12,9 +12,11 @@ l_gadget::l_gadget(protoboard &pb, unsigned int n) : } puzzle_values.resize(n*n); + solution_values.resize(n*n); 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()); } @@ -29,12 +31,17 @@ void l_gadget::generate_r1cs_constraints() } template -void l_gadget::generate_r1cs_witness(std::vector &input_puzzle_values) +void l_gadget::generate_r1cs_witness(std::vector &input_puzzle_values, + std::vector &input_solution_values + ) { assert(input_puzzle_values.size() == dimension*dimension); + assert(input_solution_values.size() == dimension*dimension); for (unsigned int i = 0; i < dimension*dimension; i++) { 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]); + solution_values[i].fill_with_bits(this->pb, input_solution_values[i]); } unpack_inputs->generate_r1cs_witness_from_bits(); diff --git a/src/snark.hpp b/src/snark.hpp index 7216380..4e480e0 100644 --- a/src/snark.hpp +++ b/src/snark.hpp @@ -13,7 +13,8 @@ r1cs_ppzksnark_keypair generate_keypair(); template boost::optional> generate_proof(r1cs_ppzksnark_proving_key proving_key, - std::vector &puzzle + std::vector &puzzle, + std::vector &solution ); template diff --git a/src/snark.tcc b/src/snark.tcc index 485cc3f..946b16c 100644 --- a/src/snark.tcc +++ b/src/snark.tcc @@ -40,7 +40,8 @@ r1cs_ppzksnark_keypair generate_keypair() template boost::optional> generate_proof(r1cs_ppzksnark_proving_key proving_key, - vector &puzzle + vector &puzzle, + vector &solution ) { typedef Fr FieldT; @@ -50,8 +51,9 @@ boost::optional> generate_proof(r1cs_ppzksna g.generate_r1cs_constraints(); 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()) { return boost::none; diff --git a/src/test.cpp b/src/test.cpp index 4053117..dd81f83 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -20,16 +20,17 @@ int main() bool run_test(r1cs_ppzksnark_keypair& keypair ) { - vector v(81, 0); + vector puzzle(81, 0); + vector solution(81, 1); cout << "Trying to generate proof..." << endl; - auto proof = generate_proof(keypair.pk, v); + auto proof = generate_proof(keypair.pk, puzzle, solution); cout << "Proof generated!" << endl; if (!proof) { return false; } else { - assert(verify_proof(keypair.vk, *proof, v)); + assert(verify_proof(keypair.vk, *proof, puzzle)); return true; } }