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> }));
387 auto point = GrumpkinPoint::one();
407 witness[0] = point.x;
408 witness[1] = point.y;
410 witness[6] = point.x;
411 witness[7] = point.y;
418 auto builder = create_circuit<TypeParam>(program, metadata);
420 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ MULTI_SCALAR_MUL<TypeParam> }));
428 auto point1 = GrumpkinPoint::one();
429 auto point2 = GrumpkinPoint::one();
431 EcAdd ec_add_constraint{
441 .result_infinite = 9,
446 witness[0] = point1.x;
447 witness[1] = point1.y;
450 witness[3] = point2.x;
451 witness[4] = point2.y;
454 witness[7] = point1.x;
455 witness[8] = point1.y;
462 auto builder = create_circuit<TypeParam>(program, metadata);
464 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ EC_ADD<TypeParam> }));
472 std::vector<uint32_t>
init;
486 .type = BlockType::ROM,
487 .calldata_id = CallDataType::None,
498 auto builder = create_circuit<TypeParam>(program, metadata);
500 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_ROM_READ<TypeParam> }));
508 std::vector<uint32_t>
init;
522 .type = BlockType::RAM,
523 .calldata_id = CallDataType::None,
534 auto builder = create_circuit<TypeParam>(program, metadata);
536 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_READ<TypeParam> }));
544 std::vector<uint32_t>
init;
558 .type = BlockType::RAM,
559 .calldata_id = CallDataType::None,
570 auto builder = create_circuit<TypeParam>(program, metadata);
572 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_RAM_WRITE<TypeParam> }));
578 GTEST_SKIP() <<
"CallData only supported on MegaCircuitBuilder";
584 std::vector<uint32_t>
init;
600 .type = BlockType::CallData,
601 .calldata_id = CallDataType::Primary,
612 auto builder = create_circuit<TypeParam>(program, metadata);
614 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
622 .type = BlockType::CallData,
623 .calldata_id = CallDataType::Secondary,
634 auto builder = create_circuit<TypeParam>(program, metadata);
636 EXPECT_EQ(program.constraints.gates_per_opcode, std::vector<size_t>({ BLOCK_CALLDATA<TypeParam> }));
643 GTEST_SKIP() <<
"ReturnData only supported on MegaCircuitBuilder";
649 std::vector<uint32_t>
init;
656 .type = BlockType::ReturnData,
657 .calldata_id = CallDataType::None,
671 auto builder = create_circuit<TypeParam>(program, metadata);
673 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)
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()