1#include <gtest/gtest.h>
41using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
49 EXPECT_EQ(
builder.num_gates(), EXPECTED_RESULT);
75 auto builder = create_circuit<TypeParam>(program, metadata);
78 EXPECT_EQ(program.constraints.gates_per_opcode,
79 std::vector<size_t>({ QUAD<TypeParam>, QUAD<TypeParam> - ZERO_GATE - MEGA_OFFSET<TypeParam> }));
98 auto builder = create_circuit<TypeParam>(program, metadata);
102 EXPECT_FALSE(
builder.failed());
104 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_XOR_32<TypeParam> }));
114 .is_xor_gate =
false,
123 auto builder = create_circuit<TypeParam>(program, metadata);
127 EXPECT_FALSE(
builder.failed());
129 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ LOGIC_AND_32<TypeParam> }));
145 auto builder = create_circuit<TypeParam>(program, metadata);
147 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ RANGE_32<TypeParam> }));
154 for (
size_t idx = 0; idx < 25; idx++) {
156 keccak_permutation.
result[idx] =
static_cast<uint32_t
>(idx) + 25;
165 for (
const auto& state : expected_state) {
166 witness.emplace_back(state);
173 auto builder = create_circuit<TypeParam>(program, metadata);
176 EXPECT_FALSE(
builder.failed());
178 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ KECCAK_PERMUTATION<TypeParam> }));
185 for (
size_t idx = 0; idx < 4; idx++) {
187 poseidon2_constraint.
result.emplace_back(
static_cast<uint32_t
>(idx) + 4);
196 auto builder = create_circuit<TypeParam>(program, metadata);
198 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ POSEIDON2_PERMUTATION<TypeParam> }));
205 for (
size_t i = 0; i < 16; ++i) {
208 for (
size_t i = 0; i < 8; ++i) {
211 for (
size_t i = 0; i < 8; ++i) {
212 sha256_compression.
result[i] =
static_cast<uint32_t
>(i) + 24;
221 auto builder = create_circuit<TypeParam>(program, metadata);
223 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ SHA256_COMPRESSION<TypeParam> }));
231 for (
size_t i = 0; i < 16; ++i) {
235 for (
size_t i = 0; i < 16; ++i) {
239 for (
size_t i = 0; i < 16; ++i) {
243 for (
size_t i = 0; i < 16; ++i) {
244 aes128_constraint.
outputs.push_back(
static_cast<uint32_t
>(i + 48));
253 auto builder = create_circuit<TypeParam>(program, metadata);
255 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ AES128_ENCRYPTION<TypeParam> }));
261 for (
size_t i = 0; i < 32; ++i) {
262 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
265 for (
size_t i = 0; i < 64; ++i) {
266 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
269 for (
size_t i = 0; i < 32; ++i) {
270 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
273 for (
size_t i = 0; i < 32; ++i) {
274 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
278 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
282 auto point = bb::curve::SECP256K1::AffineElement::one();
283 auto x_buffer = point.x.to_buffer();
284 auto y_buffer = point.y.to_buffer();
285 for (
size_t idx = 0; idx < 32; idx++) {
286 witness[idx + 96] = x_buffer[idx];
287 witness[idx + 128] = y_buffer[idx];
294 auto builder = create_circuit<TypeParam>(program, metadata);
296 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256K1<TypeParam> }));
302 for (
size_t i = 0; i < 32; ++i) {
303 ecdsa_constraint.hashed_message[i] =
static_cast<uint32_t
>(i);
306 for (
size_t i = 0; i < 64; ++i) {
307 ecdsa_constraint.signature[i] =
static_cast<uint32_t
>(i + 32);
310 for (
size_t i = 0; i < 32; ++i) {
311 ecdsa_constraint.pub_x_indices[i] =
static_cast<uint32_t
>(i + 96);
314 for (
size_t i = 0; i < 32; ++i) {
315 ecdsa_constraint.pub_y_indices[i] =
static_cast<uint32_t
>(i + 128);
319 ecdsa_constraint.result =
static_cast<uint32_t
>(161);
323 auto point = bb::curve::SECP256K1::AffineElement::one();
324 auto x_buffer = point.x.to_buffer();
325 auto y_buffer = point.y.to_buffer();
326 for (
size_t idx = 0; idx < 32; idx++) {
327 witness[idx + 96] = x_buffer[idx];
328 witness[idx + 128] = y_buffer[idx];
335 auto builder = create_circuit<TypeParam>(program, metadata);
337 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ ECDSA_SECP256R1<TypeParam> }));
346 for (
size_t i = 0; i < 32; ++i) {
347 blake2s_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
356 auto builder = create_circuit<TypeParam>(program, metadata);
358 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE2S<TypeParam> }));
367 for (
size_t i = 0; i < 32; ++i) {
368 blake3_constraint.
result[i] =
static_cast<uint32_t
>(i + 1);
377 auto builder = create_circuit<TypeParam>(program, metadata);
379 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLAKE3<TypeParam> }));
405 witness[0] = point.x;
406 witness[1] = point.y;
407 witness[5] = point.x;
408 witness[6] = point.y;
414 auto builder = create_circuit<TypeParam>(program, metadata);
416 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ MULTI_SCALAR_MUL<TypeParam> }));
427 EcAdd ec_add_constraint{
439 witness[0] = point1.x;
440 witness[1] = point1.y;
442 witness[2] = point2.x;
443 witness[3] = point2.y;
445 witness[5] = point1.x;
446 witness[6] = point1.y;
452 auto builder = create_circuit<TypeParam>(program, metadata);
454 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ EC_ADD<TypeParam> }));
462 std::vector<uint32_t>
init;
476 .type = BlockType::ROM,
477 .calldata_id = CallDataType::None,
488 auto builder = create_circuit<TypeParam>(program, metadata);
490 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_ROM_READ<TypeParam> }));
498 std::vector<uint32_t>
init;
512 .type = BlockType::RAM,
513 .calldata_id = CallDataType::None,
524 auto builder = create_circuit<TypeParam>(program, metadata);
526 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_READ<TypeParam> }));
534 std::vector<uint32_t>
init;
548 .type = BlockType::RAM,
549 .calldata_id = CallDataType::None,
560 auto builder = create_circuit<TypeParam>(program, metadata);
562 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_WRITE<TypeParam> }));
568 GTEST_SKIP() <<
"CallData only supported on MegaCircuitBuilder";
574 std::vector<uint32_t>
init;
590 .type = BlockType::CallData,
591 .calldata_id = CallDataType::KernelCalldata,
602 auto builder = create_circuit<TypeParam>(program, metadata);
604 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
612 .type = BlockType::CallData,
613 .calldata_id = CallDataType::FirstAppCalldata,
624 auto builder = create_circuit<TypeParam>(program, metadata);
626 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
633 GTEST_SKIP() <<
"ReturnData only supported on MegaCircuitBuilder";
639 std::vector<uint32_t>
init;
646 .type = BlockType::ReturnData,
647 .calldata_id = CallDataType::None,
661 auto builder = create_circuit<TypeParam>(program, metadata);
663 EXPECT_EQ(
builder.get_num_finalized_gates_inefficient(), 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.
static constexpr affine_element one() noexcept
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)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static constexpr field neg_one()
static constexpr field one()