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::vector<pb_variable_array<FieldT>> puzzle_values;
std::vector<pb_variable_array<FieldT>> solution_values;
l_gadget(protoboard<FieldT> &pb, unsigned int n);
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>

View File

@ -12,9 +12,11 @@ l_gadget<FieldT>::l_gadget(protoboard<FieldT> &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<FieldT>::generate_r1cs_constraints()
}
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_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();

View File

@ -13,7 +13,8 @@ r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair();
template<typename ppzksnark_ppT>
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>

View File

@ -40,7 +40,8 @@ r1cs_ppzksnark_keypair<ppzksnark_ppT> generate_keypair()
template<typename ppzksnark_ppT>
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;
@ -50,8 +51,9 @@ boost::optional<r1cs_ppzksnark_proof<ppzksnark_ppT>> 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;

View File

@ -20,16 +20,17 @@ int main()
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;
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;
if (!proof) {
return false;
} else {
assert(verify_proof(keypair.vk, *proof, v));
assert(verify_proof(keypair.vk, *proof, puzzle));
return true;
}
}