barretenberg
Loading...
Searching...
No Matches
serialize.hpp
1#pragma once
2#include "barretenberg/common/serialize.hpp"
3#include "barretenberg/common/throw_or_abort.hpp"
4#include "barretenberg/crypto/sha256/sha256.hpp"
5#include "barretenberg/polynomials/serialize.hpp"
6#include "proving_key.hpp"
7#include <fcntl.h>
8#include <ios>
9#include <sys/stat.h>
10
11namespace proof_system::plonk {
12
13// Read the pre-computed polynomials
14template <typename B> inline void read(B& any, proving_key_data& key)
15{
16 using serialize::read;
17 using std::read;
18
19 read(any, static_cast<uint32_t&>(key.circuit_type));
20 read(any, static_cast<uint32_t&>(key.circuit_size));
21 read(any, static_cast<uint32_t&>(key.num_public_inputs));
22
23 uint32_t amount = 0;
24 read(any, (uint32_t&)amount);
25
26 for (size_t next = 0; next < amount; ++next) {
27 std::string label;
29
30 read(any, label);
31 read(any, value);
32
33 key.polynomial_store.put(label, std::move(value));
34 }
35
36 read(any, key.contains_recursive_proof);
37 read(any, key.recursive_proof_public_input_indices);
38 read(any, key.memory_read_records);
39 read(any, key.memory_write_records);
40}
41
42// Write the pre-computed polynomials
43template <typename B> inline void write(B& buf, proving_key const& key)
44{
45 using serialize::write;
46 write(buf, static_cast<uint32_t>(key.circuit_type));
47 write(buf, static_cast<uint32_t>(key.circuit_size));
48 write(buf, static_cast<uint32_t>(key.num_public_inputs));
49
50 // Write only the pre-computed polys from the store
51 PrecomputedPolyList precomputed_poly_list(key.circuit_type);
52 size_t num_polys = precomputed_poly_list.size();
53 write(buf, static_cast<uint32_t>(num_polys));
54
55 for (size_t i = 0; i < num_polys; ++i) {
56 std::string poly_id = precomputed_poly_list[i];
57 const barretenberg::polynomial& value = ((proving_key&)key).polynomial_store.get(poly_id);
58 write(buf, poly_id);
59 write(buf, value);
60 }
61
62 write(buf, key.contains_recursive_proof);
63 write(buf, key.recursive_proof_public_input_indices);
64 write(buf, key.memory_read_records);
65 write(buf, key.memory_write_records);
66}
67
68template <typename B> inline void read_from_file(B& is, std::string const& path, proving_key_data& key)
69{
70 using serialize::read;
71
72 size_t file_num = 0;
73 read(is, key.circuit_type);
74 read(is, key.circuit_size);
75 read(is, key.num_public_inputs);
76
77 uint32_t size;
78 read(is, size);
79 for (size_t i = 0; i < size; ++i) {
80 std::string name;
81 read(is, name);
82 std::string filepath = format(path, "/", file_num++, "_", name);
83
84 struct stat st;
85 if (stat(filepath.c_str(), &st) != 0) {
86 throw_or_abort("Filename not found: " + filepath);
87 }
88 size_t file_size = (size_t)st.st_size;
89 size_t num_fields = file_size / 32;
90 barretenberg::polynomial value(num_fields);
91
92 // Open the file and read the data directly into the polynomial memory.
93 std::ifstream file(filepath, std::ios::binary);
94 if (file) {
95 file.read(reinterpret_cast<char*>(value.data().get()), (std::streamsize)file_size);
96 file.close();
97 } else {
98 throw_or_abort("Failed to open file: " + filepath);
99 }
100
101 key.polynomial_store.put(name, std::move(value));
102 }
103 read(is, key.contains_recursive_proof);
104 read(is, key.recursive_proof_public_input_indices);
105 read(is, key.memory_read_records);
106 read(is, key.memory_write_records);
107}
108
109template <typename B> inline void write_to_file(B& os, std::string const& path, proving_key& key)
110{
111 using serialize::write;
112
113 size_t file_num = 0;
114 write(os, static_cast<uint32_t>(key.circuit_type));
115 write(os, static_cast<uint32_t>(key.circuit_size));
116 write(os, static_cast<uint32_t>(key.num_public_inputs));
117
118 // Write only the pre-computed polys from the store
119 PrecomputedPolyList precomputed_poly_list(key.circuit_type);
120 size_t num_polys = precomputed_poly_list.size();
121 write(os, static_cast<uint32_t>(num_polys));
122
123 for (size_t i = 0; i < num_polys; ++i) {
124 std::string poly_id = precomputed_poly_list[i];
125 auto filename = format(path, "/", file_num++, "_", poly_id);
126 write(os, poly_id);
127 auto value = key.polynomial_store.get(poly_id);
128 auto size = value.size();
129 std::ofstream ofs(filename);
130 ofs.write((char*)value.data().get(), (std::streamsize)(size * sizeof(barretenberg::fr)));
131 if (!ofs.good()) {
132 throw_or_abort(format("Failed to write: ", filename));
133 }
134 }
135 write(os, key.contains_recursive_proof);
136 write(os, key.recursive_proof_public_input_indices);
137 write(os, key.memory_read_records);
138 write(os, key.memory_write_records);
139}
140
141} // namespace proof_system::plonk
Definition: widget.bench.cpp:13