6#include "gtest/gtest.h"
21template <
typename Inval
idWitnessTarget>
struct Predicate {
30 std::vector<std::string>
static get_labels() {
return {
"ConstantTrue",
"WitnessTrue",
"WitnessFalse" }; }
49 typename T::InvalidWitness;
50 typename T::InvalidWitness::Target;
51 typename T::AcirConstraint;
57 { T::InvalidWitness::Target::None };
64 requires requires(
typename T::AcirConstraint constraint,
66 const typename T::InvalidWitness::Target& invalid_witness_target) {
78 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
82 requires requires(
typename T::AcirConstraint& constraint,
WitnessVector& witness_values) {
125 auto [invalid_constraint, invalid_witness_values] =
126 Base::invalidate_witness(constraint, witness_values,
mode.invalid_witness);
128 switch (
mode.test_case) {
131 invalid_witness_values.pop_back();
137 invalid_witness_values[invalid_constraint.predicate.index] =
bb::fr(0);
141 return { invalid_constraint, invalid_witness_values };
165 .invalid_witness = invalid_witness_target };
166 auto [updated_constraint, updated_witness_values] =
171 updated_constraint,
static_cast<uint32_t
>(updated_witness_values.size()) - 1);
172 AcirProgram program{ constraint_system, updated_witness_values };
173 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
191 std::vector<size_t> num_gates;
196 Base::generate_constraints(valid_constraint, valid_witness_values);
198 for (
auto [predicate_case, label] :
200 vinfo(
"Testing vk independence for predicate case: ", label);
207 .invalid_witness = InvalidWitnessTarget::None };
208 auto [updated_constraint, updated_witness_values] =
213 updated_constraint,
static_cast<uint32_t
>(updated_witness_values.size()) - 1);
215 std::shared_ptr<VerificationKey> vk_from_witness;
217 AcirProgram program{ constraint_system, updated_witness_values };
218 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
219 num_gates.emplace_back(
builder.get_num_finalized_gates_inefficient());
226 EXPECT_FALSE(
builder.failed());
229 std::shared_ptr<VerificationKey> vk_from_constraint;
232 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
237 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks for predicate case " << label;
238 vinfo(
"VK independence passed for predicate case: ", label);
260 Base::generate_constraints(constraint, witness_values);
266 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
267 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
272 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
276 bool circuit_check_failed = !circuit_checker_result;
277 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
278 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
279 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
280 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
300 Base::generate_constraints(constraint, witness_values);
306 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
307 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
312 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
316 bool circuit_check_failed = !circuit_checker_result;
317 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
318 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
319 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
320 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
336 Base::generate_constraints(constraint, witness_values);
338 for (
auto [invalid_witness_target, target_label] :
339 zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
340 vinfo(
"Testing invalid witness target: ", target_label);
342 auto [circuit_checker_result, builder_failed, _] =
345 EXPECT_TRUE(circuit_checker_result) <<
"Check builder failed for invalid witness target " + target_label;
346 EXPECT_FALSE(builder_failed) <<
"Builder failed for invalid witness target " + target_label;
347 vinfo(
"Passed invalid witness target: ", target_label);
368 Base::generate_constraints(constraint, witness_values);
370 for (
auto [invalid_witness_target, target_label] :
371 zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
372 vinfo(
"Testing invalid witness target: ", target_label);
374 auto [circuit_checker_result, builder_failed, _] =
377 EXPECT_TRUE(circuit_checker_result) <<
"Check builder failed for invalid witness target " + target_label;
378 EXPECT_FALSE(builder_failed) <<
"Builder failed for invalid witness target " + target_label;
379 vinfo(
"Passed invalid witness target: ", target_label);
382 if (invalid_witness_target != InvalidWitnessTarget::None) {
384 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
389 bool circuit_check_failed = !circuit_checker_result;
390 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
391 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
392 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
394 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " + target_label;
395 vinfo(
"Passed invalid witness target (witness true confirmation): ", target_label);
416 std::vector<std::string> error_msgs;
421 Base::generate_constraints(constraint, witness_values);
423 for (
auto [predicate_case, predicate_label] :
425 for (
auto [target, label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
426 auto [circuit_checker_result, builder_failed, builder_err] =
428 error_msgs.emplace_back(builder_err);
432 if (target != InvalidWitnessTarget::None) {
433 bool circuit_check_failed = !circuit_checker_result;
434 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
435 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
436 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness "
438 label +
" with predicate " + predicate_label;
439 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly for invalid witness target " +
440 label +
" with predicate " + predicate_label;
442 EXPECT_TRUE(circuit_checker_result)
443 <<
"Circuit checker failed unexpectedly for invalid witness target " + label +
444 " with predicate " + predicate_label;
445 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " +
446 label +
" with predicate " + predicate_label;
450 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed unexpectedly for invalid witness "
452 label +
" with predicate " + predicate_label;
453 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " + label +
454 " with predicate " + predicate_label;
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
Base Native verification key class.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept