Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
proving_helper.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <cstdlib>
5#include <memory>
6#include <stdexcept>
7
18
19namespace bb::avm2 {
20
21namespace {
22
23// TODO: This doesn't need to be a shared_ptr, but BB requires it.
25{
26 auto proving_key = std::make_shared<AvmProver::ProvingKey>();
27
28 for (auto [key_poly, prover_poly] : zip_view(proving_key->get_all(), polynomials.get_unshifted())) {
29 BB_ASSERT_EQ(flavor_get_label(*proving_key, key_poly), flavor_get_label(polynomials, prover_poly));
30 key_poly = std::move(prover_poly);
31 }
32
33 return proving_key;
34}
35
36} // namespace
37
38// Create AvmVerifier::VerificationKey based on VkData and returns shared pointer.
40{
42 std::vector<fr> vk_as_fields = many_from_buffer<AvmFlavorSettings::FF>(vk_data);
43
44 std::span vk_span(vk_as_fields);
45
46 vinfo("vk fields size: ", vk_as_fields.size());
47
49 for (size_t i = 0; i < VerificationKey::NUM_PRECOMPUTED_COMMITMENTS; i++) {
50 // Adds 4 (NUM_FRS_COM) fr elements per commitment. Therefore, index = 4 * i.
51 precomputed_cmts[i] = field_conversion::convert_from_bn254_frs<VerificationKey::Commitment>(
53 }
54
55 return std::make_shared<VerificationKey>(precomputed_cmts);
56}
57
59{
60 auto polynomials = AVM_TRACK_TIME_V("proving/prove:compute_polynomials", constraining::compute_polynomials(trace));
61 auto proving_key = AVM_TRACK_TIME_V("proving/prove:proving_key", create_proving_key(polynomials));
62 // TODO(#15892): VK needs to be hardcoded. Computing it here is not efficient.
63 auto verification_key =
64 AVM_TRACK_TIME_V("proving/prove:verification_key", std::make_shared<AvmVerifier::VerificationKey>(proving_key));
65 auto prover = AVM_TRACK_TIME_V("proving/prove:construct_prover",
66 AvmProver(proving_key, verification_key, proving_key->commitment_key));
67
68 auto proof = AVM_TRACK_TIME_V("proving/construct_proof", prover.construct_proof());
69 auto serialized_vk = to_buffer(verification_key->to_field_elements());
70
71 return { std::move(proof), std::move(serialized_vk) };
72}
73
75{
76 // The proof is done over the whole circuit (2^21 rows).
77 // However, for check-circuit purposes we run only over the trace rows
78 // PLUS one extra row to catch any possible errors in the empty remainder
79 // of the circuit.
80 const size_t num_rows = trace.get_num_rows_without_clk() + 1;
81 const bool skippable_enabled = true;
82 info("Running check ",
83 skippable_enabled ? "(with skippable)" : "(without skippable)",
84 " circuit over ",
85 num_rows,
86 " rows.");
87
88 // Warning: this destroys the trace.
89 auto polynomials = AVM_TRACK_TIME_V("proving/prove:compute_polynomials", constraining::compute_polynomials(trace));
90 try {
91 AVM_TRACK_TIME("proving/check_circuit",
92 constraining::run_check_circuit(polynomials, num_rows, skippable_enabled));
93 } catch (std::runtime_error& e) {
94 // FIXME: This exception is never caught because it's thrown in a different thread.
95 // Execution never gets here!
96 info("Circuit check failed: ", e.what());
97 }
98
99 return true;
100}
101
102bool AvmProvingHelper::verify(const AvmProvingHelper::Proof& proof, const PublicInputs& pi, const VkData& vk_data)
103{
104 auto vk = AVM_TRACK_TIME_V("proving/verify:create_verification_key", create_verification_key(vk_data));
105 auto verifier = AVM_TRACK_TIME_V("proving/verify:construct_verifier", AvmVerifier(std::move(vk)));
106 return AVM_TRACK_TIME_V("proving/verify_proof", verifier.verify_proof(proof, pi.to_columns()));
107}
108
109} // namespace bb::avm2
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
static constexpr size_t NUM_FRS_COM
Definition flavor.hpp:99
Flavor::ProverPolynomials ProverPolynomials
Definition prover.hpp:21
std::vector< uint8_t > VkData
bool verify(const Proof &proof, const PublicInputs &pi, const VkData &vk_data)
std::pair< Proof, VkData > prove(tracegen::TraceContainer &&trace)
bool check_circuit(tracegen::TraceContainer &&trace)
static std::shared_ptr< AvmVerifier::VerificationKey > create_verification_key(const VkData &vk_data)
Flavor::VerificationKey VerificationKey
Definition verifier.hpp:13
void vinfo(Args... args)
Definition log.hpp:76
void info(Args... args)
Definition log.hpp:70
TestTraceContainer trace
UltraKeccakFlavor::VerificationKey VerificationKey
AvmProver::ProverPolynomials compute_polynomials(tracegen::TraceContainer &trace)
void run_check_circuit(AvmFlavor::ProverPolynomials &polys, size_t num_rows, bool skippable_enabled)
std::string flavor_get_label(Container &&container, const Element &element)
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< uint8_t > to_buffer(T const &value)
#define AVM_TRACK_TIME_V(key, body)
Definition stats.hpp:19
#define AVM_TRACK_TIME(key, body)
Definition stats.hpp:17
std::vector< std::vector< FF > > to_columns() const
Serialization to columns.