zkSNARK: Add constraint that the total value in a JoinSplit is a 64-bit integer.
This commit is contained in:
parent
59c3d926c6
commit
dbab243725
|
@ -23,6 +23,7 @@ private:
|
||||||
// Aux inputs
|
// Aux inputs
|
||||||
pb_variable<FieldT> ZERO;
|
pb_variable<FieldT> ZERO;
|
||||||
std::shared_ptr<digest_variable<FieldT>> zk_phi;
|
std::shared_ptr<digest_variable<FieldT>> zk_phi;
|
||||||
|
pb_variable_array<FieldT> zk_total_uint64;
|
||||||
|
|
||||||
// Input note gadgets
|
// Input note gadgets
|
||||||
boost::array<std::shared_ptr<input_note_gadget<FieldT>>, NumInputs> zk_input_notes;
|
boost::array<std::shared_ptr<input_note_gadget<FieldT>>, NumInputs> zk_input_notes;
|
||||||
|
@ -89,6 +90,8 @@ public:
|
||||||
|
|
||||||
zk_phi.reset(new digest_variable<FieldT>(pb, 252, ""));
|
zk_phi.reset(new digest_variable<FieldT>(pb, 252, ""));
|
||||||
|
|
||||||
|
zk_total_uint64.allocate(pb, 64);
|
||||||
|
|
||||||
for (size_t i = 0; i < NumInputs; i++) {
|
for (size_t i = 0; i < NumInputs; i++) {
|
||||||
// Input note gadget for commitments, hmacs, nullifiers,
|
// Input note gadget for commitments, hmacs, nullifiers,
|
||||||
// and spend authority.
|
// and spend authority.
|
||||||
|
@ -166,7 +169,20 @@ public:
|
||||||
right_side
|
right_side
|
||||||
));
|
));
|
||||||
|
|
||||||
// TODO: #854
|
// #854: Ensure that left_side is a 64-bit integer.
|
||||||
|
for (size_t i = 0; i < 64; i++) {
|
||||||
|
generate_boolean_r1cs_constraint<FieldT>(
|
||||||
|
this->pb,
|
||||||
|
zk_total_uint64[i],
|
||||||
|
""
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->pb.add_r1cs_constraint(r1cs_constraint<FieldT>(
|
||||||
|
1,
|
||||||
|
left_side,
|
||||||
|
packed_addition(zk_total_uint64)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,6 +218,19 @@ public:
|
||||||
uint64_to_bool_vector(vpub_new)
|
uint64_to_bool_vector(vpub_new)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
{
|
||||||
|
// Witness total_uint64 bits
|
||||||
|
uint64_t left_side_acc = vpub_old;
|
||||||
|
for (size_t i = 0; i < NumInputs; i++) {
|
||||||
|
left_side_acc += inputs[i].note.value;
|
||||||
|
}
|
||||||
|
|
||||||
|
zk_total_uint64.fill_with_bits(
|
||||||
|
this->pb,
|
||||||
|
uint64_to_bool_vector(left_side_acc)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// Witness phi
|
// Witness phi
|
||||||
zk_phi->bits.fill_with_bits(
|
zk_phi->bits.fill_with_bits(
|
||||||
this->pb,
|
this->pb,
|
||||||
|
@ -317,4 +346,4 @@ public:
|
||||||
integer.allocate(this->pb, 64, "");
|
integer.allocate(this->pb, 64, "");
|
||||||
packed_into.insert(packed_into.end(), integer.begin(), integer.end());
|
packed_into.insert(packed_into.end(), integer.begin(), integer.end());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue