1#include <gtest/gtest.h>
39using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
47 EXPECT_EQ(
builder.num_gates(), EXPECTED_RESULT);
69 .num_acir_opcodes = 2,
71 .quad_constraints = { quad, quad },
77 auto builder = create_circuit<TypeParam>(program, metadata);
80 EXPECT_EQ(program.constraints.gates_per_opcode,
81 std::vector<size_t>({ QUAD<TypeParam>, QUAD<TypeParam> - ZERO_GATE - MEGA_OFFSET<TypeParam> }));
109 auto acir_program_bytes = acir_program.bincodeSerialize();
114 AcirProgram program{ constraint_system, witness_values };
116 auto builder = create_circuit<TypeParam>(program, metadata);
118 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BIG_QUAD<TypeParam> }));
135 .num_acir_opcodes = 1,
137 .logic_constraints = { logic_constraint },
143 auto builder = create_circuit<TypeParam>(program, metadata);
147 EXPECT_FALSE(
builder.failed());
149 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_XOR_32<TypeParam> }));
159 .is_xor_gate =
false,
166 .num_acir_opcodes = 1,
168 .logic_constraints = { logic_constraint },
174 auto builder = create_circuit<TypeParam>(program, metadata);
178 EXPECT_FALSE(
builder.failed());
180 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_AND_32<TypeParam> }));
194 .num_acir_opcodes = 1,
196 .range_constraints = { range_constraint },
202 auto builder = create_circuit<TypeParam>(program, metadata);
204 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ RANGE_32<TypeParam> }));
211 for (
size_t idx = 0; idx < 25; idx++) {
213 keccak_permutation.
result[idx] =
static_cast<uint32_t
>(idx) + 25;
222 for (
const auto& state : expected_state) {
223 witness.emplace_back(state);
228 .num_acir_opcodes = 1,
230 .keccak_permutations = { keccak_permutation },
236 auto builder = create_circuit<TypeParam>(program, metadata);
239 EXPECT_FALSE(
builder.failed());
241 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ KECCAK_PERMUTATION<TypeParam> }));
248 for (
size_t idx = 0; idx < 4; idx++) {
250 poseidon2_constraint.
result.emplace_back(
static_cast<uint32_t
>(idx) + 5);
257 .num_acir_opcodes = 1,
259 .poseidon2_constraints = { poseidon2_constraint },
265 auto builder = create_circuit<TypeParam>(program, metadata);
267 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ POSEIDON2_PERMUTATION<TypeParam> }));
274 for (
size_t i = 0; i < 16; ++i) {
277 for (
size_t i = 0; i < 8; ++i) {
280 for (
size_t i = 0; i < 8; ++i) {
281 sha256_compression.
result[i] =
static_cast<uint32_t
>(i) + 24;
288 .num_acir_opcodes = 1,
290 .sha256_compression = { sha256_compression },
296 auto builder = create_circuit<TypeParam>(program, metadata);
298 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ SHA256_COMPRESSION<TypeParam> }));
306 for (
size_t i = 0; i < 16; ++i) {
310 for (
size_t i = 0; i < 16; ++i) {
314 for (
size_t i = 0; i < 16; ++i) {
318 for (
size_t i = 0; i < 16; ++i) {
319 aes128_constraint.
outputs.push_back(
static_cast<uint32_t
>(i + 48));
326 .num_acir_opcodes = 1,
328 .aes128_constraints = { aes128_constraint },
334 auto builder = create_circuit<TypeParam>(program, metadata);
336 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ AES128_ENCRYPTION<TypeParam> }));
342 for (
size_t i = 0; i < 32; ++i) {
343 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
346 for (
size_t i = 0; i < 64; ++i) {
347 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
350 for (
size_t i = 0; i < 32; ++i) {
351 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
354 for (
size_t i = 0; i < 32; ++i) {
355 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
359 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
363 auto point = bb::curve::SECP256K1::AffineElement::one();
364 auto x_buffer = point.x.to_buffer();
365 auto y_buffer = point.y.to_buffer();
366 for (
size_t idx = 0; idx < 32; idx++) {
367 witness[idx + 96] = x_buffer[idx];
368 witness[idx + 128] = y_buffer[idx];
373 .num_acir_opcodes = 1,
375 .ecdsa_k1_constraints = { ecdsa_constraint },
381 auto builder = create_circuit<TypeParam>(program, metadata);
383 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256K1<TypeParam> }));
389 for (
size_t i = 0; i < 32; ++i) {
390 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
393 for (
size_t i = 0; i < 64; ++i) {
394 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
397 for (
size_t i = 0; i < 32; ++i) {
398 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
401 for (
size_t i = 0; i < 32; ++i) {
402 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
406 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
410 auto point = bb::curve::SECP256K1::AffineElement::one();
411 auto x_buffer = point.x.to_buffer();
412 auto y_buffer = point.y.to_buffer();
413 for (
size_t idx = 0; idx < 32; idx++) {
414 witness[idx + 96] = x_buffer[idx];
415 witness[idx + 128] = y_buffer[idx];
420 .num_acir_opcodes = 1,
422 .ecdsa_r1_constraints = { ecdsa_constraint },
428 auto builder = create_circuit<TypeParam>(program, metadata);
430 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256R1<TypeParam> }));
442 for (
size_t i = 0; i < 32; ++i) {
443 blake2s_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
450 .num_acir_opcodes = 1,
452 .blake2s_constraints = { blake2s_constraint },
458 auto builder = create_circuit<TypeParam>(program, metadata);
460 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE2S<TypeParam> }));
472 for (
size_t i = 0; i < 32; ++i) {
473 blake3_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
480 .num_acir_opcodes = 1,
482 .blake3_constraints = { blake3_constraint },
488 auto builder = create_circuit<TypeParam>(program, metadata);
490 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE3<TypeParam> }));
498 auto point = GrumpkinPoint::one();
518 witness[0] = point.x;
519 witness[1] = point.y;
521 witness[6] = point.x;
522 witness[7] = point.y;
527 .num_acir_opcodes = 1,
529 .multi_scalar_mul_constraints = { msm_constraint },
535 auto builder = create_circuit<TypeParam>(program, metadata);
537 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ MULTI_SCALAR_MUL<TypeParam> }));
545 auto point1 = GrumpkinPoint::one();
546 auto point2 = GrumpkinPoint::one();
548 EcAdd ec_add_constraint{
558 .result_infinite = 9,
563 witness[0] = point1.x;
564 witness[1] = point1.y;
567 witness[3] = point2.x;
568 witness[4] = point2.y;
571 witness[7] = point1.x;
572 witness[8] = point1.y;
577 .num_acir_opcodes = 1,
579 .ec_add_constraints = { ec_add_constraint },
585 auto builder = create_circuit<TypeParam>(program, metadata);
587 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ EC_ADD<TypeParam> }));
595 std::vector<uint32_t>
init;
609 .type = BlockType::ROM,
610 .calldata_id = CallDataType::None,
615 .num_acir_opcodes = 1,
618 .block_constraints = { block_constraint },
624 auto builder = create_circuit<TypeParam>(program, metadata);
626 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_ROM_READ<TypeParam> }));
634 std::vector<uint32_t>
init;
648 .type = BlockType::RAM,
649 .calldata_id = CallDataType::None,
654 .num_acir_opcodes = 1,
657 .block_constraints = { block_constraint },
663 auto builder = create_circuit<TypeParam>(program, metadata);
671 std::vector<uint32_t>
init;
685 .type = BlockType::RAM,
686 .calldata_id = CallDataType::None,
691 .num_acir_opcodes = 1,
694 .block_constraints = { block_constraint },
700 auto builder = create_circuit<TypeParam>(program, metadata);
702 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_WRITE<TypeParam> }));
708 GTEST_SKIP() <<
"CallData only supported on MegaCircuitBuilder";
714 std::vector<uint32_t>
init;
730 .type = BlockType::CallData,
731 .calldata_id = CallDataType::Primary,
736 .num_acir_opcodes = 1,
739 .block_constraints = { block_constraint },
745 auto builder = create_circuit<TypeParam>(program, metadata);
747 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
755 .type = BlockType::CallData,
756 .calldata_id = CallDataType::Secondary,
761 .num_acir_opcodes = 1,
764 .block_constraints = { block_constraint },
770 auto builder = create_circuit<TypeParam>(program, metadata);
772 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
779 GTEST_SKIP() <<
"ReturnData only supported on MegaCircuitBuilder";
785 std::vector<uint32_t>
init;
792 .type = BlockType::ReturnData,
793 .calldata_id = CallDataType::None,
798 .num_acir_opcodes = 1,
801 .block_constraints = { block_constraint },
810 auto builder = create_circuit<TypeParam>(program, metadata);
812 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient(
false), BLOCK_RETURNDATA<TypeParam>);
static void SetUpTestSuite()
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Applies the Poseidon2 permutation function from https://eprint.iacr.org/2023/323.
group_elements::affine_element< Fq, Fr, Params > affine_element
void ethash_keccakf1600(uint64_t state[KECCAKF1600_LANES]) NOEXCEPT
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
std::vector< uint8_t > to_buffer(T const &value)
uint32_t current_witness_index
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
std::vector< Acir::Circuit > functions
static constexpr field neg_one()
static constexpr field one()
BB_INLINE std::vector< uint8_t > to_buffer() const