1#include <gtest/gtest.h>
40using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
48 EXPECT_EQ(
builder.num_gates(), EXPECTED_RESULT);
70 .num_acir_opcodes = 2,
72 .quad_constraints = { quad, quad },
79 auto builder = create_circuit<TypeParam>(program, metadata);
82 EXPECT_EQ(program.constraints.gates_per_opcode,
83 std::vector<size_t>({ QUAD<TypeParam>, QUAD<TypeParam> - ZERO_GATE - MEGA_OFFSET<TypeParam> }));
111 auto acir_program_bytes = acir_program.bincodeSerialize();
116 AcirProgram program{ constraint_system, witness_values };
118 auto builder = create_circuit<TypeParam>(program, metadata);
120 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BIG_QUAD<TypeParam> }));
137 .num_acir_opcodes = 1,
139 .logic_constraints = { logic_constraint },
146 auto builder = create_circuit<TypeParam>(program, metadata);
150 EXPECT_FALSE(
builder.failed());
152 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_XOR_32<TypeParam> }));
162 .is_xor_gate =
false,
169 .num_acir_opcodes = 1,
171 .logic_constraints = { logic_constraint },
178 auto builder = create_circuit<TypeParam>(program, metadata);
182 EXPECT_FALSE(
builder.failed());
184 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_AND_32<TypeParam> }));
198 .num_acir_opcodes = 1,
200 .range_constraints = { range_constraint },
207 auto builder = create_circuit<TypeParam>(program, metadata);
209 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ RANGE_32<TypeParam> }));
216 for (
size_t idx = 0; idx < 25; idx++) {
218 keccak_permutation.
result[idx] =
static_cast<uint32_t
>(idx) + 25;
227 for (
const auto& state : expected_state) {
228 witness.emplace_back(state);
233 .num_acir_opcodes = 1,
235 .keccak_permutations = { keccak_permutation },
243 auto builder = create_circuit<TypeParam>(program, metadata);
246 EXPECT_FALSE(
builder.failed());
248 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ KECCAK_PERMUTATION<TypeParam> }));
255 for (
size_t idx = 0; idx < 4; idx++) {
257 poseidon2_constraint.
result.emplace_back(
static_cast<uint32_t
>(idx) + 5);
264 .num_acir_opcodes = 1,
266 .poseidon2_constraints = { poseidon2_constraint },
274 auto builder = create_circuit<TypeParam>(program, metadata);
276 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ POSEIDON2_PERMUTATION<TypeParam> }));
283 for (
size_t i = 0; i < 16; ++i) {
286 for (
size_t i = 0; i < 8; ++i) {
289 for (
size_t i = 0; i < 8; ++i) {
290 sha256_compression.
result[i] =
static_cast<uint32_t
>(i) + 24;
297 .num_acir_opcodes = 1,
299 .sha256_compression = { sha256_compression },
306 auto builder = create_circuit<TypeParam>(program, metadata);
308 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ SHA256_COMPRESSION<TypeParam> }));
316 for (
size_t i = 0; i < 16; ++i) {
320 for (
size_t i = 0; i < 16; ++i) {
324 for (
size_t i = 0; i < 16; ++i) {
328 for (
size_t i = 0; i < 16; ++i) {
329 aes128_constraint.
outputs.push_back(
static_cast<uint32_t
>(i + 48));
336 .num_acir_opcodes = 1,
338 .aes128_constraints = { aes128_constraint },
345 auto builder = create_circuit<TypeParam>(program, metadata);
347 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ AES128_ENCRYPTION<TypeParam> }));
353 for (
size_t i = 0; i < 32; ++i) {
354 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
357 for (
size_t i = 0; i < 64; ++i) {
358 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
361 for (
size_t i = 0; i < 32; ++i) {
362 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
365 for (
size_t i = 0; i < 32; ++i) {
366 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
370 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
374 auto point = bb::curve::SECP256K1::AffineElement::one();
375 auto x_buffer = point.x.to_buffer();
376 auto y_buffer = point.y.to_buffer();
377 for (
size_t idx = 0; idx < 32; idx++) {
378 witness[idx + 96] = x_buffer[idx];
379 witness[idx + 128] = y_buffer[idx];
384 .num_acir_opcodes = 1,
386 .ecdsa_k1_constraints = { ecdsa_constraint },
393 auto builder = create_circuit<TypeParam>(program, metadata);
395 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256K1<TypeParam> }));
401 for (
size_t i = 0; i < 32; ++i) {
402 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
405 for (
size_t i = 0; i < 64; ++i) {
406 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
409 for (
size_t i = 0; i < 32; ++i) {
410 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
413 for (
size_t i = 0; i < 32; ++i) {
414 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
418 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
422 auto point = bb::curve::SECP256K1::AffineElement::one();
423 auto x_buffer = point.x.to_buffer();
424 auto y_buffer = point.y.to_buffer();
425 for (
size_t idx = 0; idx < 32; idx++) {
426 witness[idx + 96] = x_buffer[idx];
427 witness[idx + 128] = y_buffer[idx];
432 .num_acir_opcodes = 1,
434 .ecdsa_r1_constraints = { ecdsa_constraint },
441 auto builder = create_circuit<TypeParam>(program, metadata);
443 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256R1<TypeParam> }));
455 for (
size_t i = 0; i < 32; ++i) {
456 blake2s_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
463 .num_acir_opcodes = 1,
465 .blake2s_constraints = { blake2s_constraint },
472 auto builder = create_circuit<TypeParam>(program, metadata);
474 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE2S<TypeParam> }));
486 for (
size_t i = 0; i < 32; ++i) {
487 blake3_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
494 .num_acir_opcodes = 1,
496 .blake3_constraints = { blake3_constraint },
503 auto builder = create_circuit<TypeParam>(program, metadata);
505 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE3<TypeParam> }));
513 auto point = GrumpkinPoint::one();
533 witness[0] = point.x;
534 witness[1] = point.y;
536 witness[6] = point.x;
537 witness[7] = point.y;
542 .num_acir_opcodes = 1,
544 .multi_scalar_mul_constraints = { msm_constraint },
551 auto builder = create_circuit<TypeParam>(program, metadata);
553 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ MULTI_SCALAR_MUL<TypeParam> }));
561 auto point1 = GrumpkinPoint::one();
562 auto point2 = GrumpkinPoint::one();
564 EcAdd ec_add_constraint{
574 .result_infinite = 9,
579 witness[0] = point1.x;
580 witness[1] = point1.y;
583 witness[3] = point2.x;
584 witness[4] = point2.y;
587 witness[7] = point1.x;
588 witness[8] = point1.y;
593 .num_acir_opcodes = 1,
595 .ec_add_constraints = { ec_add_constraint },
602 auto builder = create_circuit<TypeParam>(program, metadata);
604 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ EC_ADD<TypeParam> }));
612 std::vector<uint32_t>
init;
626 .type = BlockType::ROM,
627 .calldata_id = CallDataType::None,
632 .num_acir_opcodes = 1,
634 .block_constraints = { block_constraint },
641 auto builder = create_circuit<TypeParam>(program, metadata);
643 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_ROM_READ<TypeParam> }));
651 std::vector<uint32_t>
init;
665 .type = BlockType::RAM,
666 .calldata_id = CallDataType::None,
671 .num_acir_opcodes = 1,
673 .block_constraints = { block_constraint },
680 auto builder = create_circuit<TypeParam>(program, metadata);
688 std::vector<uint32_t>
init;
702 .type = BlockType::RAM,
703 .calldata_id = CallDataType::None,
708 .num_acir_opcodes = 1,
710 .block_constraints = { block_constraint },
717 auto builder = create_circuit<TypeParam>(program, metadata);
719 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_WRITE<TypeParam> }));
725 GTEST_SKIP() <<
"CallData only supported on MegaCircuitBuilder";
731 std::vector<uint32_t>
init;
747 .type = BlockType::CallData,
748 .calldata_id = CallDataType::Primary,
753 .num_acir_opcodes = 1,
755 .block_constraints = { block_constraint },
762 auto builder = create_circuit<TypeParam>(program, metadata);
764 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
772 .type = BlockType::CallData,
773 .calldata_id = CallDataType::Secondary,
778 .num_acir_opcodes = 1,
780 .block_constraints = { block_constraint },
787 auto builder = create_circuit<TypeParam>(program, metadata);
789 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
796 GTEST_SKIP() <<
"ReturnData only supported on MegaCircuitBuilder";
802 std::vector<uint32_t>
init;
809 .type = BlockType::ReturnData,
810 .calldata_id = CallDataType::None,
815 .num_acir_opcodes = 1,
817 .block_constraints = { block_constraint },
827 auto builder = create_circuit<TypeParam>(program, metadata);
829 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[25]) 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