Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
gate_count_constants.hpp
Go to the documentation of this file.
1#pragma once
2
6#include <cstddef>
7#include <tuple>
8#include <type_traits>
9
10namespace acir_format {
11
12// ========================================
13// ACIR Opcode Gate Count Constants
14// ========================================
15
16// Mega adds 3 gates for ECCVM opcode values
17template <typename Builder> inline constexpr size_t MEGA_OFFSET = IsMegaBuilder<Builder> ? 3 : 0;
18
19// Base gate count for zero gate
20inline constexpr size_t ZERO_GATE = 1;
21
22// Gate count constants for each ACIR constraint type
23template <typename Builder> inline constexpr size_t ARITHMETIC_TRIPLE = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
24template <typename Builder> inline constexpr size_t QUAD = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
25template <typename Builder> inline constexpr size_t BIG_QUAD = 2 + ZERO_GATE + MEGA_OFFSET<Builder>;
26template <typename Builder> inline constexpr size_t LOGIC_XOR_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
27template <typename Builder> inline constexpr size_t LOGIC_AND_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
28template <typename Builder> inline constexpr size_t RANGE_32 = 2744 + ZERO_GATE + MEGA_OFFSET<Builder>;
29template <typename Builder> inline constexpr size_t SHA256_COMPRESSION = 6679 + ZERO_GATE + MEGA_OFFSET<Builder>;
30template <typename Builder> inline constexpr size_t AES128_ENCRYPTION = 1432 + ZERO_GATE + MEGA_OFFSET<Builder>;
31
32// The mega offset works differently for ECDSA opcodes because of the use of ROM tables, which use indices that
33// overlap with the values added for ECCVM. secp256k1 uses table of size 16 whose indices contain all the 4 values
34// set for ECCVM (hence the same value for Ultra and Mega builders). secp256r1 uses ROM tables of size 4, which
35// contain only 2 of the values set for ECCVM (hence the difference of two gates between Ultra and Mega builders).
36template <typename Builder> inline constexpr size_t ECDSA_SECP256K1 = 41994 + ZERO_GATE;
37template <typename Builder>
38inline constexpr size_t ECDSA_SECP256R1 = 72209 + ZERO_GATE + (IsMegaBuilder<Builder> ? 2 : 0);
39
40template <typename Builder> inline constexpr size_t BLAKE2S = 2959 + ZERO_GATE + MEGA_OFFSET<Builder>;
41template <typename Builder> inline constexpr size_t BLAKE3 = 2165 + ZERO_GATE + MEGA_OFFSET<Builder>;
42template <typename Builder> inline constexpr size_t KECCAK_PERMUTATION = 17387 + ZERO_GATE + MEGA_OFFSET<Builder>;
43template <typename Builder> inline constexpr size_t POSEIDON2_PERMUTATION = 73 + ZERO_GATE + MEGA_OFFSET<Builder>;
44template <typename Builder> inline constexpr size_t MULTI_SCALAR_MUL = 3550 + ZERO_GATE;
45template <typename Builder> inline constexpr size_t EC_ADD = 66 + ZERO_GATE + MEGA_OFFSET<Builder>;
46template <typename Builder> inline constexpr size_t BLOCK_ROM_READ = 9 + ZERO_GATE + MEGA_OFFSET<Builder>;
47template <typename Builder> inline constexpr size_t BLOCK_RAM_READ = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
48template <typename Builder> inline constexpr size_t BLOCK_RAM_WRITE = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
49template <typename Builder> inline constexpr size_t BLOCK_CALLDATA = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
50template <typename Builder> inline constexpr size_t BLOCK_RETURNDATA = 23 + ZERO_GATE + MEGA_OFFSET<Builder>;
51template <typename Builder> inline constexpr size_t ASSERT_EQUALITY = ZERO_GATE + MEGA_OFFSET<Builder>;
52
53// ========================================
54// Honk Recursion Constants
55// ========================================
56
57// Gate counts for Honk recursion vary by recursive flavor
58// Returns tuple of (gate_count, ecc_rows, ultra_ops)
59template <typename RecursiveFlavor>
63
65 return std::make_tuple(723995, 0, 0);
67 return std::make_tuple(724462, 0, 0);
69 return std::make_tuple(24329, 1250, 76);
71 return std::make_tuple(767515, 0, 0);
73 return std::make_tuple(29302, 1052, 80);
74 } else {
75 bb::assert_failure("Unhandled recursive flavor.");
76 }
77}();
78
79// ========================================
80// Chonk Recursion Constants
81// ========================================
82
83// Gate count for Chonk recursive verification (UltraRollup builder)
84inline constexpr size_t CHONK_RECURSION_GATES = 2495208;
85
86// ========================================
87// Hypernova Recursion Constants
88// ========================================
89
90// MSM rows offset
91inline constexpr size_t MSM_ROWS_OFFSET = 2;
92
93// Init kernel gate counts (verifies OINK proof)
94inline constexpr size_t INIT_KERNEL_GATE_COUNT = 26038;
95inline constexpr size_t INIT_KERNEL_ECC_ROWS = 881 + MSM_ROWS_OFFSET;
96inline constexpr size_t INIT_KERNEL_ULTRA_OPS = 89;
97
98// Inner kernel gate counts (verifies HN proof for previous kernel + HN for app)
99inline constexpr size_t INNER_KERNEL_GATE_COUNT_HN = 61020;
100inline constexpr size_t INNER_KERNEL_ECC_ROWS = 1700 + MSM_ROWS_OFFSET;
101inline constexpr size_t INNER_KERNEL_ULTRA_OPS = 179;
102
103// Tail kernel gate counts (verifies HN_TAIL proof)
104inline constexpr size_t TAIL_KERNEL_GATE_COUNT = 33968;
105inline constexpr size_t TAIL_KERNEL_ECC_ROWS = 914 + MSM_ROWS_OFFSET;
106inline constexpr size_t TAIL_KERNEL_ULTRA_OPS = 96;
107
108// Hiding kernel gate counts (verifies HN_FINAL proof)
109inline constexpr size_t HIDING_KERNEL_GATE_COUNT = 37212;
110inline constexpr size_t HIDING_KERNEL_ECC_ROWS = 1341 + MSM_ROWS_OFFSET;
111inline constexpr size_t HIDING_KERNEL_ULTRA_OPS = 124;
112
113} // namespace acir_format
constexpr size_t BLOCK_RAM_READ
constexpr size_t MULTI_SCALAR_MUL
constexpr size_t BLOCK_RETURNDATA
constexpr size_t LOGIC_AND_32
constexpr size_t INIT_KERNEL_ECC_ROWS
constexpr size_t HIDING_KERNEL_ULTRA_OPS
constexpr std::tuple< size_t, size_t, size_t > HONK_RECURSION_CONSTANTS
constexpr size_t BLAKE2S
constexpr size_t MSM_ROWS_OFFSET
constexpr size_t LOGIC_XOR_32
constexpr size_t AES128_ENCRYPTION
constexpr size_t RANGE_32
constexpr size_t MEGA_OFFSET
constexpr size_t HIDING_KERNEL_ECC_ROWS
constexpr size_t BLAKE3
constexpr size_t TAIL_KERNEL_GATE_COUNT
constexpr size_t POSEIDON2_PERMUTATION
constexpr size_t TAIL_KERNEL_ULTRA_OPS
constexpr size_t BLOCK_RAM_WRITE
constexpr size_t BLOCK_ROM_READ
constexpr size_t BLOCK_CALLDATA
constexpr size_t INIT_KERNEL_GATE_COUNT
constexpr size_t INIT_KERNEL_ULTRA_OPS
constexpr size_t CHONK_RECURSION_GATES
constexpr size_t INNER_KERNEL_GATE_COUNT_HN
constexpr size_t TAIL_KERNEL_ECC_ROWS
constexpr size_t ASSERT_EQUALITY
constexpr size_t INNER_KERNEL_ULTRA_OPS
constexpr size_t SHA256_COMPRESSION
constexpr size_t HIDING_KERNEL_GATE_COUNT
constexpr size_t KECCAK_PERMUTATION
constexpr size_t ECDSA_SECP256K1
constexpr size_t ECDSA_SECP256R1
constexpr size_t EC_ADD
constexpr size_t ZERO_GATE
constexpr size_t QUAD
constexpr size_t BIG_QUAD
constexpr size_t ARITHMETIC_TRIPLE
constexpr size_t INNER_KERNEL_ECC_ROWS
void assert_failure(std::string const &err)
Definition assert.cpp:11
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13