barretenberg
Loading...
Searching...
No Matches
standard_composer.hpp
1#pragma once
2
3#include "barretenberg/flavor/plonk_flavors.hpp"
4#include "barretenberg/plonk/composer/composer_lib.hpp"
5#include "barretenberg/plonk/proof_system/prover/prover.hpp"
6#include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp"
7#include "barretenberg/plonk/proof_system/verification_key/verification_key.hpp"
8#include "barretenberg/plonk/proof_system/verifier/verifier.hpp"
9#include "barretenberg/proof_system/circuit_builder/standard_circuit_builder.hpp"
10#include "barretenberg/srs/factories/file_crs_factory.hpp"
11#include <utility>
12
13namespace proof_system::plonk {
15 public:
17
19
20 static constexpr std::string_view NAME_STRING = "StandardPlonk";
21 static constexpr size_t NUM_RESERVED_GATES = 4; // equal to the number of evaluations leaked
22 static constexpr size_t program_width = CircuitBuilder::program_width;
23 std::shared_ptr<plonk::proving_key> circuit_proving_key;
24 std::shared_ptr<plonk::verification_key> circuit_verification_key;
25
26 // The crs_factory holds the path to the srs and exposes methods to extract the srs elements
27 std::shared_ptr<barretenberg::srs::factories::CrsFactory<curve::BN254>> crs_factory_;
28
29 bool computed_witness = false;
30
31 StandardComposer() { crs_factory_ = barretenberg::srs::get_crs_factory(); }
33 : crs_factory_(std::move(crs_factory))
34 {}
35
37 : crs_factory_(std::move(crs_factory))
38 {}
39 StandardComposer(std::shared_ptr<plonk::proving_key> p_key, std::shared_ptr<plonk::verification_key> v_key)
40 : circuit_proving_key(std::move(p_key))
41 , circuit_verification_key(std::move(v_key))
42 {}
43
44 StandardComposer(StandardComposer&& other) noexcept = default;
45 StandardComposer(const StandardComposer& other) = delete;
46 StandardComposer& operator=(StandardComposer&& other) noexcept = default;
47 StandardComposer& operator=(const StandardComposer& other) = delete;
48 ~StandardComposer() = default;
49
50 inline std::vector<SelectorProperties> standard_selector_properties()
51 {
52 std::vector<SelectorProperties> result{
53 { "q_m", false }, { "q_c", false }, { "q_1", false }, { "q_2", false }, { "q_3", false },
54 };
55 return result;
56 }
57 std::shared_ptr<plonk::proving_key> compute_proving_key(const CircuitBuilder& circuit_constructor);
58 std::shared_ptr<plonk::verification_key> compute_verification_key(const CircuitBuilder& circuit_constructor);
59
60 plonk::Verifier create_verifier(const CircuitBuilder& circuit_constructor);
61 plonk::Prover create_prover(const CircuitBuilder& circuit_constructor);
62
63 void compute_witness(const CircuitBuilder& circuit_constructor, const size_t minimum_circuit_size = 0);
71 static transcript::Manifest create_manifest(const size_t num_public_inputs)
72 {
73 constexpr size_t g1_size = 64;
74 constexpr size_t fr_size = 32;
75 const size_t public_input_size = fr_size * num_public_inputs;
76 /* A RoundManifest describes data that will be put in or extracted from a transcript.
77 Here we have 7 RoundManifests. */
79 { // clang-format off
80
81 // Round 0
83 {
84 { .name = "circuit_size", .num_bytes = 4, .derived_by_verifier = true },
85 { .name = "public_input_size", .num_bytes = 4, .derived_by_verifier = true }
86 },
87 /* challenge_name = */ "init",
88 /* num_challenges_in = */ 1),
89
90 // Round 1
92 {},
93 /* challenge_name = */ "eta",
94 /* num_challenges_in = */ 0),
95
96 // Round 2
98 {
99 { .name = "public_inputs", .num_bytes = public_input_size, .derived_by_verifier = false },
100 { .name = "W_1", .num_bytes = g1_size, .derived_by_verifier = false },
101 { .name = "W_2", .num_bytes = g1_size, .derived_by_verifier = false },
102 { .name = "W_3", .num_bytes = g1_size, .derived_by_verifier = false },
103 },
104 /* challenge_name = */ "beta",
105 /* num_challenges_in = */ 2),
106
107 // Round 3
109 { { .name = "Z_PERM", .num_bytes = g1_size, .derived_by_verifier = false } },
110 /* challenge_name = */ "alpha",
111 /* num_challenges_in = */ 1),
112
113 // Round 4
115 { { .name = "T_1", .num_bytes = g1_size, .derived_by_verifier = false },
116 { .name = "T_2", .num_bytes = g1_size, .derived_by_verifier = false },
117 { .name = "T_3", .num_bytes = g1_size, .derived_by_verifier = false } },
118 /* challenge_name = */ "z",
119 /* num_challenges_in = */ 1),
120
121 // Round 5
123 {
124 { .name = "t", .num_bytes = fr_size, .derived_by_verifier = true, .challenge_map_index = -1 },
125 { .name = "w_1", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 0 },
126 { .name = "w_2", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 1 },
127 { .name = "w_3", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 2 },
128 { .name = "sigma_1", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 3 },
129 { .name = "sigma_2", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 4 },
130 { .name = "sigma_3", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 5 },
131 { .name = "q_1", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 6 },
132 { .name = "q_2", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 7 },
133 { .name = "q_3", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 8 },
134 { .name = "q_m", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 9 },
135 { .name = "q_c", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 10 },
136 { .name = "z_perm", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = 11 },
137 { .name = "z_perm_omega", .num_bytes = fr_size, .derived_by_verifier = false, .challenge_map_index = -1 },
138 },
139 /* challenge_name = */ "nu",
140 /* num_challenges_in = */ STANDARD_MANIFEST_SIZE,
141 /* map_challenges_in = */ true),
142
143 // Round 6
145 { { .name = "PI_Z", .num_bytes = g1_size, .derived_by_verifier = false },
146 { .name = "PI_Z_OMEGA", .num_bytes = g1_size, .derived_by_verifier = false } },
147 /* challenge_name = */ "separator",
148 /* num_challenges_in = */ 1) }
149
150 // clang-format off
151 );
152 return output;
153 }
154};
155
156} // namespace proof_system::plonk
Definition: crs_factory.hpp:72
Definition: standard_circuit_builder.hpp:12
Definition: prover.hpp:12
Definition: standard_composer.hpp:14
plonk::Prover create_prover(const CircuitBuilder &circuit_constructor)
Definition: standard_composer.cpp:145
plonk::Verifier create_verifier(const CircuitBuilder &circuit_constructor)
Definition: standard_composer.cpp:122
std::shared_ptr< plonk::proving_key > compute_proving_key(const CircuitBuilder &circuit_constructor)
Definition: standard_composer.cpp:61
std::shared_ptr< plonk::verification_key > compute_verification_key(const CircuitBuilder &circuit_constructor)
Definition: standard_composer.cpp:95
void compute_witness(const CircuitBuilder &circuit_constructor, const size_t minimum_circuit_size=0)
Definition: standard_composer.cpp:26
static transcript::Manifest create_manifest(const size_t num_public_inputs)
Definition: standard_composer.hpp:71
Definition: verifier.hpp:9
Definition: plonk_flavors.hpp:9
Definition: manifest.hpp:11
Definition: widget.bench.cpp:13
Definition: manifest.hpp:28