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