7#include "gtest/gtest.h"
19template <
typename T,
typename Alloc>
struct is_std_vector<
std::vector<T, Alloc>> : std::true_type {};
54 .linear_combinations = {},
59 expr.q_c = input.
value.to_buffer();
62 expr.linear_combinations.push_back(
80 .linear_combinations = {},
120 uint32_t
id =
static_cast<uint32_t
>(calldata_id);
142 uint32_t block_id = 0)
144 std::vector<Acir::Opcode> opcodes;
147 std::vector<Acir::Witness> init_witnesses;
148 init_witnesses.reserve(constraint.
init.size());
149 for (
const auto& init_val : constraint.
init) {
161 for (
const auto& mem_op : constraint.
trace) {
179 if (mul_quad.
a != bb::stdlib::IS_CONSTANT && mul_quad.
b != bb::stdlib::IS_CONSTANT &&
220 if (constraint.is_xor_gate) {
226 .num_bits = constraint.num_bits,
235 .num_bits = constraint.num_bits,
243 .num_bits = constraint.num_bits,
246 std::vector<Acir::FunctionInput>
inputs;
247 for (
const auto& input : constraint.inputs) {
251 for (
size_t i = 0; i < 16; ++i) {
255 for (
size_t i = 0; i < 16; ++i) {
258 std::vector<Acir::Witness> outputs;
259 for (
const auto& out : constraint.outputs) {
271 for (
size_t i = 0; i < 16; ++i) {
275 for (
size_t i = 0; i < 8; ++i) {
279 for (
size_t i = 0; i < 8; ++i) {
285 .hash_values = hash_values,
290 for (
size_t i = 0; i < 32; ++i) {
294 for (
size_t i = 0; i < 64; ++i) {
298 for (
size_t i = 0; i < 32; ++i) {
302 for (
size_t i = 0; i < 32; ++i) {
311 .public_key_y = public_key_y,
312 .signature = signature,
313 .hashed_message = hashed_message,
314 .predicate = predicate,
322 .public_key_y = public_key_y,
323 .signature = signature,
324 .hashed_message = hashed_message,
325 .predicate = predicate,
329 std::vector<Acir::FunctionInput>
inputs;
330 for (
const auto& input : constraint.inputs) {
334 for (
size_t i = 0; i < 32; ++i) {
343 std::vector<Acir::FunctionInput>
inputs;
344 for (
const auto& input : constraint.inputs) {
348 for (
size_t i = 0; i < 32; ++i) {
358 for (
size_t i = 0; i < 25; ++i) {
362 for (
size_t i = 0; i < 25; ++i) {
371 std::vector<Acir::FunctionInput>
inputs;
372 for (
const auto& input : constraint.state) {
375 std::vector<Acir::Witness> outputs;
376 for (
const auto& out : constraint.result) {
386 std::vector<Acir::FunctionInput> points;
387 for (
const auto& pt : constraint.points) {
390 std::vector<Acir::FunctionInput> scalars;
391 for (
const auto& sc : constraint.scalars) {
428 std::vector<Acir::FunctionInput> verification_key;
429 for (
const auto& key_idx : constraint.key) {
432 std::vector<Acir::FunctionInput> proof;
433 for (
const auto& proof_idx : constraint.proof) {
436 std::vector<Acir::FunctionInput> public_inputs;
437 for (
const auto& pub_input_idx : constraint.public_inputs) {
445 .public_inputs =
std::move(public_inputs),
447 .proof_type = constraint.proof_type,
456 .linear_combinations = {},
457 .q_c = constraint.const_scaling.to_buffer(),
467 .linear_combinations = {},
468 .q_c = constraint[0].const_scaling.to_buffer(),
471 for (
const auto& mul_quad : constraint) {
495 .private_parameters = {},
498 .assert_messages = {},
517 std::vector<Acir::Opcode> opcodes;
519 if constexpr (is_std_vector_v<ConstraintType>) {
521 for (
const auto& c : constraint) {
523 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
549 typename T::AcirConstraint;
550 typename T::InvalidWitness;
551 typename T::InvalidWitness::Target;
557 { T::InvalidWitness::Target::None };
564 requires requires(T&
instance,
typename T::AcirConstraint& constraint,
WitnessVector& witness_values) {
579 typename T::AcirConstraint constraint,
581 const typename T::InvalidWitness::Target& invalid_witness_target) {
590 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
621 auto [updated_constraint, updated_witness_values] =
622 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
626 AcirProgram program{ constraint_system, updated_witness_values };
627 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
645 size_t num_gates = 0;
650 Base::generate_constraints(constraint, witness_values);
656 std::shared_ptr<VerificationKey> vk_from_witness;
658 AcirProgram program{ constraint_system, witness_values };
659 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
660 num_gates =
builder.get_num_finalized_gates_inefficient();
667 EXPECT_FALSE(
builder.failed());
670 std::shared_ptr<VerificationKey> vk_from_constraint;
673 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
678 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks";
690 std::vector<std::string> error_msgs;
695 Base::generate_constraints(constraint, witness_values);
697 for (
auto [target, label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
698 auto [circuit_checker_result, builder_failed, builder_err] =
700 error_msgs.emplace_back(builder_err);
702 if (target != InvalidWitness::Target::None) {
703 bool circuit_check_failed = !circuit_checker_result;
704 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
705 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
706 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
708 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " + label;
710 EXPECT_TRUE(circuit_checker_result)
711 <<
"Circuit checker failed unexpectedly for invalid witness target " + label;
712 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " + label;
std::shared_ptr< Napi::ThreadSafeFunction > instance
Base Native verification key class.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
FixedVKAndHash_< PrecomputedEntities< Commitment >, FF, typename constraining::AvmHardCodedVKAndHash > VerificationKey
Verification key of the AVM. It is fixed and reconstructed from precomputed values.
ProverInstance_< UltraKeccakFlavor > ProverInstance
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)