Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
utils.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Completed, auditors: [Federico], commit: d4aff8893338c31425565db5a5a560048c33f27a}
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
8#include <vector>
9
10namespace acir_format {
11
12using namespace bb;
13using namespace bb::stdlib;
14
15template <typename Builder>
16std::vector<field_t<Builder>> fields_from_witnesses(Builder& builder, std::span<const uint32_t> witness_indices)
17{
19 result.reserve(witness_indices.size());
20 for (const auto& idx : witness_indices) {
21 result.emplace_back(field_t<Builder>::from_witness_index(&builder, idx));
22 }
23 return result;
24}
25
26template <typename Builder> byte_array<Builder> fields_to_bytes(Builder& builder, std::vector<field_t<Builder>>& fields)
27{
29 for (auto& field : fields) {
30 // Construct byte array of length 1 from the field element
31 // The constructor enforces that `field` fits in one byte
32 byte_array<Builder> byte_to_append(field, /*num_bytes=*/1);
33 // Append the new byte to the result
34 result.write(byte_to_append);
35 }
36
37 return result;
38}
39
40std::vector<uint32_t> add_public_inputs_to_proof(const std::vector<uint32_t>& proof_in,
41 const std::vector<uint32_t>& public_inputs)
42{
43 std::vector<uint32_t> proof;
44 proof.reserve(proof_in.size() + public_inputs.size());
45
46 // Construct the complete proof as the concatenation {public_inputs | proof_in}
47 proof.insert(proof.end(), public_inputs.begin(), public_inputs.end());
48 proof.insert(proof.end(), proof_in.begin(), proof_in.end());
49
50 return proof;
51}
52
54 const std::vector<bb::fr>& proof,
55 const std::vector<bb::fr>& key,
56 const bb::fr& key_hash,
57 const bb::fr& predicate,
58 const size_t num_public_inputs_to_extract,
59 const uint32_t proof_type)
60{
61 // Slice the proof extracting all public inputs except for those corresponding to the aggregation object
62 std::vector<bb::fr> public_inputs(proof.begin(),
63 proof.begin() + static_cast<ptrdiff_t>(num_public_inputs_to_extract));
64 std::vector<bb::fr> proof_without_public_inputs(
65 proof.begin() + static_cast<ptrdiff_t>(num_public_inputs_to_extract), proof.end());
66
69 .proof = add_to_witness_and_track_indices(witness, proof_without_public_inputs),
70 .public_inputs = add_to_witness_and_track_indices(witness, public_inputs),
71 .key_hash = add_to_witness_and_track_indices(witness, key_hash),
72 .proof_type = proof_type,
74 };
75}
76
77template <typename Builder>
78void populate_fields(Builder& builder, const std::vector<field_t<Builder>>& fields, const std::vector<bb::fr>& values)
79{
80 for (const auto [field, value] : zip_view(fields, values)) {
81 builder.set_variable(field.get_witness_index(), value);
82 }
83};
84
85// Explicit template instantiations
87 UltraCircuitBuilder&, std::span<const uint32_t>);
89 std::span<const uint32_t>);
90
94 std::vector<field_t<MegaCircuitBuilder>>&);
95
97 const std::vector<field_t<UltraCircuitBuilder>>&,
98 const std::vector<bb::fr>&);
100 const std::vector<field_t<MegaCircuitBuilder>>&,
101 const std::vector<bb::fr>&);
102} // namespace acir_format
Represents a dynamic array of bytes in-circuit.
byte_array & write(byte_array const &other)
Appends the contents of another byte_array (other) to the end of this one.
AluTraceBuilder builder
Definition alu.test.cpp:124
template byte_array< MegaCircuitBuilder > fields_to_bytes< MegaCircuitBuilder >(MegaCircuitBuilder &, std::vector< field_t< MegaCircuitBuilder > > &)
template std::vector< field_t< MegaCircuitBuilder > > fields_from_witnesses< MegaCircuitBuilder >(MegaCircuitBuilder &, std::span< const uint32_t >)
void populate_fields(Builder &builder, const std::vector< field_t< Builder > > &fields, const std::vector< bb::fr > &values)
========== WRITE_VK UTILITIES ========== ///
Definition utils.cpp:78
std::vector< field_t< Builder > > fields_from_witnesses(Builder &builder, std::span< const uint32_t > witness_indices)
========== ACIR TO BARRETENBERG ========== ///
Definition utils.cpp:16
RecursionConstraint recursion_data_to_recursion_constraint(std::vector< bb::fr > &witness, const std::vector< bb::fr > &proof, const std::vector< bb::fr > &key, const bb::fr &key_hash, const bb::fr &predicate, const size_t num_public_inputs_to_extract, const uint32_t proof_type)
========== TESTING UTILITIES ========== ///
Definition utils.cpp:53
template std::vector< field_t< UltraCircuitBuilder > > fields_from_witnesses< UltraCircuitBuilder >(UltraCircuitBuilder &, std::span< const uint32_t >)
template void populate_fields< UltraCircuitBuilder >(UltraCircuitBuilder &, const std::vector< field_t< UltraCircuitBuilder > > &, const std::vector< bb::fr > &)
std::vector< uint32_t > add_to_witness_and_track_indices(std::vector< bb::fr > &witness, const T &input)
Append values to a witness vector and track their indices.
Definition utils.hpp:90
std::vector< uint32_t > add_public_inputs_to_proof(const std::vector< uint32_t > &proof_in, const std::vector< uint32_t > &public_inputs)
Reconstruct a barretenberg style proof from an ACIR style proof + public inputs.
Definition utils.cpp:40
template byte_array< UltraCircuitBuilder > fields_to_bytes< UltraCircuitBuilder >(UltraCircuitBuilder &, std::vector< field_t< UltraCircuitBuilder > > &)
byte_array< Builder > fields_to_bytes(Builder &builder, std::vector< field_t< Builder > > &fields)
Convert a vector of field_t elements to a byte_array enforcing each element to fit in one byte.
Definition utils.cpp:26
template void populate_fields< MegaCircuitBuilder >(MegaCircuitBuilder &, const std::vector< field_t< MegaCircuitBuilder > > &, const std::vector< bb::fr > &)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
RecursionConstraint struct contains information required to recursively verify a proof.
static WitnessOrConstant from_index(uint32_t index)
General class for prime fields see Prime field documentation["field documentation"] for general imple...