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
8#include <array>
9#include <cstddef>
10#include <tuple>
11#include <type_traits>
12
13namespace acir_format {
14
15// ========================================
16// ACIR Opcode Gate Count Constants
17// ========================================
18
19// Mega adds 3 gates for ECCVM opcode values
20template <typename Builder> inline constexpr size_t MEGA_OFFSET = IsMegaBuilder<Builder> ? 3 : 0;
21
22// Base gate count for zero gate
23inline constexpr size_t ZERO_GATE = 1;
24
25// Gate count constants for each ACIR constraint type
26template <typename Builder> inline constexpr size_t ARITHMETIC_TRIPLE = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
27template <typename Builder> inline constexpr size_t QUAD = 1 + ZERO_GATE + MEGA_OFFSET<Builder>;
28template <typename Builder> inline constexpr size_t BIG_QUAD = 2 + ZERO_GATE + MEGA_OFFSET<Builder>;
29template <typename Builder> inline constexpr size_t LOGIC_XOR_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
30template <typename Builder> inline constexpr size_t LOGIC_AND_32 = 6 + ZERO_GATE + MEGA_OFFSET<Builder>;
31template <typename Builder> inline constexpr size_t RANGE_32 = 2744 + ZERO_GATE + MEGA_OFFSET<Builder>;
32template <typename Builder> inline constexpr size_t SHA256_COMPRESSION = 6703 + ZERO_GATE + MEGA_OFFSET<Builder>;
33template <typename Builder> inline constexpr size_t AES128_ENCRYPTION = 1559 + ZERO_GATE + MEGA_OFFSET<Builder>;
34
35// The mega offset works differently for ECDSA opcodes because of the use of ROM tables, which use indices that
36// overlap with the values added for ECCVM. secp256k1 uses table of size 16 whose indices contain all the 4 values
37// set for ECCVM (hence the same value for Ultra and Mega builders). secp256r1 uses ROM tables of size 4, which
38// contain only 2 of the values set for ECCVM (hence the difference of two gates between Ultra and Mega builders).
39template <typename Builder> inline constexpr size_t ECDSA_SECP256K1 = 42837 + ZERO_GATE;
40template <typename Builder>
41inline constexpr size_t ECDSA_SECP256R1 = 45945 + ZERO_GATE + (IsMegaBuilder<Builder> ? 2 : 0);
42
43template <typename Builder> inline constexpr size_t BLAKE2S = 2952 + ZERO_GATE + MEGA_OFFSET<Builder>;
44template <typename Builder> inline constexpr size_t BLAKE3 = 2158 + ZERO_GATE + MEGA_OFFSET<Builder>;
45template <typename Builder> inline constexpr size_t KECCAK_PERMUTATION = 17387 + ZERO_GATE + MEGA_OFFSET<Builder>;
46template <typename Builder>
47inline constexpr size_t POSEIDON2_PERMUTATION = (IsMegaBuilder<Builder> ? 25 : 73) + ZERO_GATE + MEGA_OFFSET<Builder>;
48template <typename Builder> inline constexpr size_t MULTI_SCALAR_MUL = 3557 + ZERO_GATE;
49template <typename Builder> inline constexpr size_t EC_ADD = 76 + ZERO_GATE + MEGA_OFFSET<Builder>;
50template <typename Builder> inline constexpr size_t BLOCK_ROM_READ = 4 + ZERO_GATE + MEGA_OFFSET<Builder>;
51template <typename Builder> inline constexpr size_t BLOCK_RAM_READ = 4 + ZERO_GATE + MEGA_OFFSET<Builder>;
52template <typename Builder> inline constexpr size_t BLOCK_RAM_WRITE = 18 + ZERO_GATE + MEGA_OFFSET<Builder>;
53// 4 = 1 busread (trace read) + 2 busreads (per-slot init reads bound to the witnesses, emitted by set_values) +
54// 1 constant-witness gate (fix_witness for the slot-index constant FF(1); FF(0) reuses zero_idx). Specific to the
55// init.size() == 2 / trace.size() == 1 configuration used by the opcode-gate-count test.
56template <typename Builder> inline constexpr size_t BLOCK_CALLDATA = 4 + ZERO_GATE + MEGA_OFFSET<Builder>;
57template <typename Builder> inline constexpr size_t BLOCK_RETURNDATA = 11 + ZERO_GATE + MEGA_OFFSET<Builder>;
58template <typename Builder> inline constexpr size_t ASSERT_EQUALITY = ZERO_GATE + MEGA_OFFSET<Builder>;
59
60// ========================================
61// Honk Recursion Constants
62// ========================================
63
64inline constexpr size_t ROOT_ROLLUP_GATE_COUNT = 6350020;
65
66template <typename RecursiveFlavor>
69{
72
74 switch (mode) {
76 return std::make_tuple(680937, 0);
79 return std::make_tuple(681994, 0);
80 }
82 switch (mode) {
84 return std::make_tuple(702688, 0);
87 return std::make_tuple(703841, 0);
88 }
90 switch (mode) {
92 return std::make_tuple(10566, 73);
95 return std::make_tuple(11623, 73);
96 }
98 switch (mode) {
100 return std::make_tuple(13164, 77);
103 return std::make_tuple(14317, 77);
104 }
107 bb::assert_failure("Unhandled mode in MegaZKRecursiveFlavor.");
108 }
109 return std::make_tuple(653022, 0);
110 } else {
111 bb::assert_failure("Unhandled recursive flavor.");
112 }
113
114 throw_or_abort("Unhandled recursive flavor.");
115}
116
117// ========================================
118// Chonk Recursion Constants
119// ========================================
120
121// Gate count for Chonk recursive verification (Ultra with RollupIO)
122inline constexpr size_t CHONK_RECURSION_GATES = 1375725;
123
124// ========================================
125// Hypernova Recursion Constants
126// ========================================
127
128// Kernel gate counts, ecc row and ultra ops indexed by (number of apps the kernel verifies - 1), i.e. index i holds the
129// count for i+1 apps (1..MAX_APPS_PER_KERNEL)
130inline constexpr size_t KERNEL_APP_COUNTS = bb::MAX_APPS_PER_KERNEL;
131
132// Fixed start/end offset added to the ECCVM 'msm' section row count for any circuit (see
133// EccvmRowTracker::get_num_msm_rows). It is a one-time cost over the whole op queue rather than a per-kernel cost,
134// so the per-kernel ECC-row constants below store the measured row count with this offset removed.
135inline constexpr size_t MSM_ROWS_OFFSET = 2;
136
137// Init kernel: verifies its leading apps (first via an OINK proof, rest via HN); carries no accumulator, so K
138// apps reduce to K claims (no batching for K==1, width-K batching for K>=2).
139inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INIT_KERNEL_GATE_COUNT = { 11423, 21873, 30400, 39007, 47559 };
140inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INIT_KERNEL_ECC_ROWS = { 524, 1176, 1700, 2290, 2814 };
141inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INIT_KERNEL_ULTRA_OPS = { 60, 131, 194, 257, 320 };
142
143// Inner kernel: verifies the previous kernel (HN) plus K apps (HN). The carried accumulator + previous kernel +
144// K apps reduce to a (K+2)-claim per-kernel batching.
145inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INNER_KERNEL_GATE_COUNT = { 23943, 32470, 41077, 49629, 58211 };
146inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INNER_KERNEL_ECC_ROWS = { 1308, 1898, 2422, 3012, 3536 };
147inline constexpr std::array<size_t, KERNEL_APP_COUNTS> INNER_KERNEL_ULTRA_OPS = { 148, 211, 274, 337, 400 };
148
149// Reset or Tail kernel: verifies a single previous-kernel HN proof, then a width-2 per-kernel
150// batching. Reset and tail kernels are structurally identical from the IVC's perspective.
151inline constexpr size_t RESET_TAIL_KERNEL_GATE_COUNT = 15281;
152inline constexpr size_t RESET_TAIL_KERNEL_ECC_ROWS = 784;
153inline constexpr size_t RESET_TAIL_KERNEL_ULTRA_OPS = 81;
154
155// Hiding kernel: verifies the tail kernel (HN_FINAL), then a batch-merge recursive verifier sized for
156// CHONK_MAX_NUM_CIRCUITS plus a decider.
157inline constexpr size_t HIDING_KERNEL_GATE_COUNT = 36584;
158inline constexpr size_t HIDING_KERNEL_ECC_ROWS = 5330;
159// The hiding kernel's ultra-op count is defined canonically as bb::HIDING_KERNEL_ULTRA_OPS (constants.hpp), since
160// the merge prover/verifier pin to it; reference it directly to avoid an ambiguous re-export in this namespace.
161
162// ========================================
163// ECCVM Recursive Verifier Constants
164// ========================================
165
166// Gate count for ECCVM recursive verifier (Ultra-arithmetized)
167inline constexpr size_t ECCVM_RECURSIVE_VERIFIER_GATE_COUNT = 237497;
168
169// ========================================
170// Goblin AVM Recursive Verifier Constants
171// ========================================
172
173inline constexpr size_t GOBLIN_AVM_GATE_COUNT = 2950641;
174inline constexpr size_t FINALIZED_GOBLIN_AVM_GATE_COUNT = 2950844;
175
176} // namespace acir_format
constexpr std::array< size_t, KERNEL_APP_COUNTS > INNER_KERNEL_ECC_ROWS
constexpr size_t BLOCK_RAM_READ
constexpr size_t MULTI_SCALAR_MUL
constexpr size_t RESET_TAIL_KERNEL_GATE_COUNT
constexpr size_t BLOCK_RETURNDATA
constexpr size_t LOGIC_AND_32
constexpr size_t BLAKE2S
constexpr size_t MSM_ROWS_OFFSET
constexpr std::array< size_t, KERNEL_APP_COUNTS > INNER_KERNEL_ULTRA_OPS
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 std::array< size_t, KERNEL_APP_COUNTS > INIT_KERNEL_ULTRA_OPS
constexpr size_t HIDING_KERNEL_ECC_ROWS
constexpr size_t BLAKE3
constexpr size_t GOBLIN_AVM_GATE_COUNT
constexpr size_t POSEIDON2_PERMUTATION
constexpr std::array< size_t, KERNEL_APP_COUNTS > INIT_KERNEL_ECC_ROWS
constexpr size_t RESET_TAIL_KERNEL_ULTRA_OPS
constexpr size_t BLOCK_RAM_WRITE
constexpr size_t BLOCK_ROM_READ
constexpr size_t BLOCK_CALLDATA
constexpr size_t KERNEL_APP_COUNTS
constexpr size_t CHONK_RECURSION_GATES
constexpr std::array< size_t, KERNEL_APP_COUNTS > INNER_KERNEL_GATE_COUNT
constexpr size_t ROOT_ROLLUP_GATE_COUNT
constexpr size_t ASSERT_EQUALITY
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 std::array< size_t, KERNEL_APP_COUNTS > INIT_KERNEL_GATE_COUNT
constexpr size_t BIG_QUAD
constexpr size_t ARITHMETIC_TRIPLE
constexpr size_t RESET_TAIL_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)