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
19
20namespace bb::avm2 {
21
22// Create AvmVerifier::VerificationKey based on VkData and returns shared pointer.
24{
26 std::vector<fr> vk_as_fields = many_from_buffer<AvmFlavorSettings::FF>(vk_data);
27
28 std::span vk_span(vk_as_fields);
29
30 vinfo("vk fields size: ", vk_as_fields.size());
31
33 for (size_t i = 0; i < VerificationKey::NUM_PRECOMPUTED_COMMITMENTS; i++) {
34 // Adds 4 (NUM_FRS_COM) fr elements per commitment. Therefore, index = 4 * i.
35 precomputed_cmts[i] = FrCodec::deserialize_from_fields<VerificationKey::Commitment>(
37 }
38
39 return std::make_shared<VerificationKey>(precomputed_cmts);
40}
41
43{
44 auto verification_key =
46
47 vinfo("AVM vk hash: ", verification_key->hash());
48
49 auto serialized_vk = to_buffer(verification_key->to_field_elements());
50
51 return serialized_vk;
52}
53
55{
56 auto polynomials = AVM_TRACK_TIME_V("proving/prove:compute_polynomials", constraining::compute_polynomials(trace));
57 auto proving_key =
58 AVM_TRACK_TIME_V("proving/prove:proving_key", constraining::proving_key_from_polynomials(polynomials));
59
60 auto verification_key =
62
63 auto prover = AVM_TRACK_TIME_V("proving/prove:construct_prover",
64 AvmProver(proving_key, verification_key, proving_key->commitment_key));
65
66 auto proof = AVM_TRACK_TIME_V("proving/construct_proof", prover.construct_proof());
67 auto serialized_vk = to_buffer(verification_key->to_field_elements());
68
69 return proof;
70}
71
73{
74 // The proof is done over the whole circuit (2^21 rows).
75 // However, for check-circuit purposes we run only over the trace rows
76 // PLUS one extra row to catch any possible errors in the empty remainder
77 // of the circuit.
78 const size_t num_rows = trace.get_num_rows_without_clk() + 1;
79 const bool skippable_enabled = (getenv("AVM_DISABLE_SKIPPABLE") == nullptr);
80 vinfo("Running check ",
81 skippable_enabled ? "(with skippable)" : "(without skippable)",
82 " circuit over ",
83 num_rows,
84 " rows.");
85
86 // Warning: this destroys the trace.
87 auto polynomials = AVM_TRACK_TIME_V("proving/prove:compute_polynomials", constraining::compute_polynomials(trace));
88 try {
89 AVM_TRACK_TIME("proving/check_circuit",
90 constraining::run_check_circuit(polynomials, num_rows, skippable_enabled));
91 } catch (std::runtime_error& e) {
92 // FIXME: This exception is never caught because it's thrown in a different thread.
93 // Execution never gets here!
94 vinfo("Circuit check failed: ", e.what());
95 }
96
97 return true;
98}
99
101{
102 auto vk_data = AVM_TRACK_TIME_V("proving/verify:get_verification_key", get_verification_key());
103 auto vk = AVM_TRACK_TIME_V("proving/verify:create_verification_key", create_verification_key(vk_data));
104 auto verifier = AVM_TRACK_TIME_V("proving/verify:construct_verifier", AvmVerifier(std::move(vk)));
105 return AVM_TRACK_TIME_V("proving/verify_proof", verifier.verify_proof(proof, pi.to_columns()));
106}
107
108} // namespace bb::avm2
Base Native verification key class.
Definition flavor.hpp:141
static constexpr size_t NUM_FRS_COM
Definition flavor.hpp:98
std::vector< uint8_t > VkData
bool verify(const Proof &proof, const PublicInputs &pi)
Proof 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
static constexpr std::array< Commitment, VerificationKey::NUM_PRECOMPUTED_COMMITMENTS > get_all()
#define vinfo(...)
Definition log.hpp:94
TestTraceContainer trace
AvmProver::ProverPolynomials compute_polynomials(tracegen::TraceContainer &trace)
std::shared_ptr< AvmProver::ProvingKey > proving_key_from_polynomials(AvmProver::ProverPolynomials &polynomials)
void run_check_circuit(AvmFlavor::ProverPolynomials &polys, size_t num_rows, bool skippable_enabled)
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:18
#define AVM_TRACK_TIME(key, body)
Definition stats.hpp:16
std::vector< std::vector< FF > > to_columns() const
Serialization to columns.
Definition avm_io.cpp:142