8#include "gtest/gtest.h"
20template <
typename T,
typename Alloc>
struct is_std_vector<
std::vector<T, Alloc>> : std::true_type {};
29template <
typename T>
inline constexpr bool needs_mega_classification<std::vector<T>> = needs_mega_classification<T>;
62 .linear_combinations = {},
67 expr.q_c = input.
value.to_buffer();
70 expr.linear_combinations.push_back(
101 uint32_t
id =
static_cast<uint32_t
>(calldata_id);
123 uint32_t block_id = 0)
125 std::vector<Acir::Opcode> opcodes;
128 std::vector<Acir::Witness> init_witnesses;
129 init_witnesses.reserve(constraint.
init.size());
130 for (
const auto& init_val : constraint.
init) {
142 for (
const auto& mem_op : constraint.
trace) {
160 if (mul_quad.
a != bb::stdlib::IS_CONSTANT && mul_quad.
b != bb::stdlib::IS_CONSTANT &&
201 if (constraint.is_xor_gate) {
207 .num_bits = constraint.num_bits,
216 .num_bits = constraint.num_bits,
224 .num_bits = constraint.num_bits,
227 std::vector<Acir::FunctionInput>
inputs;
228 for (
const auto& input : constraint.inputs) {
232 for (
size_t i = 0; i < 16; ++i) {
236 for (
size_t i = 0; i < 16; ++i) {
239 std::vector<Acir::Witness> outputs;
240 for (
const auto&
out : constraint.outputs) {
252 for (
size_t i = 0; i < 16; ++i) {
256 for (
size_t i = 0; i < 8; ++i) {
260 for (
size_t i = 0; i < 8; ++i) {
266 .hash_values = hash_values,
271 for (
size_t i = 0; i < 32; ++i) {
275 for (
size_t i = 0; i < 64; ++i) {
279 for (
size_t i = 0; i < 32; ++i) {
283 for (
size_t i = 0; i < 32; ++i) {
292 .public_key_y = public_key_y,
293 .signature = signature,
294 .hashed_message = hashed_message,
295 .predicate = predicate,
303 .public_key_y = public_key_y,
304 .signature = signature,
305 .hashed_message = hashed_message,
306 .predicate = predicate,
310 std::vector<Acir::FunctionInput>
inputs;
311 for (
const auto& input : constraint.inputs) {
315 for (
size_t i = 0; i < 32; ++i) {
324 std::vector<Acir::FunctionInput>
inputs;
325 for (
const auto& input : constraint.inputs) {
329 for (
size_t i = 0; i < 32; ++i) {
339 for (
size_t i = 0; i < 25; ++i) {
343 for (
size_t i = 0; i < 25; ++i) {
352 std::vector<Acir::FunctionInput>
inputs;
353 for (
const auto& input : constraint.state) {
356 std::vector<Acir::Witness> outputs;
357 for (
const auto&
out : constraint.result) {
367 std::vector<Acir::FunctionInput> points;
368 for (
const auto& pt : constraint.points) {
371 std::vector<Acir::FunctionInput> scalars;
372 for (
const auto& sc : constraint.scalars) {
405 std::vector<Acir::FunctionInput> verification_key;
406 for (
const auto& key_idx : constraint.key) {
409 std::vector<Acir::FunctionInput> proof;
410 for (
const auto& proof_idx : constraint.proof) {
413 std::vector<Acir::FunctionInput> public_inputs;
414 for (
const auto& pub_input_idx : constraint.public_inputs) {
422 .public_inputs =
std::move(public_inputs),
424 .proof_type = constraint.proof_type,
433 .linear_combinations = {},
434 .q_c = constraint.const_scaling.to_buffer(),
444 .linear_combinations = {},
445 .q_c = constraint[0].const_scaling.to_buffer(),
448 for (
const auto& mul_quad : constraint) {
459 if (!coeff.is_zero()) {
466 if (!constraint.q_m.is_zero()) {
467 expr.
mul_terms.push_back(std::make_tuple(constraint.q_m.to_buffer(),
471 if (!constraint.q_5.is_zero()) {
472 expr.
mul_terms.push_back(std::make_tuple(constraint.q_5.to_buffer(),
476 push_linear(expr, constraint.q_l, constraint.a);
477 push_linear(expr, constraint.q_r, constraint.b);
478 push_linear(expr, constraint.q_o, constraint.c);
479 push_linear(expr, constraint.q_4, constraint.d);
486 if (!coeff.is_zero()) {
492 std::vector<Acir::Opcode> opcodes;
494 push_linear(half_1, constraint.q_l, constraint.a);
495 push_linear(half_1, constraint.q_r, constraint.b);
498 if (!(constraint.q_o.is_zero() && constraint.q_4.is_zero() && constraint.q_m.is_zero())) {
500 push_linear(half_2, constraint.q_o, constraint.c);
501 push_linear(half_2, constraint.q_4, constraint.d);
524 .private_parameters = {},
527 .assert_messages = {},
546 std::vector<Acir::Opcode> opcodes;
548 if constexpr (is_std_vector_v<ConstraintType>) {
550 for (
const auto& c : constraint) {
552 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
560 constexpr bool is_mega = needs_mega_classification<ConstraintType>;
580 typename T::AcirConstraint;
581 typename T::InvalidWitness;
582 typename T::InvalidWitness::Target;
588 { T::InvalidWitness::Target::None };
595 requires requires(T& instance,
typename T::AcirConstraint& constraint,
WitnessVector& witness_values) {
609 requires requires(T& instance,
610 typename T::AcirConstraint constraint,
612 const typename T::InvalidWitness::Target& invalid_witness_target) {
621 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
652 auto [updated_constraint, updated_witness_values] =
653 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
657 AcirProgram program{ constraint_system, updated_witness_values };
658 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
676 size_t num_gates = 0;
681 Base::generate_constraints(constraint, witness_values);
687 std::shared_ptr<VerificationKey> vk_from_witness;
689 AcirProgram program{ constraint_system, witness_values };
690 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
691 num_gates =
builder.get_num_finalized_gates_inefficient();
698 EXPECT_FALSE(
builder.failed());
701 std::shared_ptr<VerificationKey> vk_from_constraint;
704 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
709 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) <<
"Mismatch in the vks";
721 std::vector<std::string> error_msgs;
726 Base::generate_constraints(constraint, witness_values);
728 for (
auto [
target,
label] :
zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
729 auto [circuit_checker_result, builder_failed, builder_err] =
731 error_msgs.emplace_back(builder_err);
733 if (
target != InvalidWitness::Target::None) {
734 bool circuit_check_failed = !circuit_checker_result;
735 bool assert_eq_error_present = (builder_err.find(
"assert_eq") != std::string::npos);
736 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
737 <<
"Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
739 EXPECT_TRUE(builder_failed) <<
"Builder succeeded for invalid witness target " +
label;
741 EXPECT_TRUE(circuit_checker_result)
742 <<
"Circuit checker failed unexpectedly for invalid witness target " +
label;
743 EXPECT_FALSE(builder_failed) <<
"Builder failed unexpectedly for invalid witness target " +
label;
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< Instruction > target
bb::VectorAffineElementPushSpan< BaseParams > out
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, 2 > > 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::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)