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 = 6702 + ZERO_GATE + MEGA_OFFSET<Builder>;
31template <typename Builder> inline constexpr size_t AES128_ENCRYPTION = 1559 + 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 = 42839 + ZERO_GATE;
38template <typename Builder>
39inline constexpr size_t ECDSA_SECP256R1 = 72614 + 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 = 3559 + ZERO_GATE;
46template <typename Builder> inline constexpr size_t EC_ADD = 80 + 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 = 9 + 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 = 11 + 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 = 12933470;
59
60template <typename RecursiveFlavor>
63{
66
68 switch (mode) {
70 return std::make_tuple(695991, 0);
73 return std::make_tuple(697126, 0);
74 }
76 switch (mode) {
78 return std::make_tuple(739768, 0);
81 return std::make_tuple(741005, 0);
82 }
84 switch (mode) {
86 return std::make_tuple(22271, 76);
89 return std::make_tuple(23406, 76);
90 }
92 switch (mode) {
94 return std::make_tuple(27122, 80);
97 return std::make_tuple(28359, 80);
98 }
101 bb::assert_failure("Unhandled mode in MegaZKRecursiveFlavor.");
102 }
103 return std::make_tuple(786730, 0);
104 } else {
105 bb::assert_failure("Unhandled recursive flavor.");
106 }
107
108 throw_or_abort("Unhandled recursive flavor.");
109}
110
111// ========================================
112// Chonk Recursion Constants
113// ========================================
114
115// Gate count for Chonk recursive verification (Ultra with RollupIO)
116inline constexpr size_t CHONK_RECURSION_GATES = 1587459;
117
118// ========================================
119// Hypernova Recursion Constants
120// ========================================
121
122// MSM rows offset
123inline constexpr size_t MSM_ROWS_OFFSET = 2;
124
125// Init kernel gate counts (verifies OINK proof)
126inline constexpr size_t INIT_KERNEL_GATE_COUNT = 24047;
127inline constexpr size_t INIT_KERNEL_ECC_ROWS = 848 + MSM_ROWS_OFFSET;
128inline constexpr size_t INIT_KERNEL_ULTRA_OPS = 89;
129
130// Inner kernel gate counts (verifies HN proof for previous kernel + HN for app)
131inline constexpr size_t INNER_KERNEL_GATE_COUNT_HN = 57138;
132inline constexpr size_t INNER_KERNEL_ECC_ROWS = 1700 + MSM_ROWS_OFFSET;
133inline constexpr size_t INNER_KERNEL_ULTRA_OPS = 179;
134
135// Tail kernel gate counts (verifies HN_TAIL proof)
136inline constexpr size_t TAIL_KERNEL_GATE_COUNT = 31117;
137inline constexpr size_t TAIL_KERNEL_ECC_ROWS = 914 + MSM_ROWS_OFFSET;
138inline constexpr size_t TAIL_KERNEL_ULTRA_OPS = 96;
139
140// Hiding kernel gate counts (verifies HN_FINAL proof)
141inline constexpr size_t HIDING_KERNEL_GATE_COUNT = 34132;
142inline constexpr size_t HIDING_KERNEL_ECC_ROWS = 1341 + MSM_ROWS_OFFSET;
143inline constexpr size_t HIDING_KERNEL_ULTRA_OPS = 124;
144
145// ========================================
146// ECCVM Recursive Verifier Constants
147// ========================================
148
149// Gate count for ECCVM recursive verifier (Ultra-arithmetized)
150inline constexpr size_t ECCVM_RECURSIVE_VERIFIER_GATE_COUNT = 224707;
151
152// ========================================
153// Goblin AVM Recursive Verifier Constants
154// ========================================
155
156inline constexpr size_t GOBLIN_AVM_GATE_COUNT = 3316528;
157inline constexpr size_t FINALIZED_GOBLIN_AVM_GATE_COUNT = 3316544;
158
159} // 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
void throw_or_abort(std::string const &err)