barretenberg
Loading...
Searching...
No Matches
verification_key.hpp
1#pragma once
2#include "barretenberg/common/streams.hpp"
3#include "barretenberg/crypto/sha256/sha256.hpp"
4#include "barretenberg/ecc/curves/bn254/bn254.hpp"
5#include "barretenberg/ecc/curves/bn254/fr.hpp"
6#include "barretenberg/plonk/proof_system/types/polynomial_manifest.hpp"
7#include "barretenberg/polynomials/evaluation_domain.hpp"
8#include "barretenberg/serialize/msgpack.hpp"
9#include "barretenberg/srs/global_crs.hpp"
10#include <map>
11
12namespace proof_system::plonk {
13
15 uint32_t circuit_type;
16 uint32_t circuit_size;
17 uint32_t num_public_inputs;
18 std::map<std::string, barretenberg::g1::affine_element> commitments;
19 bool contains_recursive_proof = false;
20 std::vector<uint32_t> recursive_proof_public_input_indices;
21
22 // for serialization: update with any new fields
23 MSGPACK_FIELDS(circuit_type,
24 circuit_size,
25 num_public_inputs,
26 commitments,
27 contains_recursive_proof,
28 recursive_proof_public_input_indices);
29 [[nodiscard]] barretenberg::fr hash_native(size_t hash_index = 0) const;
30};
31
32inline std::ostream& operator<<(std::ostream& os, verification_key_data const& key)
33{
34 return os << "key.circuit_type: " << static_cast<uint32_t>(key.circuit_type) << "\n"
35 << "key.circuit_size: " << static_cast<uint32_t>(key.circuit_size) << "\n"
36 << "key.num_public_inputs: " << static_cast<uint32_t>(key.num_public_inputs) << "\n"
37 << "key.commitments: " << key.commitments << "\n"
38 << "key.contains_recursive_proof: " << key.contains_recursive_proof << "\n"
39 << "key.recursive_proof_public_input_indices: " << key.recursive_proof_public_input_indices << "\n";
40};
41
42inline bool operator==(verification_key_data const& lhs, verification_key_data const& rhs)
43{
44 return lhs.circuit_type == rhs.circuit_type && lhs.circuit_size == rhs.circuit_size &&
45 lhs.num_public_inputs == rhs.num_public_inputs && lhs.commitments == rhs.commitments;
46}
47
49 // default constructor needed for msgpack unpack
50 verification_key() = default;
53 verification_key(size_t num_gates,
54 size_t num_inputs,
56 CircuitType circuit_type);
57
59 verification_key(verification_key&& other) noexcept;
60 verification_key& operator=(verification_key&& other) noexcept;
61 verification_key& operator=(const verification_key& other) = delete;
62 ~verification_key() = default;
63
64 sha256::hash sha256_hash();
65
66 [[nodiscard]] verification_key_data as_data() const
67 {
68 return {
69 .circuit_type = static_cast<uint32_t>(circuit_type),
70 .circuit_size = static_cast<uint32_t>(circuit_size),
71 .num_public_inputs = static_cast<uint32_t>(num_public_inputs),
72 .commitments = commitments,
73 .contains_recursive_proof = contains_recursive_proof,
74 .recursive_proof_public_input_indices = recursive_proof_public_input_indices,
75 };
76 }
77
78 CircuitType circuit_type;
79 size_t circuit_size;
80 size_t log_circuit_size;
81 size_t num_public_inputs;
82
84
85 std::shared_ptr<barretenberg::srs::factories::VerifierCrs<curve::BN254>> reference_string;
86
87 std::map<std::string, barretenberg::g1::affine_element> commitments;
88
89 PolynomialManifest polynomial_manifest;
90
91 // This is a member variable so as to avoid recomputing it in the different places of the verifier algorithm.
92 // Note that recomputing would also have added constraints to the recursive verifier circuit.
93 barretenberg::fr z_pow_n; // ʓ^n (ʓ being the 'evaluation challenge')
94
95 bool contains_recursive_proof = false;
96 std::vector<uint32_t> recursive_proof_public_input_indices;
97 size_t program_width = 3;
98
99 // for serialization: update with new fields
100 void msgpack_pack(auto& packer) const
101 {
102 verification_key_data data = { static_cast<uint32_t>(circuit_type),
103 static_cast<uint32_t>(circuit_size),
104 static_cast<uint32_t>(num_public_inputs),
105 commitments,
106 contains_recursive_proof,
107 recursive_proof_public_input_indices };
108 packer.pack(data);
109 }
110 void msgpack_unpack(auto obj)
111 {
112 verification_key_data data = obj;
113 *this = verification_key{ std::move(data), barretenberg::srs::get_crs_factory()->get_verifier_crs() };
114 }
115 // Alias verification_key as verification_key_data in the schema
116 void msgpack_schema(auto& packer) const { packer.pack_schema(proof_system::plonk::verification_key_data{}); }
117};
118
119template <typename B> inline void read(B& buf, verification_key& key)
120{
121 using serialize::read;
122 verification_key_data vk_data;
123 read(buf, vk_data);
124 key = verification_key{ std::move(vk_data), barretenberg::srs::get_crs_factory()->get_verifier_crs() };
125}
126
127template <typename B> inline void read(B& buf, std::shared_ptr<verification_key>& key)
128{
129 using serialize::read;
130 verification_key_data vk_data;
131 read(buf, vk_data);
132 key = std::make_shared<verification_key>(std::move(vk_data),
133 barretenberg::srs::get_crs_factory()->get_verifier_crs());
134}
135
136template <typename B> inline void write(B& buf, verification_key const& key)
137{
138 using serialize::write;
139 write(buf, key.as_data());
140}
141
142inline std::ostream& operator<<(std::ostream& os, verification_key const& key)
143{
144 return os << key.as_data();
145};
146
147} // namespace proof_system::plonk
Definition: crs_factory.hpp:30
Definition: polynomial_manifest.hpp:142
Definition: widget.bench.cpp:13
Definition: verification_key.hpp:14
barretenberg::fr hash_native(size_t hash_index=0) const
Hash the verification key data.
Definition: verification_key.cpp:41
Definition: verification_key.hpp:48