Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
chonk_proof.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
20#include <fstream>
21
22namespace bb {
23
36template <bool IsRecursive = false> struct ChonkProof_ {
40
41 HonkProof hiding_oink_proof; // Hiding kernel Oink (pre-sumcheck only)
42 HonkProof merge_proof; // Merge proof
43 HonkProof eccvm_proof; // ECCVM proof
44 HonkProof ipa_proof; // IPA opening proof (separate transcript)
45 HonkProof joint_proof; // Translator Oink + joint sumcheck + joint PCS
46
47 // Sub-proof sizes (in field elements, excluding public inputs).
49
50 // Joint proof = translator proof structure (with committed sumcheck) + MegaZK evaluations.
51 static constexpr size_t JOINT_PROOF_LENGTH =
53
54 static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS =
55 HIDING_OINK_LENGTH + MERGE_PROOF_SIZE + ECCVMFlavor::PROOF_LENGTH + IPA_PROOF_LENGTH + JOINT_PROOF_LENGTH;
57
58 // Default constructor
59 ChonkProof_() = default;
60
61 // 5-arg constructor
62 ChonkProof_(HonkProof mega_zk, HonkProof merge, HonkProof eccvm, HonkProof ipa, HonkProof joint)
63 : hiding_oink_proof(std::move(mega_zk))
64 , merge_proof(std::move(merge))
65 , eccvm_proof(std::move(eccvm))
66 , ipa_proof(std::move(ipa))
67 , joint_proof(std::move(joint))
68 {}
69
70 // Constructs a stdlib Chonk proof from a native Chonk proof
71 template <typename B = Builder>
72 requires IsRecursive
80
81 size_t size() const
82 {
83 return hiding_oink_proof.size() + merge_proof.size() + eccvm_proof.size() + ipa_proof.size() +
84 joint_proof.size();
85 }
86
90 std::vector<FF> to_field_elements() const;
91
95 static ChonkProof_ from_field_elements(const std::vector<FF>& fields);
96
97 public:
98 // MSGPACK methods (native mode only)
99 msgpack::sbuffer to_msgpack_buffer() const
100 requires(!IsRecursive)
101 {
102 msgpack::sbuffer buffer;
103 msgpack::pack(buffer, *this);
104 return buffer;
105 }
106
107 uint8_t* to_msgpack_heap_buffer() const
108 requires(!IsRecursive)
109 {
110 msgpack::sbuffer buffer = to_msgpack_buffer();
111 std::vector<uint8_t> buf(buffer.data(), buffer.data() + buffer.size());
112 return to_heap_buffer(buf);
113 }
114
115 static ChonkProof_ from_msgpack_buffer(uint8_t const*& buffer)
116 requires(!IsRecursive)
117 {
118 auto uint8_buffer = from_buffer<std::vector<uint8_t>>(buffer);
119 msgpack::sbuffer sbuf;
120 sbuf.write(reinterpret_cast<char*>(uint8_buffer.data()), uint8_buffer.size());
121 return from_msgpack_buffer(sbuf);
122 }
123
124 static ChonkProof_ from_msgpack_buffer(const msgpack::sbuffer& buffer)
125 requires(!IsRecursive)
126 {
128 msgpack::object_handle oh = msgpack::unpack(buffer.data(), buffer.size(), offset);
129 if (offset != buffer.size()) {
130 throw_or_abort("ChonkProof::from_msgpack_buffer: trailing data (" + std::to_string(buffer.size() - offset) +
131 " extra bytes)");
132 }
133 ChonkProof_ proof;
134 oh.get().convert(proof);
135 return proof;
136 }
137
138 void to_file_msgpack(const std::string& filename) const
139 requires(!IsRecursive)
140 {
141 msgpack::sbuffer buffer = to_msgpack_buffer();
142 std::ofstream ofs(filename, std::ios::binary);
143 if (!ofs.is_open()) {
144 throw_or_abort("Failed to open file for writing.");
145 }
146 ofs.write(buffer.data(), static_cast<std::streamsize>(buffer.size()));
147 ofs.close();
148 }
149
150 static ChonkProof_ from_file_msgpack(const std::string& filename)
151 requires(!IsRecursive)
152 {
153 std::ifstream ifs(filename, std::ios::binary);
154 if (!ifs.is_open()) {
155 throw_or_abort("Failed to open file for reading.");
156 }
157 ifs.seekg(0, std::ios::end);
158 size_t file_size = static_cast<size_t>(ifs.tellg());
159 ifs.seekg(0, std::ios::beg);
160 std::vector<char> buffer(file_size);
161 ifs.read(buffer.data(), static_cast<std::streamsize>(file_size));
162 ifs.close();
163 msgpack::sbuffer msgpack_buffer;
164 msgpack_buffer.write(buffer.data(), file_size);
165 return ChonkProof_::from_msgpack_buffer(msgpack_buffer);
166 }
167
168 // MSGPACK support (native mode only)
169 static constexpr const char MSGPACK_SCHEMA_NAME[] = "ChonkProof";
170
171 class DeserializationError : public std::runtime_error {
172 public:
173 DeserializationError(const std::string& msg)
174 : std::runtime_error(std::string("Chonk Proof deserialization error: ") + msg)
175 {}
176 };
177
179 bool operator==(const ChonkProof_& other) const = default;
180};
181
182// Type aliases for convenience
183using ChonkProof = ChonkProof_<false>; // Native proof
184using ChonkStdlibProof = ChonkProof_<true>; // Recursive proof
185
186} // namespace bb
DeserializationError(const std::string &msg)
static constexpr size_t PROOF_LENGTH
static constexpr size_t PUBLIC_INPUTS_SIZE
static constexpr size_t NUM_ALL_ENTITIES
static constexpr size_t COMMITTED_SUMCHECK_PROOF_LENGTH
AluTraceBuilder builder
Definition alu.test.cpp:124
ssize_t offset
Definition engine.cpp:62
std::unique_ptr< uint8_t[]> buffer
Definition engine.cpp:60
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
uint8_t * to_heap_buffer(T const &value)
Chonk proof type.
ChonkProof_()=default
SERIALIZATION_FIELDS(hiding_oink_proof, merge_proof, eccvm_proof, ipa_proof, joint_proof)
std::conditional_t< IsRecursive, stdlib::field_t< Builder >, bb::fr > FF
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
HonkProof ipa_proof
static constexpr size_t JOINT_PROOF_LENGTH
ChonkProof_(B &builder, const ChonkProof_< false > &proof)
ChonkProof_(HonkProof mega_zk, HonkProof merge, HonkProof eccvm, HonkProof ipa, HonkProof joint)
std::conditional_t< IsRecursive, UltraCircuitBuilder, void > Builder
msgpack::sbuffer to_msgpack_buffer() const
uint8_t * to_msgpack_heap_buffer() const
static ChonkProof_ from_field_elements(const std::vector< FF > &fields)
Reconstruct proof from field elements.
static ChonkProof_ from_msgpack_buffer(uint8_t const *&buffer)
HonkProof merge_proof
HonkProof eccvm_proof
void to_file_msgpack(const std::string &filename) const
static ChonkProof_ from_msgpack_buffer(const msgpack::sbuffer &buffer)
size_t size() const
HonkProof joint_proof
std::conditional_t< IsRecursive, stdlib::Proof< Builder >, ::bb::HonkProof > HonkProof
HonkProof hiding_oink_proof
static constexpr size_t PROOF_LENGTH
std::vector< FF > to_field_elements() const
Serialize proof to field elements (native mode)
static ChonkProof_ from_file_msgpack(const std::string &filename)
static constexpr size_t HIDING_OINK_LENGTH
static constexpr const char MSGPACK_SCHEMA_NAME[]
bool operator==(const ChonkProof_ &other) const =default
Computes Oink proof length from flavor traits.
void throw_or_abort(std::string const &err)