Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
proof_length.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Planned, auditors: [], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
12#include <cstddef>
13
14namespace bb::ProofLength {
15
23template <typename Flavor> struct CodecConstants {
24 using Codec = typename Flavor::Codec;
26 using FF = typename Flavor::FF;
27
28 static constexpr size_t num_frs_in_comm = Codec::template calc_num_fields<Commitment>();
29 static constexpr size_t num_frs_in_scalar = Codec::template calc_num_fields<FF>();
30};
31
37template <typename Flavor> struct Oink : CodecConstants<Flavor> {
39
41};
42
48template <typename Flavor> struct Sumcheck : CodecConstants<Flavor> {
51
52 static constexpr size_t LENGTH(size_t log_n)
53 {
54 size_t base_length =
56 /* evaluations */ (Flavor::NUM_ALL_ENTITIES * num_frs_in_scalar);
57
58 if constexpr (Flavor::HasZK) {
59 // Libra adds: concatenation_commitment, grand_sum_commitment, quotient_commitment (3 comms)
60 // + Sum, claimed_evaluation (2 scalars)
61 return base_length + (3 * num_frs_in_comm) + (2 * num_frs_in_scalar);
62 } else {
63 return base_length;
64 }
65 }
66};
67
74template <typename Flavor> struct Shplemini : CodecConstants<Flavor> {
77
78 static constexpr size_t LENGTH(size_t log_n)
79 {
80 size_t base_length =
81 /* Gemini:FOLD_1..FOLD_{log_n-1} */ ((log_n - 1) * num_frs_in_comm) +
82 /* Gemini:a_1..a_{log_n} */ (log_n * num_frs_in_scalar) +
83 /* Shplonk:Q */ num_frs_in_comm +
84 /* KZG:W */ num_frs_in_comm;
85
86 if constexpr (Flavor::HasZK) {
87 // ZK adds: Libra evaluations (concatenation, shifted_grand_sum, grand_sum, quotient)
88 return base_length + (NUM_SMALL_IPA_EVALUATIONS * num_frs_in_scalar);
89 } else {
90 return base_length;
91 }
92 }
93};
94
100template <typename Flavor> struct Honk {
101 static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
102 {
105 }
106
112 static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
113 {
114 const size_t overhead = LENGTH_WITHOUT_PUB_INPUTS(log_n);
115 BB_ASSERT_GTE(proof_size, overhead, "Honk proof too short to derive num_public_inputs");
116 return proof_size - overhead;
117 }
118
124 template <typename IO> static constexpr size_t expected_proof_size(size_t log_n)
125 {
126 size_t size = IO::PUBLIC_INPUTS_SIZE + LENGTH_WITHOUT_PUB_INPUTS(log_n);
127 if constexpr (IO::HasIPA) {
128 size += IPA_PROOF_LENGTH;
129 }
130 return size;
131 }
132};
133
140template <typename Flavor> struct HypernovaInstanceToAccum {
141 static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
142 {
144 }
145
146 static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
147 {
148 const size_t overhead = LENGTH_WITHOUT_PUB_INPUTS(log_n);
149 BB_ASSERT_GTE(proof_size, overhead, "HypernovaInstanceToAccum proof too short to derive num_public_inputs");
150 return proof_size - overhead;
151 }
152};
153
160template <typename Flavor> struct MultilinearBatching : CodecConstants<Flavor> {
163
164 static constexpr size_t LENGTH =
165 /* accumulator commitments (non_shifted + shifted) */ (Flavor::NUM_ACCUMULATOR_COMMITMENTS * num_frs_in_comm) +
166 /* multivariate challenges */ (Flavor::VIRTUAL_LOG_N * num_frs_in_scalar) +
167 /* accumulator evaluations (non_shifted + shifted) */
168 (Flavor::NUM_ACCUMULATOR_EVALUATIONS * num_frs_in_scalar) + Sumcheck<Flavor>::LENGTH(Flavor::VIRTUAL_LOG_N);
169};
170
179template <typename Flavor, typename BatchingFlavor> struct HypernovaFolding {
185
186 static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
187 {
188 const size_t overhead = LENGTH_WITHOUT_PUB_INPUTS(log_n);
189 BB_ASSERT_GTE(proof_size, overhead, "HypernovaFolding proof too short to derive num_public_inputs");
190 return proof_size - overhead;
191 }
192};
193
194} // namespace bb::ProofLength
#define BB_ASSERT_GTE(left, right,...)
Definition assert.hpp:128
static constexpr bool HasZK
typename Curve::ScalarField FF
static constexpr size_t NUM_ALL_ENTITIES
typename G1::affine_element Commitment
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
Base class templates shared across Honk flavors.
Codec constants computed from Flavor types.
typename Flavor::Commitment Commitment
static constexpr size_t num_frs_in_scalar
typename Flavor::Codec Codec
static constexpr size_t num_frs_in_comm
Full Honk proof layout (used by UltraVerifier).
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
Derive num_public_inputs from proof size.
static constexpr size_t expected_proof_size(size_t log_n)
Expected proof size for API-level validation (excludes user public inputs).
Hypernova folding proof layout.
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
Hypernova instance-to-accumulator proof layout.
static size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
MultilinearBatching proof layout (used by HyperNova folding).
Computes Oink proof length from flavor traits.
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS
Computes Shplemini/PCS proof length from flavor traits.
static constexpr size_t LENGTH(size_t log_n)
Computes Sumcheck proof length from flavor traits.
static constexpr size_t LENGTH(size_t log_n)