Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
recursive_decider_verification_key.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
12
14
18template <IsRecursiveFlavor Flavor> class RecursiveDeciderVerificationKey_ {
19 public:
20 using FF = typename Flavor::FF;
21 using NativeFF = typename Flavor::Curve::ScalarFieldNative;
24 using VKAndHash = typename Flavor::VKAndHash;
29 using NativeFlavor = typename Flavor::NativeFlavor;
32 using VerifierCommitmentKey = typename NativeFlavor::VerifierCommitmentKey;
34
36
37 std::shared_ptr<VKAndHash> vk_and_hash;
38
39 bool is_complete = false; // whether this instance has been completely populated
40 std::vector<FF> public_inputs; // to be extracted from the corresponding proof
41
42 // An array {1, α₁, …, αₖ}, where k = NUM_SUBRELATIONS - 1.
45 std::vector<FF> gate_challenges;
46 // The target sum, which is typically nonzero for a ProtogalaxyProver's accmumulator
48
51
54
55 // Constructor from native vk
61
62 // Constructor from stdlib vk and hash
66
68 : RecursiveDeciderVerificationKey_(builder, verification_key->vk)
69 {
70 is_complete = verification_key->is_complete;
71 if (is_complete) {
72 for (size_t alpha_idx = 0; alpha_idx < Flavor::NUM_SUBRELATIONS - 1; alpha_idx++) {
73 alphas[alpha_idx] = FF::from_witness(builder, verification_key->alphas[alpha_idx]);
74 }
75
76 auto other_comms = verification_key->witness_commitments.get_all();
77 size_t comm_idx = 0;
78 for (auto& comm : witness_commitments.get_all()) {
79 comm = Commitment::from_witness(builder, other_comms[comm_idx]);
80 comm_idx++;
81 }
82 target_sum = FF::from_witness(builder, verification_key->target_sum);
83 size_t challenge_idx = 0;
84 gate_challenges = std::vector<FF>(verification_key->gate_challenges.size());
85 for (auto& challenge : gate_challenges) {
86 challenge = FF::from_witness(builder, verification_key->gate_challenges[challenge_idx]);
87 challenge_idx++;
88 }
89 relation_parameters.eta = FF::from_witness(builder, verification_key->relation_parameters.eta);
90 relation_parameters.eta_two = FF::from_witness(builder, verification_key->relation_parameters.eta_two);
91 relation_parameters.eta_three = FF::from_witness(builder, verification_key->relation_parameters.eta_three);
92 relation_parameters.beta = FF::from_witness(builder, verification_key->relation_parameters.beta);
93 relation_parameters.gamma = FF::from_witness(builder, verification_key->relation_parameters.gamma);
95 FF::from_witness(builder, verification_key->relation_parameters.public_input_delta);
96 }
97 }
98
107 {
109 auto native_honk_vk = std::make_shared<NativeVerificationKey>();
110 native_honk_vk->log_circuit_size = static_cast<uint64_t>(vk_and_hash->vk->log_circuit_size.get_value());
111 native_honk_vk->num_public_inputs = static_cast<uint64_t>(vk_and_hash->vk->num_public_inputs.get_value());
112 native_honk_vk->pub_inputs_offset = static_cast<uint64_t>(vk_and_hash->vk->pub_inputs_offset.get_value());
113
114 for (auto [vk, final_decider_vk] : zip_view(vk_and_hash->vk->get_all(), native_honk_vk->get_all())) {
115 final_decider_vk = vk.get_value();
116 }
117
118 NativeDeciderVerificationKey decider_vk(native_honk_vk);
119 decider_vk.is_complete = is_complete;
120
121 for (auto [alpha, inst_alpha] : zip_view(alphas, decider_vk.alphas)) {
122 inst_alpha = alpha.get_value();
123 }
124
125 for (auto [comm, inst_comm] :
126 zip_view(witness_commitments.get_all(), decider_vk.witness_commitments.get_all())) {
127 inst_comm = comm.get_value();
128 }
129 decider_vk.target_sum = target_sum.get_value();
130
132 for (auto [challenge, inst_challenge] : zip_view(gate_challenges, decider_vk.gate_challenges)) {
133 inst_challenge = challenge.get_value();
134 }
135
136 decider_vk.relation_parameters.eta = relation_parameters.eta.get_value();
139 decider_vk.relation_parameters.beta = relation_parameters.beta.get_value();
140 decider_vk.relation_parameters.gamma = relation_parameters.gamma.get_value();
142 return decider_vk;
143 }
144
145 FF hash_through_transcript(const std::string& domain_separator, Transcript& transcript) const
146 {
147 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_log_circuit_size",
148 this->vk_and_hash->vk->log_circuit_size);
149 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_num_public_inputs",
150 this->vk_and_hash->vk->num_public_inputs);
151 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_pub_inputs_offset",
152 this->vk_and_hash->vk->pub_inputs_offset);
153
154 for (const Commitment& commitment : this->vk_and_hash->vk->get_all()) {
155 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_precomputed_comm", commitment);
156 }
157 for (const Commitment& comm : witness_commitments.get_all()) {
158 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_wit_comm", comm);
159 }
160 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_alphas", this->alphas);
161 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_eta", this->relation_parameters.eta);
162 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_eta_two",
163 this->relation_parameters.eta_two);
164 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_eta_three",
165 this->relation_parameters.eta_three);
166 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_beta", this->relation_parameters.beta);
167 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_gamma",
168 this->relation_parameters.gamma);
169 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_public_input_delta",
170 this->relation_parameters.public_input_delta);
171 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_target_sum", this->target_sum);
172 transcript.add_to_independent_hash_buffer(domain_separator + "decider_vk_gate_challenges",
173 this->gate_challenges);
174
175 return transcript.hash_independent_buffer();
176 }
177};
178} // namespace bb::stdlib::recursion::honk
DataType hash_independent_buffer()
Hashes the independent hash buffer and clears it.
void add_to_independent_hash_buffer(const std::string &label, const T &element)
Adds an element to an independent hash buffer.
The DeciderVerificationKey encapsulates all the necessary information for a Mega Honk Verifier to ver...
RelationParameters< FF > relation_parameters
A container for commitment labels.
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
WitnessEntities< Commitment > WitnessCommitments
A container for the witness commitments.
Curve::ScalarField FF
std::array< FF, NUM_SUBRELATIONS - 1 > SubrelationSeparators
static constexpr size_t NUM_SUBRELATIONS
NativeTranscript Transcript
MegaCircuitBuilder CircuitBuilder
Curve::AffineElement Commitment
The stdlib counterpart of DeciderVerificationKey, used in recursive folding verification.
NativeDeciderVerificationKey get_value()
Return the underlying native DeciderVerificationKey.
RecursiveDeciderVerificationKey_(Builder *builder, std::shared_ptr< VKAndHash > vk_and_hash)
RecursiveDeciderVerificationKey_(Builder *builder, std::shared_ptr< NativeVerificationKey > vk)
FF hash_through_transcript(const std::string &domain_separator, Transcript &transcript) const
RecursiveDeciderVerificationKey_(Builder *builder, std::shared_ptr< NativeDeciderVerificationKey > verification_key)
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
void hash(State &state) noexcept
VerifierCommitmentKey< Curve > vk
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Container for parameters used by the grand product (permutation, lookup) Honk relations.