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::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>
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue