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
7#include <cstddef>
8#include <tuple>
9#include <type_traits>
10
11namespace acir_format {
12
13// ========================================
14// ACIR Opcode Gate Count Constants
15// ========================================
16
17// Mega adds 3 gates for ECCVM opcode values
18template <typename Builder> inline constexpr size_t MEGA_OFFSET = IsMegaBuilder<Builder> ? 3 : 0;
19
20// Base gate count for zero gate
21inline constexpr size_t ZERO_GATE = 1;
22
23// Gate count constants for each ACIR constraint type
24template <typename Builder> inline constexpr size_t ARITHMETIC_TRIPLE = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
25template <typename Builder> inline constexpr size_t QUAD = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
26template <typename Builder> inline constexpr size_t BIG_QUAD = 2 + ZERO_GATE + MEGA_OFFSET<Builder>;
27template <typename Builder> inline constexpr size_t LOGIC_XOR_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
28template <typename Builder> inline constexpr size_t LOGIC_AND_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
29template <typename Builder> inline constexpr size_t RANGE_32 = 2744 + ZERO_GATE + MEGA_OFFSET<Builder>;
30template <typename Builder> inline constexpr size_t SHA256_COMPRESSION = 6679 + ZERO_GATE + MEGA_OFFSET<Builder>;
31template <typename Builder> inline constexpr size_t AES128_ENCRYPTION = 1432 + ZERO_GATE + MEGA_OFFSET<Builder>;
32
33// The mega offset works differently for ECDSA opcodes because of the use of ROM tables, which use indices that
34// overlap with the values added for ECCVM. secp256k1 uses table of size 16 whose indices contain all the 4 values
35// set for ECCVM (hence the same value for Ultra and Mega builders). secp256r1 uses ROM tables of size 4, which
36// contain only 2 of the values set for ECCVM (hence the difference of two gates between Ultra and Mega builders).
37template <typename Builder> inline constexpr size_t ECDSA_SECP256K1 = 41994 + ZERO_GATE;
38template <typename Builder>
39inline constexpr size_t ECDSA_SECP256R1 = 72209 + ZERO_GATE + (IsMegaBuilder<Builder> ? 2 : 0);
40
41template <typename Builder> inline constexpr size_t BLAKE2S = 2952 + ZERO_GATE + MEGA_OFFSET<Builder>;
42template <typename Builder> inline constexpr size_t BLAKE3 = 2158 + ZERO_GATE + MEGA_OFFSET<Builder>;
43template <typename Builder> inline constexpr size_t KECCAK_PERMUTATION = 17387 + ZERO_GATE + MEGA_OFFSET<Builder>;
44template <typename Builder> inline constexpr size_t POSEIDON2_PERMUTATION = 73 + ZERO_GATE + MEGA_OFFSET<Builder>;
45template <typename Builder> inline constexpr size_t MULTI_SCALAR_MUL = 3550 + ZERO_GATE;
46template <typename Builder> inline constexpr size_t EC_ADD = 66 + ZERO_GATE + MEGA_OFFSET<Builder>;
47template <typename Builder> inline constexpr size_t BLOCK_ROM_READ = 9 + ZERO_GATE + MEGA_OFFSET<Builder>;
48template <typename Builder> inline constexpr size_t BLOCK_RAM_READ = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
49template <typename Builder> inline constexpr size_t BLOCK_RAM_WRITE = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
50template <typename Builder> inline constexpr size_t BLOCK_CALLDATA = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
51template <typename Builder> inline constexpr size_t BLOCK_RETURNDATA = 23 + ZERO_GATE + MEGA_OFFSET<Builder>;
52template <typename Builder> inline constexpr size_t ASSERT_EQUALITY = ZERO_GATE + MEGA_OFFSET<Builder>;
53
54// ========================================
55// Honk Recursion Constants
56// ========================================
57
58inline constexpr size_t ROOT_ROLLUP_GATE_COUNT = 12986977;
59
60template <typename RecursiveFlavor>
63{
66
68 switch (mode) {
70 return std::make_tuple(722844, 0);
73 return std::make_tuple(723995, 0);
74 }
76 switch (mode) {
78 return std::make_tuple(766262, 0);
81 return std::make_tuple(767515, 0);
82 }
84 switch (mode) {
86 return std::make_tuple(723163, 0);
89 return std::make_tuple(724462, 0);
90 }
92 switch (mode) {
94 return std::make_tuple(23178, 76);
97 return std::make_tuple(24329, 76);
98 }
100 switch (mode) {
102 return std::make_tuple(28049, 80);
105 return std::make_tuple(29302, 80);
106 }
109 bb::assert_failure("Unhandled mode in MegaZKRecursiveFlavor.");
110 }
111 return std::make_tuple(814519, 0);
112 } else {
113 bb::assert_failure("Unhandled recursive flavor.");
114 }
115}
116
117// ========================================
118// Chonk Recursion Constants
119// ========================================
120
121// Gate count for Chonk recursive verification (UltraRollup builder)
122inline constexpr size_t CHONK_RECURSION_GATES = 2368439;
123
124// ========================================
125// Hypernova Recursion Constants
126// ========================================
127
128// MSM rows offset
129inline constexpr size_t MSM_ROWS_OFFSET = 2;
130
131// Init kernel gate counts (verifies OINK proof)
132inline constexpr size_t INIT_KERNEL_GATE_COUNT = 26036;
133inline constexpr size_t INIT_KERNEL_ECC_ROWS = 881 + MSM_ROWS_OFFSET;
134inline constexpr size_t INIT_KERNEL_ULTRA_OPS = 89;
135
136// Inner kernel gate counts (verifies HN proof for previous kernel + HN for app)
137inline constexpr size_t INNER_KERNEL_GATE_COUNT_HN = 61018;
138inline constexpr size_t INNER_KERNEL_ECC_ROWS = 1700 + MSM_ROWS_OFFSET;
139inline constexpr size_t INNER_KERNEL_ULTRA_OPS = 179;
140
141// Tail kernel gate counts (verifies HN_TAIL proof)
142inline constexpr size_t TAIL_KERNEL_GATE_COUNT = 33966;
143inline constexpr size_t TAIL_KERNEL_ECC_ROWS = 914 + MSM_ROWS_OFFSET;
144inline constexpr size_t TAIL_KERNEL_ULTRA_OPS = 96;
145
146// Hiding kernel gate counts (verifies HN_FINAL proof)
147inline constexpr size_t HIDING_KERNEL_GATE_COUNT = 37106;
148inline constexpr size_t HIDING_KERNEL_ECC_ROWS = 1341 + MSM_ROWS_OFFSET;
149inline constexpr size_t HIDING_KERNEL_ULTRA_OPS = 124;
150
151// ========================================
152// ECCVM Recursive Verifier Constants
153// ========================================
154
155// Gate count for ECCVM recursive verifier (Ultra-arithmetized)
156inline constexpr size_t ECCVM_RECURSIVE_VERIFIER_GATE_COUNT = 214950;
157
158// ========================================
159// Goblin AVM Recursive Verifier Constants
160// ========================================
161
162inline constexpr size_t GOBLIN_AVM_GATE_COUNT = 3325906;
163inline constexpr size_t FINALIZED_GOBLIN_AVM_GATE_COUNT = 3325922;
164
165} // 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 size_t BLAKE2S
constexpr size_t MSM_ROWS_OFFSET
constexpr size_t ECCVM_RECURSIVE_VERIFIER_GATE_COUNT
constexpr size_t LOGIC_XOR_32
constexpr size_t FINALIZED_GOBLIN_AVM_GATE_COUNT
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 GOBLIN_AVM_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 ROOT_ROLLUP_GATE_COUNT
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 std::tuple< size_t, size_t > HONK_RECURSION_CONSTANTS(const PredicateTestCase &mode=PredicateTestCase::ConstantTrue)
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