7#include "gtest/gtest.h"
19template <
typename T,
typename Alloc>
struct is_std_vector<
std::vector<T, Alloc>> : std::true_type {};
54 .linear_combinations = {},
62 expr.linear_combinations.push_back(
80 .linear_combinations = {},
130 uint32_t block_id = 0)
132 std::vector<Acir::Opcode> opcodes;
135 std::vector<Acir::Witness> init_witnesses;
136 init_witnesses.reserve(constraint.
init.size());
137 for (
const auto& init_val : constraint.
init) {
149 for (
const auto& mem_op : constraint.
trace) {
167 if (mul_quad.
a != bb::stdlib::IS_CONSTANT && mul_quad.
b != bb::stdlib::IS_CONSTANT &&
208 if (constraint.is_xor_gate) {
214 .num_bits = constraint.num_bits,
223 .num_bits = constraint.num_bits,
231 .num_bits = constraint.num_bits,
234 std::vector<Acir::FunctionInput>
inputs;
235 for (
const auto& input : constraint.inputs) {
239 for (
size_t i = 0; i < 16; ++i) {
243 for (
size_t i = 0; i < 16; ++i) {
246 std::vector<Acir::Witness> outputs;
247 for (
const auto& out : constraint.outputs) {
259 for (
size_t i = 0; i < 16; ++i) {
263 for (
size_t i = 0; i < 8; ++i) {
267 for (
size_t i = 0; i < 8; ++i) {
273 .hash_values = hash_values,
278 for (
size_t i = 0; i < 32; ++i) {
282 for (
size_t i = 0; i < 64; ++i) {
286 for (
size_t i = 0; i < 32; ++i) {
290 for (
size_t i = 0; i < 32; ++i) {
299 .public_key_y = public_key_y,
300 .signature = signature,
301 .hashed_message = hashed_message,
302 .predicate = predicate,
310 .public_key_y = public_key_y,
311 .signature = signature,
312 .hashed_message = hashed_message,
313 .predicate = predicate,
317 std::vector<Acir::FunctionInput>
inputs;
318 for (
const auto& input : constraint.inputs) {
322 for (
size_t i = 0; i < 32; ++i) {
331 std::vector<Acir::FunctionInput>
inputs;
332 for (
const auto& input : constraint.inputs) {
336 for (
size_t i = 0; i < 32; ++i) {
346 for (
size_t i = 0; i < 25; ++i) {
350 for (
size_t i = 0; i < 25; ++i) {
359 std::vector<Acir::FunctionInput>
inputs;
360 for (
const auto& input : constraint.state) {
363 std::vector<Acir::Witness> outputs;
364 for (
const auto& out : constraint.result) {
374 std::vector<Acir::FunctionInput> points;
375 for (
const auto& pt : constraint.points) {
378 std::vector<Acir::FunctionInput> scalars;
379 for (
const auto& sc : constraint.scalars) {
416 std::vector<Acir::FunctionInput> verification_key;
417 for (
const auto& key_idx : constraint.key) {
420 std::vector<Acir::FunctionInput> proof;
421 for (
const auto& proof_idx : constraint.proof) {
424 std::vector<Acir::FunctionInput> public_inputs;
425 for (
const auto& pub_input_idx : constraint.public_inputs) {
433 .public_inputs =
std::move(public_inputs),
435 .proof_type = constraint.proof_type,
444 .linear_combinations = {},
445 .q_c = constraint.const_scaling.to_buffer(),
455 .linear_combinations = {},
456 .q_c = constraint[0].const_scaling.to_buffer(),
459 for (
const auto& mul_quad : constraint) {
482 .current_witness_index = max_witness_index,
484 .private_parameters = {},
487 .assert_messages = {},
505template <
typename Constra
intType>
508 std::vector<Acir::Opcode> opcodes;
510 if constexpr (is_std_vector_v<ConstraintType>) {
512 for (
const auto& c : constraint) {
514 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
540 typename T::AcirConstraint;
541 typename T::InvalidWitness;
542 typename T::InvalidWitness::Target;
548 { T::InvalidWitness::Target::None };
555 requires requires(T&
instance,
typename T::AcirConstraint& constraint,
WitnessVector& witness_values) {
570 typename T::AcirConstraint constraint,
572 const typename T::InvalidWitness::Target& invalid_witness_target) {
581 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
612 auto [updated_constraint, updated_witness_values] =
613 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
617 updated_constraint,
static_cast<uint32_t
>(updated_witness_values.size()) - 1);
618 AcirProgram program{ constraint_system, updated_witness_values };
619 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
637 size_t num_gates = 0;
642 Base::generate_constraints(constraint, witness_values);
646 constraint,
static_cast<uint32_t
>(witness_values.size()) - 1);
649 std::shared_ptr<VerificationKey> vk_from_witness;
651 AcirProgram program{ constraint_system, witness_values };
652 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
653 num_gates =
builder.get_num_finalized_gates_inefficient();
660 EXPECT_FALSE(
builder.failed());
663 std::shared_ptr<VerificationKey> vk_from_constraint;
666 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
671 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks";
683 std::vector<std::string> error_msgs;
688 Base::generate_constraints(constraint, witness_values);
690 for (
auto [target, label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
691 auto [circuit_checker_result, builder_failed, builder_err] =
693 error_msgs.emplace_back(builder_err);
695 if (target != InvalidWitness::Target::None) {
696 bool circuit_check_failed = !circuit_checker_result;
697 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
698 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
699 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
701 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " + label;
703 EXPECT_TRUE(circuit_checker_result)
704 <<
"Circuit checker failed unexpectedly for invalid witness target " + label;
705 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " + label;
std::shared_ptr< Napi::ThreadSafeFunction > instance
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.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::vector< uint8_t > to_buffer(T const &value)
std::vector< Acir::FunctionInput > inputs
std::vector< Acir::FunctionInput > inputs
std::vector< Acir::FunctionInput > inputs
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input1
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
std::vector< Acir::FunctionInput > points
std::vector< Acir::FunctionInput > inputs
Acir::FunctionInput input
std::vector< Acir::FunctionInput > verification_key
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
std::variant< Memory, CallData, ReturnData > value
std::string function_name
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Acir::Expression operation
Acir::BlackBoxFuncCall value
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
static constexpr field one()
BB_INLINE constexpr bool is_zero() const noexcept
BB_INLINE std::vector< uint8_t > to_buffer() const
static constexpr field zero()
void throw_or_abort(std::string const &err)