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
17#include <fstream>
18
19namespace bb {
20
26template <bool IsRecursive = false> struct ChonkProof_ {
31
32 HonkProof mega_proof; // MegaZK proof of the hiding kernel circuit
33 GoblinProof goblin_proof; // Goblin proof (Merge + ECCVM + IPA + Translator)
34
35 // Hiding kernel proof length (MegaZK with fixed circuit size)
38
42 static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS =
44 /*merge_proof*/ MERGE_PROOF_SIZE +
45 /*eccvm proof*/ ECCVMFlavor::PROOF_LENGTH +
46 /*ipa proof*/ IPA_PROOF_LENGTH +
47 /*translator*/ TranslatorFlavor::PROOF_LENGTH;
48
54
55 // Default constructor
56 ChonkProof_() = default;
57
58 // Copy constructor (needed for msgpack deserialization)
59 ChonkProof_(const HonkProof& mega, const GoblinProof& goblin)
60 : mega_proof(mega)
61 , goblin_proof(goblin)
62 {}
63
64 // Move constructor for both native and recursive modes
66 : mega_proof(std::move(mega))
67 , goblin_proof(std::move(goblin))
68 {}
69
70 // Constructs a stdlib Chonk proof from a native Chonk proof
71 template <typename B = Builder>
72 requires IsRecursive
77
78 // Serde methods
79
80 size_t size() const { return mega_proof.size() + goblin_proof.size(); }
81
85 std::vector<FF> to_field_elements() const;
86
91 static ChonkProof_ from_field_elements(const std::vector<FF>& fields);
92
93 public:
94 // MSGPACK methods (native mode only)
95 msgpack::sbuffer to_msgpack_buffer() const
96 requires(!IsRecursive)
97 {
98 msgpack::sbuffer buffer;
99 msgpack::pack(buffer, *this);
100 return buffer;
101 }
102
103 uint8_t* to_msgpack_heap_buffer() const
104 requires(!IsRecursive)
105 {
106 msgpack::sbuffer buffer = to_msgpack_buffer();
107 std::vector<uint8_t> buf(buffer.data(), buffer.data() + buffer.size());
108 return to_heap_buffer(buf);
109 }
110
111 static ChonkProof_ from_msgpack_buffer(uint8_t const*& buffer)
112 requires(!IsRecursive)
113 {
114 auto uint8_buffer = from_buffer<std::vector<uint8_t>>(buffer);
115 msgpack::sbuffer sbuf;
116 sbuf.write(reinterpret_cast<char*>(uint8_buffer.data()), uint8_buffer.size());
117 return from_msgpack_buffer(sbuf);
118 }
119
120 static ChonkProof_ from_msgpack_buffer(const msgpack::sbuffer& buffer)
121 requires(!IsRecursive)
122 {
123 msgpack::object_handle oh = msgpack::unpack(buffer.data(), buffer.size());
124 msgpack::object obj = oh.get();
125 ChonkProof_ proof;
126 obj.convert(proof);
127 return proof;
128 }
129
130 void to_file_msgpack(const std::string& filename) const
131 requires(!IsRecursive)
132 {
133 msgpack::sbuffer buffer = to_msgpack_buffer();
134 std::ofstream ofs(filename, std::ios::binary);
135 if (!ofs.is_open()) {
136 throw_or_abort("Failed to open file for writing.");
137 }
138 ofs.write(buffer.data(), static_cast<std::streamsize>(buffer.size()));
139 ofs.close();
140 }
141
142 static ChonkProof_ from_file_msgpack(const std::string& filename)
143 requires(!IsRecursive)
144 {
145 std::ifstream ifs(filename, std::ios::binary);
146 if (!ifs.is_open()) {
147 throw_or_abort("Failed to open file for reading.");
148 }
149 ifs.seekg(0, std::ios::end);
150 size_t file_size = static_cast<size_t>(ifs.tellg());
151 ifs.seekg(0, std::ios::beg);
152 std::vector<char> buffer(file_size);
153 ifs.read(buffer.data(), static_cast<std::streamsize>(file_size));
154 ifs.close();
155 msgpack::sbuffer msgpack_buffer;
156 msgpack_buffer.write(buffer.data(), file_size);
157 return ChonkProof_::from_msgpack_buffer(msgpack_buffer);
158 }
159
160 // MSGPACK support (native mode only)
161 static constexpr const char MSGPACK_SCHEMA_NAME[] = "ChonkProof";
162
163 class DeserializationError : public std::runtime_error {
164 public:
165 DeserializationError(const std::string& msg)
166 : std::runtime_error(std::string("Chonk Proof deserialization error: ") + msg)
167 {}
168 };
169
171 bool operator==(const ChonkProof_& other) const = default;
172};
173
174// Type aliases for convenience
175using ChonkProof = ChonkProof_<false>; // Native proof
176using ChonkStdlibProof = ChonkProof_<true>; // Recursive proof
177
178} // namespace bb
DeserializationError(const std::string &msg)
static constexpr size_t PROOF_LENGTH
static constexpr size_t PUBLIC_INPUTS_SIZE
static constexpr size_t VIRTUAL_LOG_N
static constexpr size_t PROOF_LENGTH
AluTraceBuilder builder
Definition alu.test.cpp:124
uint8_t const * buf
Definition data_store.hpp:9
std::unique_ptr< uint8_t[]> buffer
Definition engine.cpp:50
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
uint8_t * to_heap_buffer(T const &value)
Chonk proof type.
ChonkProof_()=default
std::conditional_t< IsRecursive, stdlib::field_t< Builder >, bb::fr > FF
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
The size of a Chonk proof without backend-added public inputs.
HonkProof mega_proof
GoblinProof goblin_proof
ChonkProof_(B &builder, const ChonkProof_< false > &proof)
std::conditional_t< IsRecursive, GoblinStdlibProof, ::bb::GoblinProof > GoblinProof
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)
Common logic to reconstruct proof from field elements.
static ChonkProof_ from_msgpack_buffer(uint8_t const *&buffer)
void to_file_msgpack(const std::string &filename) const
ChonkProof_(const HonkProof &mega, const GoblinProof &goblin)
MSGPACK_FIELDS(mega_proof, goblin_proof)
static ChonkProof_ from_msgpack_buffer(const msgpack::sbuffer &buffer)
size_t size() const
static constexpr size_t HIDING_KERNEL_PROOF_LENGTH_WITHOUT_PUBLIC_INPUTS
ChonkProof_(HonkProof &&mega, GoblinProof &&goblin)
std::conditional_t< IsRecursive, stdlib::Proof< Builder >, ::bb::HonkProof > HonkProof
static constexpr size_t PROOF_LENGTH
The size of a Chonk proof with backend-added public inputs: HidingKernelIO.
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 const char MSGPACK_SCHEMA_NAME[]
bool operator==(const ChonkProof_ &other) const =default
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
void throw_or_abort(std::string const &err)