Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_verifier.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
18
20
26template <typename Builder> struct UltraRecursiveVerifierOutput {
28 using FF = typename Curve::ScalarField;
29 using G1 = typename Curve::Group;
30
35 std::array<G1, Builder::NUM_WIRES> ecc_op_tables; // Ecc op tables' commitments (HidingKernel/Chonk only)
36 FF transcript_hash; // The final state of the transcript of the AVM recursive verifier (GoblinAvm only)
37
39
40 template <class IO> UltraRecursiveVerifierOutput(IO& inputs)
41 {
42 if constexpr (std::is_same_v<IO, RollupIO>) {
43 ipa_claim = inputs.ipa_claim;
44 } else if constexpr (std::is_same_v<IO, HidingKernelIO<Builder>>) {
45 kernel_return_data = inputs.kernel_return_data;
46 ecc_op_tables = inputs.ecc_op_tables;
47 } else if constexpr (std::is_same_v<IO, GoblinAvmIO<Builder>>) {
48 transcript_hash = inputs.transcript_hash;
49 } else if constexpr (!std::is_same_v<IO, DefaultIO<Builder>>) {
50 throw_or_abort("Invalid public input type.");
51 }
52 }
53};
54
55} // namespace bb::stdlib::recursion::honk
56
57namespace bb {
58
59// Native verifier output
60template <typename Flavor> struct UltraVerifierOutput {
61 public:
63 bool result = false;
65 std::array<Commitment, Flavor::NUM_WIRES> ecc_op_tables;
66
68
69 template <class IO> UltraVerifierOutput(IO& inputs)
70 {
72 kernel_return_data = inputs.kernel_return_data;
73 ecc_op_tables = inputs.ecc_op_tables;
75 throw_or_abort("Invalid public input type.");
76 }
77 }
78};
79
80template <typename Flavor, class IO> class UltraVerifier_ {
81 public:
82 using FF = typename Flavor::FF;
84 using Curve = typename Flavor::Curve;
85 using PCS = typename Flavor::PCS;
90
91 static constexpr bool IsRecursive = IsRecursiveFlavor<Flavor>;
92
93 // Conditional types based on recursion
97
98 using PublicInputs = std::vector<FF>;
99 using Proof = typename Transcript::Proof;
100
101 // Conditional output type: UltraVerifierOutput for native, UltraRecursiveVerifierOutput for recursive
105
106 // IPA claim type: native uses curve::Grumpkin, recursive uses stdlib::grumpkin<Builder>
109
115 PairingPoints pairing_points; // KZG pairing points for deferred verification
116 bool reduction_succeeded = false; // Sumcheck and libra evaluation consistency checks
117 };
118
125 using VKAndHash = typename Flavor::VKAndHash;
126 explicit UltraVerifier_(const std::shared_ptr<VKAndHash>& vk_and_hash,
127 const std::shared_ptr<Transcript>& transcript = std::make_shared<Transcript>())
129 , verifier_instance(std::make_shared<Instance>(vk_and_hash))
131 {
132 if constexpr (!IsRecursive) {
133 // Native only: create IPA transcript
135 } else {
136 // Recursive only: extract builder from VKAndHash for later use
137 // Safe since VKAndHash contains field_t elements (hash) with builder context
138 builder = vk_and_hash->hash.get_context();
139 }
140 }
141
146 size_t compute_log_n() const;
147
148 [[nodiscard("Reduction result should be verified")]] ReductionResult reduce_to_pairing_check(const Proof& proof);
149
155 std::pair<Proof, Proof> split_rollup_proof(const Proof& combined_proof) const
156 requires(IO::HasIPA);
157
164 bool verify_ipa(const Proof& ipa_proof, const IPAClaim& ipa_claim)
165 requires(!IsRecursiveFlavor<Flavor> && IO::HasIPA);
166
179 Output verify_proof(const Proof& proof);
180
184 const std::shared_ptr<Transcript>& get_transcript() const { return transcript; }
185
190
194 const PublicInputs& get_public_inputs() const { return verifier_instance->public_inputs; }
195
199 const typename Flavor::WitnessCommitments& get_witness_commitments() const
200 {
201 return verifier_instance->witness_commitments;
202 }
203
208 requires(Flavor::HasDataBus)
209 {
210 return verifier_instance->witness_commitments.kernel_calldata();
211 }
212
216 auto get_ecc_op_wires() const
217 requires(Flavor::HasEccOpQueue)
218 {
219 return verifier_instance->witness_commitments.get_ecc_op_wires().get_copy();
220 }
221
222 private:
223 std::shared_ptr<VKAndHash> vk_and_hash;
225 std::shared_ptr<Transcript> transcript;
226 std::shared_ptr<Transcript> ipa_transcript; // Native only
227
228 // Builder pointer (extracted from VKAndHash for recursive, nullptr for native)
229 Builder* builder = nullptr;
230};
231
232// Native verifier type aliases
238#ifdef STARKNET_GARAGA_FLAVORS
239using UltraStarknetVerifier = UltraVerifier_<UltraStarknetFlavor, DefaultIO>;
240using UltraStarknetZKVerifier = UltraVerifier_<UltraStarknetZKFlavor, DefaultIO>;
241#endif
246
247} // namespace bb
std::vector< DataType > Proof
typename Curve::ScalarField FF
typename G1::affine_element Commitment
curve::Grumpkin Curve
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
BaseTranscript< Codec, HashFunction > Transcript
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition claim.hpp:55
An object storing two EC points that represent the inputs to a pairing check.
std::shared_ptr< VKAndHash > vk_and_hash
bool verify_ipa(const Proof &ipa_proof, const IPAClaim &ipa_claim)
Verify IPA proof for rollup circuits (native verifier only)
ReductionResult reduce_to_pairing_check(const Proof &proof)
Reduce ultra proof to verification claims (works for both native and recursive)
typename Transcript::Proof Proof
std::conditional_t< IsRecursive, stdlib::recursion::PairingPoints< Curve >, bb::PairingPoints< Curve > > PairingPoints
std::conditional_t< IsRecursive, typename Flavor::CircuitBuilder, void > Builder
const std::shared_ptr< Instance > & get_verifier_instance() const
Get the verifier instance (for accessing VK and witness commitments in Chonk/Goblin)
size_t compute_log_n() const
Compute log_n based on flavor.
OpeningClaim< IPACurve > IPAClaim
std::vector< FF > PublicInputs
const Flavor::WitnessCommitments & get_witness_commitments() const
Get witness commitments from the verifier instance.
std::shared_ptr< Instance > verifier_instance
typename Flavor::VerificationKey VerificationKey
std::pair< Proof, Proof > split_rollup_proof(const Proof &combined_proof) const
Split a combined rollup proof into honk and IPA components.
const PublicInputs & get_public_inputs() const
Get public inputs from the verifier instance.
typename Flavor::VKAndHash VKAndHash
A constructor for native and recursive verifiers.
std::conditional_t< IsRecursive, stdlib::recursion::honk::UltraRecursiveVerifierOutput< Builder >, UltraVerifierOutput< Flavor > > Output
const std::shared_ptr< Transcript > & get_transcript() const
Get the transcript (for accessing manifest in tests)
static constexpr bool IsRecursive
std::shared_ptr< Transcript > ipa_transcript
typename Flavor::Transcript Transcript
typename Flavor::Curve Curve
const Commitment & get_calldata_commitment() const
Get kernel_calldata commitment (flavors that include databus only)
auto get_ecc_op_wires() const
Get ECC op wire commitments as an array (flavors that own an ECC op queue).
std::shared_ptr< Transcript > transcript
typename Flavor::Commitment Commitment
typename VerifierCommitmentsConstructor< Flavor >::Commitments VerifierCommitments
std::conditional_t< IsRecursive, stdlib::grumpkin< Builder >, curve::Grumpkin > IPACurve
UltraVerifier_(const std::shared_ptr< VKAndHash > &vk_and_hash, const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
Output verify_proof(const Proof &proof)
Perform ultra verification.
typename Flavor::PCS PCS
typename Flavor::FF FF
typename VerifierCommitmentEntities< Flavor, Commitment >::Type Commitments
The VerifierInstance encapsulates all the necessary information for a Honk Verifier to verify a proof...
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:20
Manages the data that is propagated on the public inputs of a hiding kernel circuit.
AvmProvingInputs inputs
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Result of reducing ultra proof to pairing points check. Contains pairing points and the aggregate res...
Flavor::Commitment kernel_return_data
typename Flavor::Commitment Commitment
std::array< Commitment, Flavor::NUM_WIRES > ecc_op_tables
field_t< CircuitBuilder > ScalarField
Definition bn254.hpp:30
element< CircuitBuilder, bigfield< CircuitBuilder, bb::Bn254FqParams >, ScalarField, GroupNative > Group
Definition bn254.hpp:31
An object storing two EC points that represent the inputs to a pairing check.
Output type for recursive ultra verification.
void throw_or_abort(std::string const &err)