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 = 42837 + ZERO_GATE;
38template <typename Builder>
39inline constexpr size_t ECDSA_SECP256R1 = 72611 + 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>
45inline constexpr size_t POSEIDON2_PERMUTATION = (IsMegaBuilder<Builder> ? 27 : 73) + ZERO_GATE + MEGA_OFFSET<Builder>;
46template <typename Builder> inline constexpr size_t MULTI_SCALAR_MUL = 3563 + ZERO_GATE;
47template <typename Builder> inline constexpr size_t EC_ADD = 84 + ZERO_GATE + MEGA_OFFSET<Builder>;
48template <typename Builder> inline constexpr size_t BLOCK_ROM_READ = 9 + ZERO_GATE + MEGA_OFFSET<Builder>;
49template <typename Builder> inline constexpr size_t BLOCK_RAM_READ = 9 + ZERO_GATE + MEGA_OFFSET<Builder>;
50template <typename Builder> inline constexpr size_t BLOCK_RAM_WRITE = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
51template <typename Builder> inline constexpr size_t BLOCK_CALLDATA = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
52template <typename Builder> inline constexpr size_t BLOCK_RETURNDATA = 11 + ZERO_GATE + MEGA_OFFSET<Builder>;
53template <typename Builder> inline constexpr size_t ASSERT_EQUALITY = ZERO_GATE + MEGA_OFFSET<Builder>;
54
55// ========================================
56// Honk Recursion Constants
57// ========================================
58
59inline constexpr size_t ROOT_ROLLUP_GATE_COUNT = 6351394;
60
61template <typename RecursiveFlavor>
64{
67
69 switch (mode) {
71 return std::make_tuple(681670, 0);
74 return std::make_tuple(682727, 0);
75 }
77 switch (mode) {
79 return std::make_tuple(703410, 0);
82 return std::make_tuple(704563, 0);
83 }
85 switch (mode) {
87 return std::make_tuple(11848, 73);
90 return std::make_tuple(12905, 73);
91 }
93 switch (mode) {
95 return std::make_tuple(14506, 77);
98 return std::make_tuple(15659, 77);
99 }
102 bb::assert_failure("Unhandled mode in MegaZKRecursiveFlavor.");
103 }
104 return std::make_tuple(856820, 0);
105 } else {
106 bb::assert_failure("Unhandled recursive flavor.");
107 }
108
109 throw_or_abort("Unhandled recursive flavor.");
110}
111
112// ========================================
113// Chonk Recursion Constants
114// ========================================
115
116// Gate count for Chonk recursive verification (Ultra with RollupIO)
117inline constexpr size_t CHONK_RECURSION_GATES = 1563553;
118
119// ========================================
120// Hypernova Recursion Constants
121// ========================================
122
123// MSM rows offset
124inline constexpr size_t MSM_ROWS_OFFSET = 2;
125
126// Init kernel gate counts (verifies OINK proof)
127inline constexpr size_t INIT_KERNEL_GATE_COUNT = 13449;
128inline constexpr size_t INIT_KERNEL_ECC_ROWS = 623 + MSM_ROWS_OFFSET;
129inline constexpr size_t INIT_KERNEL_ULTRA_OPS = 70;
130
131// Inner kernel gate counts (verifies HN proof for previous kernel + HN for app)
132inline constexpr size_t INNER_KERNEL_GATE_COUNT_HN = 31092;
133inline constexpr size_t INNER_KERNEL_ECC_ROWS = 1312 + MSM_ROWS_OFFSET;
134inline constexpr size_t INNER_KERNEL_ULTRA_OPS = 149;
135
136// Tail kernel gate counts (verifies HN_TAIL proof)
137inline constexpr size_t TAIL_KERNEL_GATE_COUNT = 17323;
138inline constexpr size_t TAIL_KERNEL_ECC_ROWS = 656 + MSM_ROWS_OFFSET;
139inline constexpr size_t TAIL_KERNEL_ULTRA_OPS = 72;
140
141// Hiding kernel gate counts (verifies HN_FINAL proof)
142inline constexpr size_t HIDING_KERNEL_GATE_COUNT = 39627;
143inline constexpr size_t HIDING_KERNEL_ECC_ROWS = 4872 + MSM_ROWS_OFFSET;
144inline constexpr size_t HIDING_KERNEL_ULTRA_OPS = 334;
145
146// ========================================
147// ECCVM Recursive Verifier Constants
148// ========================================
149
150// Gate count for ECCVM recursive verifier (Ultra-arithmetized)
151// Trigger rebuild
152inline constexpr size_t ECCVM_RECURSIVE_VERIFIER_GATE_COUNT = 220788;
153
154// ========================================
155// Goblin AVM Recursive Verifier Constants
156// ========================================
157
158inline constexpr size_t GOBLIN_AVM_GATE_COUNT = 3316528;
159inline constexpr size_t FINALIZED_GOBLIN_AVM_GATE_COUNT = 3316544;
160
161} // 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)