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 AcirProgram program{ constraint_system, updated_witness_values };
172 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
190 std::vector<size_t> num_gates;
195 Base::generate_constraints(valid_constraint, valid_witness_values);
197 for (
auto [predicate_case, label] :
199 vinfo(
"Testing vk independence for predicate case: ", label);
206 .invalid_witness = InvalidWitnessTarget::None };
207 auto [updated_constraint, updated_witness_values] =
213 std::shared_ptr<VerificationKey> vk_from_witness;
215 AcirProgram program{ constraint_system, updated_witness_values };
216 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
217 num_gates.emplace_back(
builder.get_num_finalized_gates_inefficient());
224 EXPECT_FALSE(
builder.failed());
227 std::shared_ptr<VerificationKey> vk_from_constraint;
230 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
235 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks for predicate case " << label;
236 vinfo(
"VK independence passed for predicate case: ", label);
258 Base::generate_constraints(constraint, witness_values);
264 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
265 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
270 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
274 bool circuit_check_failed = !circuit_checker_result;
275 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
276 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
277 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
278 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
298 Base::generate_constraints(constraint, witness_values);
304 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
305 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
310 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
314 bool circuit_check_failed = !circuit_checker_result;
315 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
316 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
317 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
318 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
334 Base::generate_constraints(constraint, witness_values);
336 for (
auto [invalid_witness_target, target_label] :
337 zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
338 vinfo(
"Testing invalid witness target: ", target_label);
340 auto [circuit_checker_result, builder_failed, _] =
343 EXPECT_TRUE(circuit_checker_result) <<
"Check builder failed for invalid witness target " + target_label;
344 EXPECT_FALSE(builder_failed) <<
"Builder failed for invalid witness target " + target_label;
345 vinfo(
"Passed invalid witness target: ", target_label);
366 Base::generate_constraints(constraint, witness_values);
368 for (
auto [invalid_witness_target, target_label] :
369 zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
370 vinfo(
"Testing invalid witness target: ", target_label);
372 auto [circuit_checker_result, builder_failed, _] =
375 EXPECT_TRUE(circuit_checker_result) <<
"Check builder failed for invalid witness target " + target_label;
376 EXPECT_FALSE(builder_failed) <<
"Builder failed for invalid witness target " + target_label;
377 vinfo(
"Passed invalid witness target: ", target_label);
380 if (invalid_witness_target != InvalidWitnessTarget::None) {
382 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(
387 bool circuit_check_failed = !circuit_checker_result;
388 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
389 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
390 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
392 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " + target_label;
393 vinfo(
"Passed invalid witness target (witness true confirmation): ", target_label);
414 std::vector<std::string> error_msgs;
419 Base::generate_constraints(constraint, witness_values);
421 for (
auto [predicate_case, predicate_label] :
423 for (
auto [target, label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
424 auto [circuit_checker_result, builder_failed, builder_err] =
426 error_msgs.emplace_back(builder_err);
430 if (target != InvalidWitnessTarget::None) {
431 bool circuit_check_failed = !circuit_checker_result;
432 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
433 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
434 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness "
436 label +
" with predicate " + predicate_label;
437 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly for invalid witness target " +
438 label +
" with predicate " + predicate_label;
440 EXPECT_TRUE(circuit_checker_result)
441 <<
"Circuit checker failed unexpectedly for invalid witness target " + label +
442 " with predicate " + predicate_label;
443 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " +
444 label +
" with predicate " + predicate_label;
448 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed unexpectedly for invalid witness "
450 label +
" with predicate " + predicate_label;
451 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " + label +
452 " with predicate " + predicate_label;
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