Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_recursive_flavor.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
23
24#include <array>
25#include <concepts>
26#include <span>
27#include <string>
28#include <type_traits>
29#include <vector>
30
34
35namespace bb {
36
51template <typename BuilderType> class UltraRecursiveFlavor_ {
52 public:
53 using CircuitBuilder = BuilderType; // Determines arithmetization of circuit instantiated with this flavor
55 using PCS = KZG<Curve>;
56 using GroupElement = typename Curve::Element;
57 using Commitment = typename Curve::Element;
58 using FF = typename Curve::ScalarField;
62
63 static constexpr size_t VIRTUAL_LOG_N = UltraFlavor::VIRTUAL_LOG_N;
64 // indicates when evaluating sumcheck, edges can be left as degree-1 monomials
66
67 // Note(luke): Eventually this may not be needed at all
69 // Indicates that this flavor runs with non-ZK Sumcheck.
70 static constexpr bool HasZK = false;
71 // To achieve fixed proof size and that the recursive verifier circuit is constant, we are using padding in Sumcheck
72 // and Shplemini
73 static constexpr bool USE_PADDING = UltraFlavor::USE_PADDING;
74 static constexpr size_t NUM_WIRES = UltraFlavor::NUM_WIRES;
75 // The number of multivariate polynomials on which a sumcheck prover sumcheck operates (including shifts). We often
76 // need containers of this size to hold related data, so we choose a name more agnostic than `NUM_POLYNOMIALS`.
77 // Note: this number does not include the individual sorted list polynomials.
79 // The number of polynomials precomputed to describe a circuit and to aid a prover in constructing a satisfying
80 // assignment of witnesses. We again choose a neutral name.
82 // The total number of witness entities not including shifts.
84
86
87 // define the tuple of Relations that comprise the Sumcheck relation
89
90 static constexpr size_t MAX_PARTIAL_RELATION_LENGTH = compute_max_partial_relation_length<Relations>();
91 // static_assert(MAX_PARTIAL_RELATION_LENGTH == 7);
92 static constexpr size_t MAX_TOTAL_RELATION_LENGTH = compute_max_total_relation_length<Relations>();
93 // static_assert(MAX_TOTAL_RELATION_LENGTH == 11);
94
95 // BATCHED_RELATION_PARTIAL_LENGTH = algebraic degree of sumcheck relation *after* multiplying by the `pow_zeta`
96 // random polynomial e.g. For \sum(x) [A(x) * B(x) + C(x)] * PowZeta(X), relation length = 2 and random relation
97 // length = 3
99 static constexpr size_t NUM_RELATIONS = std::tuple_size<Relations>::value;
100
101 // For instances of this flavour, used in folding, we need a unique sumcheck batching challenges for each
102 // subrelation to avoid increasing the degree of Protogalaxy polynomial $G$ (the
103 // combiner) too much.
105 using SubrelationSeparators = std::array<FF, NUM_SUBRELATIONS - 1>;
106
115 class VerificationKey : public StdlibVerificationKey_<BuilderType, UltraFlavor::PrecomputedEntities<Commitment>> {
116 public:
118
126 {
127 this->log_circuit_size = FF::from_witness(builder, native_key->log_circuit_size);
128 this->num_public_inputs = FF::from_witness(builder, native_key->num_public_inputs);
129 this->pub_inputs_offset = FF::from_witness(builder, native_key->pub_inputs_offset);
130
131 // Generate stdlib commitments (biggroup) from the native counterparts
132 for (auto [commitment, native_commitment] : zip_view(this->get_all(), native_key->get_all())) {
133 commitment = Commitment::from_witness(builder, native_commitment);
134 }
135 };
136
144 {
145 using namespace bb::stdlib::field_conversion;
146
147 size_t num_frs_read = 0;
148
149 this->log_circuit_size = deserialize_from_frs<FF>(builder, elements, num_frs_read);
150 this->num_public_inputs = deserialize_from_frs<FF>(builder, elements, num_frs_read);
151 this->pub_inputs_offset = deserialize_from_frs<FF>(builder, elements, num_frs_read);
152
153 for (Commitment& commitment : this->get_all()) {
154 commitment = deserialize_from_frs<Commitment>(builder, elements, num_frs_read);
155 }
156 }
157
166 const std::span<const uint32_t>& witness_indices)
167 {
168 std::vector<FF> vk_fields;
169 vk_fields.reserve(witness_indices.size());
170 for (const auto& idx : witness_indices) {
171 vk_fields.emplace_back(FF::from_witness_index(&builder, idx));
172 }
173 return VerificationKey(builder, vk_fields);
174 }
175 };
176
182 public:
184 using Base::Base;
185 };
186
188
190
191 // Reuse the VerifierCommitments from Ultra
193
195};
196
197} // namespace bb
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
Base Stdlib verification key class.
Definition flavor.hpp:242
A base class labelling all entities (for instance, all of the polynomials used by the prover during s...
A container for commitment labels.
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
A container encapsulating all the commitments that the verifier receives (to precomputed polynomials ...
Container for all witness polynomials used/constructed by the prover.
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
static constexpr bool USE_PADDING
static constexpr size_t NUM_PRECOMPUTED_ENTITIES
static constexpr bool USE_SHORT_MONOMIALS
static constexpr size_t NUM_SUBRELATIONS
static constexpr size_t VIRTUAL_LOG_N
std::tuple< bb::UltraArithmeticRelation< FF >, bb::UltraPermutationRelation< FF >, bb::LogDerivLookupRelation< FF >, bb::DeltaRangeConstraintRelation< FF >, bb::EllipticRelation< FF >, bb::MemoryRelation< FF >, bb::NonNativeFieldRelation< FF >, bb::Poseidon2ExternalRelation< FF >, bb::Poseidon2InternalRelation< FF > > Relations_
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t NUM_WIRES
static constexpr size_t NUM_WITNESS_ENTITIES
A field element for each entity of the flavor. These entities represent the prover polynomials evalua...
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
VerificationKey(CircuitBuilder &builder, std::span< FF > elements)
Deserialize a verification key from a vector of field elements.
static VerificationKey from_witness_indices(CircuitBuilder &builder, const std::span< const uint32_t > &witness_indices)
Construct a VerificationKey from a set of corresponding witness indices.
VerificationKey(CircuitBuilder *builder, const std::shared_ptr< NativeVerificationKey > &native_key)
Construct a new Verification Key with stdlib types from a provided native verification key.
The recursive counterpart to the "native" Ultra flavor.
static constexpr size_t NUM_PRECOMPUTED_ENTITIES
static constexpr size_t NUM_ALL_ENTITIES
typename Curve::Element GroupElement
std::array< FF, NUM_SUBRELATIONS - 1 > SubrelationSeparators
static constexpr size_t VIRTUAL_LOG_N
typename Curve::Element Commitment
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
static constexpr bool USE_SHORT_MONOMIALS
static constexpr size_t NUM_WIRES
UltraFlavor::Relations_< FF > Relations
static constexpr size_t NUM_RELATIONS
static constexpr size_t MAX_PARTIAL_RELATION_LENGTH
typename Curve::ScalarField FF
static constexpr size_t BATCHED_RELATION_PARTIAL_LENGTH
static constexpr size_t NUM_SUBRELATIONS
static constexpr size_t NUM_WITNESS_ENTITIES
static constexpr size_t MAX_TOTAL_RELATION_LENGTH
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
static field_t from_witness_index(Builder *ctx, uint32_t witness_index)
Definition field.cpp:59
static field_t from_witness(Builder *ctx, const bb::fr &input)
Definition field.hpp:424
AluTraceBuilder builder
Definition alu.test.cpp:123
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:33