Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
proof_surgeon.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
18#include <cstdint>
19
20namespace acir_format {
21
22template <typename FF> class ProofSurgeon {
23 public:
34 static std::vector<uint32_t> create_indices_for_reconstructed_proof(const std::vector<uint32_t>& proof_in,
35 const std::vector<uint32_t>& public_inputs)
36 {
37 std::vector<uint32_t> proof;
38 proof.reserve(proof_in.size() + public_inputs.size());
39
40 // Construct the complete proof as the concatenation {"initial data" | public_inputs | proof_in}
41 proof.insert(proof.end(), public_inputs.begin(), public_inputs.end());
42 proof.insert(proof.end(), proof_in.begin(), proof_in.end());
43
44 return proof;
45 }
46
54 static std::vector<FF> cut_public_inputs_from_proof(std::vector<FF>& proof_witnesses,
55 const size_t num_public_inputs_to_extract)
56 {
57 // Construct iterators pointing to the start and end of the public inputs within the proof
58 auto pub_inputs_begin_itr = proof_witnesses.begin();
59 auto pub_inputs_end_itr = proof_witnesses.begin() + static_cast<std::ptrdiff_t>(num_public_inputs_to_extract);
60
61 // Construct the isolated public inputs
62 std::vector<FF> public_input_witnesses{ pub_inputs_begin_itr, pub_inputs_end_itr };
63
64 // Erase the public inputs from the proof
65 proof_witnesses.erase(pub_inputs_begin_itr, pub_inputs_end_itr);
66
67 return public_input_witnesses;
68 }
69
78 const bb::stdlib::Proof<bb::MegaCircuitBuilder>& proof, const size_t num_public_inputs_to_extract)
79 {
80 std::vector<uint32_t> public_input_witness_indices;
81 public_input_witness_indices.reserve(num_public_inputs_to_extract);
82
83 const size_t start = 0;
84 const size_t end = start + num_public_inputs_to_extract;
85 for (size_t i = start; i < end; ++i) {
86 public_input_witness_indices.push_back(proof[i].get_witness_index());
87 }
88
89 return public_input_witness_indices;
90 }
91
93 std::vector<uint32_t> key_indices;
95 std::vector<uint32_t> proof_indices;
96 std::vector<uint32_t> public_inputs_indices;
97 };
98
113 std::vector<FF>& proof_witnesses,
114 const std::vector<FF>& key_witnesses,
115 const FF& key_hash_witness,
116 const size_t num_public_inputs_to_extract)
117 {
118 // Extract all public inputs except for those corresponding to the aggregation object
119 std::vector<FF> public_input_witnesses =
120 cut_public_inputs_from_proof(proof_witnesses, num_public_inputs_to_extract);
121
122 // Append key, proof, and public inputs while storing the associated witness indices
123 std::vector<uint32_t> key_indices = add_to_witness_and_track_indices<FF>(witness, key_witnesses);
124 uint32_t key_hash_index = static_cast<uint32_t>(witness.size());
125 witness.emplace_back(key_hash_witness);
126 std::vector<uint32_t> proof_indices = add_to_witness_and_track_indices<FF>(witness, proof_witnesses);
127 std::vector<uint32_t> public_input_indices =
128 add_to_witness_and_track_indices<FF>(witness, public_input_witnesses);
129
130 return { key_indices, key_hash_index, proof_indices, public_input_indices };
131 }
132};
133
134} // namespace acir_format
static std::vector< FF > cut_public_inputs_from_proof(std::vector< FF > &proof_witnesses, const size_t num_public_inputs_to_extract)
Extract then remove a given number of public inputs from a proof.
static std::vector< uint32_t > create_indices_for_reconstructed_proof(const std::vector< uint32_t > &proof_in, const std::vector< uint32_t > &public_inputs)
Reconstruct a bberg style proof from a acir style proof + public inputs.
static RecursionWitnessData populate_recursion_witness_data(bb::SlabVector< FF > &witness, std::vector< FF > &proof_witnesses, const std::vector< FF > &key_witnesses, const FF &key_hash_witness, const size_t num_public_inputs_to_extract)
Populate a witness vector with key, proof, and public inputs; track witness indices for each componen...
static std::vector< uint32_t > get_public_inputs_witness_indices_from_proof(const bb::stdlib::Proof< bb::MegaCircuitBuilder > &proof, const size_t num_public_inputs_to_extract)
Get the witness indices for a given number of public inputs contained within a stdlib proof.
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:19
Base class templates for structures that contain data parameterized by the fundamental polynomials of...
typename Flavor::FF FF
std::vector< T, bb::ContainerSlabAllocator< T > > SlabVector
A vector that uses the slab allocator.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13