Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
recursion_constraint.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
21#include <cstdint>
22#include <vector>
23
24namespace acir_format {
25
26using namespace bb;
27using namespace stdlib;
28
29// Used to specify the type of recursive verifier via the proof_type specified by the RecursiveAggregation opcode from
30// ACIR
31// Keep this enum values in sync with their noir counterpart constants defined in
32// noir-projects/noir-protocol-circuits/crates/types/src/constants.nr
34
35// Check if a PROOF_TYPE is a HyperNova variant (OINK, HN, HN_TAIL, HN_FINAL)
36constexpr bool is_hypernova_proof_type(uint32_t proof_type)
37{
38 return proof_type == PROOF_TYPE::OINK || proof_type == PROOF_TYPE::HN || proof_type == PROOF_TYPE::HN_TAIL ||
39 proof_type == PROOF_TYPE::HN_FINAL;
40}
41
42// Convert ACIR PROOF_TYPE to Chonk::QUEUE_TYPE. Throws for non-HyperNova types.
43// Note: QUEUE_TYPE::MEGA is internal to Chonk and has no ACIR equivalent.
45{
46 switch (proof_type) {
48 return Chonk::QUEUE_TYPE::OINK;
49 case PROOF_TYPE::HN:
50 return Chonk::QUEUE_TYPE::HN;
52 return Chonk::QUEUE_TYPE::HN_TAIL;
54 return Chonk::QUEUE_TYPE::HN_FINAL;
55 default:
56 throw_or_abort("proof_type_to_chonk_queue_type: invalid type " + std::to_string(proof_type));
57 }
58}
59
60// Inverse of proof_type_to_chonk_queue_type. Throws for MEGA (no ACIR equivalent).
62{
63 switch (queue_type) {
64 case Chonk::QUEUE_TYPE::OINK:
65 return PROOF_TYPE::OINK;
66 case Chonk::QUEUE_TYPE::HN:
67 return PROOF_TYPE::HN;
68 case Chonk::QUEUE_TYPE::HN_TAIL:
70 case Chonk::QUEUE_TYPE::HN_FINAL:
72 case Chonk::QUEUE_TYPE::MEGA:
73 throw_or_abort("queue_type_to_proof_type: MEGA has no ACIR equivalent");
74 }
75 throw_or_abort("queue_type_to_proof_type: unknown type");
76}
77
78// Static assertions to catch PROOF_TYPE/QUEUE_TYPE enum desync at compile time
79namespace detail {
80// PROOF_TYPE values must match Noir constants
81static_assert(PROOF_TYPE::OINK == 1);
82static_assert(PROOF_TYPE::HN == 2);
83static_assert(PROOF_TYPE::HN_FINAL == 7);
84static_assert(PROOF_TYPE::HN_TAIL == 8);
85
86// QUEUE_TYPE ordering (internal, but catch unexpected changes)
87static_assert(static_cast<uint8_t>(Chonk::QUEUE_TYPE::OINK) == 0);
88static_assert(static_cast<uint8_t>(Chonk::QUEUE_TYPE::HN) == 1);
89static_assert(static_cast<uint8_t>(Chonk::QUEUE_TYPE::HN_TAIL) == 2);
90static_assert(static_cast<uint8_t>(Chonk::QUEUE_TYPE::HN_FINAL) == 3);
91static_assert(static_cast<uint8_t>(Chonk::QUEUE_TYPE::MEGA) == 4);
92} // namespace detail
93
120 std::vector<uint32_t> key;
121 std::vector<uint32_t> proof;
122 std::vector<uint32_t> public_inputs;
123 uint32_t key_hash;
124 uint32_t proof_type;
126
127 friend bool operator==(RecursionConstraint const& lhs, RecursionConstraint const& rhs) = default;
128};
129
157template <typename Builder>
160 GateCounter<Builder>& gate_counter,
161 std::vector<size_t>& gates_per_opcode,
162 [[maybe_unused]] const std::shared_ptr<IVCBase>& ivc_base,
163 const std::pair<std::vector<RecursionConstraint>, std::vector<size_t>>& honk_recursion_data,
164 const std::pair<std::vector<RecursionConstraint>, std::vector<size_t>>& avm_recursion_data,
165 const std::pair<std::vector<RecursionConstraint>, std::vector<size_t>>& hn_recursion_data,
166 const std::pair<std::vector<RecursionConstraint>, std::vector<size_t>>& chonk_recursion_data);
167
180 std::vector<size_t>& gates_per_opcode,
181 const std::pair<std::vector<RecursionConstraint>, std::vector<size_t>>& hn_recursion_data,
182 const std::shared_ptr<IVCBase>& ivc_base);
183
184} // namespace acir_format
Utility class for tracking the gate count of acir constraints.
QUEUE_TYPE
Proof type determining recursive verification logic in kernel circuits.
Definition chonk.hpp:105
AluTraceBuilder builder
Definition alu.test.cpp:124
void process_hn_recursion_constraints(MegaCircuitBuilder &builder, GateCounter< MegaCircuitBuilder > &gate_counter, std::vector< size_t > &gates_per_opcode, const std::pair< std::vector< RecursionConstraint >, std::vector< size_t > > &hn_recursion_data, const std::shared_ptr< IVCBase > &ivc_base)
Process HyperNova recursion constraints and complete kernel logic.
PROOF_TYPE queue_type_to_proof_type(Chonk::QUEUE_TYPE queue_type)
HonkRecursionConstraintsOutput< MegaCircuitBuilder > create_recursion_constraints(MegaCircuitBuilder &builder, GateCounter< MegaCircuitBuilder > &gate_counter, std::vector< size_t > &gates_per_opcode, const std::shared_ptr< IVCBase > &ivc_base, const std::pair< std::vector< RecursionConstraint >, std::vector< size_t > > &honk_recursion_data, const std::pair< std::vector< RecursionConstraint >, std::vector< size_t > > &avm_recursion_data, const std::pair< std::vector< RecursionConstraint >, std::vector< size_t > > &hn_recursion_data, const std::pair< std::vector< RecursionConstraint >, std::vector< size_t > > &chonk_recursion_data)
constexpr bool is_hypernova_proof_type(uint32_t proof_type)
Chonk::QUEUE_TYPE proof_type_to_chonk_queue_type(uint32_t proof_type)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
Container for the output of multiple recursive verifications.
RecursionConstraint struct contains information required to recursively verify a proof.
WitnessOrConstant< bb::fr > predicate
friend bool operator==(RecursionConstraint const &lhs, RecursionConstraint const &rhs)=default
void throw_or_abort(std::string const &err)