Added puzzle solution
This commit is contained in:
parent
86beff8c7f
commit
84d1e5b519
|
@ -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>
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue