13#include "gtest/gtest.h"
28template <
typename Inval
idWitnessTarget>
struct Predicate {
37 std::vector<std::string>
static get_labels() {
return {
"ConstantTrue",
"WitnessTrue",
"WitnessFalse" }; }
56 typename T::InvalidWitness;
57 typename T::InvalidWitness::Target;
58 typename T::AcirConstraint;
64 { T::InvalidWitness::Target::None };
71 requires requires(
typename T::AcirConstraint& constraint,
73 const typename T::InvalidWitness::Target& invalid_witness_target) {
82 { T::invalidate_witness(constraint, witness_values, invalid_witness_target) } ->
std::same_as<void>;
115 switch (
mode.test_case) {
118 witness_values.pop_back();
124 witness_values[constraint.predicate.index] =
bb::fr(0);
128 Base::invalidate_witness(constraint, witness_values,
mode.invalid_witness);
138 Base::generate_constraints(constraint, witness_values);
141 return { constraint, witness_values };
162 .invalid_witness = invalid_witness_target };
167 constraint,
static_cast<uint32_t
>(witness_values.size()) - 1);
169 AcirProgram program{ constraint_system, witness_values };
170 auto builder = create_circuit<Builder>(program);
188 std::vector<size_t> num_gates;
190 for (
auto [predicate_case, label] :
192 vinfo(
"Testing vk independence for predicate case: ", label);
196 .invalid_witness = InvalidWitnessTarget::None };
201 constraint,
static_cast<uint32_t
>(witness_values.size()) - 1);
204 std::shared_ptr<VerificationKey> vk_from_witness;
206 AcirProgram program{ constraint_system, witness_values };
207 auto builder = create_circuit<Builder>(program);
208 num_gates.emplace_back(
builder.get_num_finalized_gates_inefficient());
217 std::shared_ptr<VerificationKey> vk_from_constraint;
220 auto builder = create_circuit<Builder>(program);
225 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks for predicate case " << label;
226 vinfo(
"VK independence passed for predicate case: ", label);
247 auto [circuit_checker_result, builder_failed, _] =
249 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
250 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
255 auto [circuit_checker_result, builder_failed, builder_err] =
259 bool circuit_check_failed = !circuit_checker_result;
260 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
261 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
262 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
263 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
282 auto [circuit_checker_result, builder_failed, _] =
284 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed.";
285 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly.";
290 auto [circuit_checker_result, builder_failed, builder_err] =
294 bool circuit_check_failed = !circuit_checker_result;
295 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
296 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
297 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure.";
298 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly.";
311 for (
auto [invalid_witness_target, target_label] :
312 zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
313 vinfo(
"Testing invalid witness target: ", target_label);
315 auto [circuit_checker_result, builder_failed, _] =
318 EXPECT_TRUE(circuit_checker_result) <<
"Check builder failed for invalid witness target " + target_label;
319 EXPECT_FALSE(builder_failed) <<
"Builder failed for invalid witness target " + target_label;
320 vinfo(
"Passed invalid witness target: ", target_label);
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);
350 if (invalid_witness_target != InvalidWitnessTarget::None) {
352 auto [circuit_checker_result, builder_failed, builder_err] =
357 bool circuit_check_failed = !circuit_checker_result;
358 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
359 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
360 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
362 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " + target_label;
363 vinfo(
"Passed invalid witness target (witness true confirmation): ", target_label);
384 std::vector<std::string> error_msgs;
385 for (
auto [predicate_case, predicate_label] :
387 for (
auto [target, label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
388 auto [circuit_checker_result, builder_failed, builder_err] =
test_constraints(predicate_case, target);
389 error_msgs.emplace_back(builder_err);
393 if (target != InvalidWitnessTarget::None) {
394 bool circuit_check_failed = !circuit_checker_result;
395 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
396 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
397 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness "
399 label +
" with predicate " + predicate_label;
400 EXPECT_TRUE(builder_failed) <<
"Builder succeeded unexpectedly for invalid witness target " +
401 label +
" with predicate " + predicate_label;
403 EXPECT_TRUE(circuit_checker_result)
404 <<
"Circuit checker failed unexpectedly for invalid witness target " + label +
405 " with predicate " + predicate_label;
406 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " +
407 label +
" with predicate " + predicate_label;
411 EXPECT_TRUE(circuit_checker_result) <<
"Circuit checker failed unexpectedly for invalid witness "
413 label +
" with predicate " + predicate_label;
414 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " + label +
415 " with predicate " + predicate_label;
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
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.
UltraKeccakFlavor::VerificationKey VerificationKey
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept