Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
goblin.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#include "goblin.hpp"
8
16#include <utility>
17
18namespace bb {
19
20Goblin::Goblin(CommitmentKey<curve::BN254> bn254_commitment_key, const std::shared_ptr<Transcript>& transcript)
21 : commitment_key(std::move(bn254_commitment_key))
22 , transcript(transcript)
23{}
24
25void Goblin::prove_merge(const std::shared_ptr<Transcript>& transcript, const MergeSettings merge_settings)
26{
27 BB_BENCH_NAME("Goblin::prove_merge");
28 MergeProver merge_prover{ op_queue, merge_settings, commitment_key, transcript };
29 merge_verification_queue.push_back(merge_prover.construct_proof());
30}
31
33{
34 BB_BENCH_NAME("Goblin::prove_eccvm");
35 ECCVMBuilder eccvm_builder(op_queue);
36 ECCVMProver eccvm_prover(eccvm_builder, transcript);
38
41}
42
44{
45 BB_BENCH_NAME("Goblin::prove_translator");
47 auto translator_key = std::make_shared<TranslatorProvingKey>(translator_builder, commitment_key);
48 TranslatorProver translator_prover(translator_key, transcript);
49 goblin_proof.translator_proof = translator_prover.construct_proof();
50}
51
53{
54 BB_BENCH_NAME("Goblin::prove");
55
56 prove_merge(transcript, merge_settings); // Use shared transcript for merge proving
57 info("Constructing a Goblin proof with num ultra ops = ", op_queue->get_ultra_ops_table_num_rows());
58
60 1U,
61 "Goblin::prove: merge_verification_queue should contain only a single proof at this stage.");
63
64 vinfo("prove eccvm...");
66 vinfo("finished eccvm proving.");
67 vinfo("prove translator...");
69 vinfo("finished translator proving.");
70 return goblin_proof;
71}
72
75 const RecursiveMergeCommitments& merge_commitments,
77 const MergeSettings merge_settings)
78{
80 // Recursively verify the next merge proof in the verification queue in a FIFO manner
81 const MergeProof& merge_proof = merge_verification_queue.front();
82 const stdlib::Proof<MegaBuilder> stdlib_merge_proof(builder, merge_proof);
83
84 MergeRecursiveVerifier merge_verifier{ &builder, merge_settings, transcript };
85 auto [pairing_points, merged_table_commitments] =
86 merge_verifier.verify_proof(stdlib_merge_proof, merge_commitments);
87
88 merge_verification_queue.pop_front(); // remove the processed proof from the queue
89
90 return { pairing_points, merged_table_commitments };
91}
92
93bool Goblin::verify(const GoblinProof& proof,
94 const MergeCommitments& merge_commitments,
95 const std::shared_ptr<Transcript>& transcript,
96 const MergeSettings merge_settings)
97{
98 MergeVerifier merge_verifier(merge_settings, transcript);
99 auto [merge_verified, merged_table_commitments] = merge_verifier.verify_proof(proof.merge_proof, merge_commitments);
100
101 ECCVMVerifier eccvm_verifier(transcript);
102 bool eccvm_verified = eccvm_verifier.verify_proof(proof.eccvm_proof);
103
104 TranslatorVerifier translator_verifier(transcript);
105
106 bool accumulator_construction_verified = translator_verifier.verify_proof(
107 proof.translator_proof, eccvm_verifier.evaluation_challenge_x, eccvm_verifier.batching_challenge_v);
108
109 bool translation_verified = translator_verifier.verify_translation(eccvm_verifier.translation_evaluations,
110 eccvm_verifier.translation_masking_term_eval);
111
112 // Verify the consistency between the commitments to polynomials representing the op queue received by translator
113 // and final merge verifier
114 bool op_queue_consistency_verified =
115 translator_verifier.verify_consistency_with_final_merge(merged_table_commitments);
116
117 vinfo("merge verified?: ", merge_verified);
118 vinfo("eccvm verified?: ", eccvm_verified);
119 vinfo("accumulator construction_verified?: ", accumulator_construction_verified);
120 vinfo("translation verified?: ", translation_verified);
121 vinfo("consistency verified?: ", op_queue_consistency_verified);
122
123 return merge_verified && eccvm_verified && accumulator_construction_verified && translation_verified &&
124 op_queue_consistency_verified;
125}
126
128{
129 BB_ASSERT_EQ(avm_mode, true, "ensure_well_formed_op_queue should only be called for avm");
130 builder.queue_ecc_no_op();
131 builder.queue_ecc_random_op();
132 builder.queue_ecc_random_op();
133 builder.queue_ecc_random_op();
134}
135
136} // namespace bb
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:88
#define ASSERT(expression,...)
Definition assert.hpp:77
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:218
CommitmentKey object over a pairing group 𝔾₁.
ECCVMProof construct_proof()
bool verify_proof(const ECCVMProof &proof)
This function verifies an ECCVM Honk proof for given program settings.
TranslationEvaluations_< FF > translation_evaluations
fq evaluation_challenge_x
Definition goblin.hpp:54
void ensure_well_formed_op_queue_for_avm(MegaBuilder &builder) const
Translator requires the op queue to start with a no-op to ensure op queue polynomials are shiftable a...
Definition goblin.cpp:127
Goblin(CommitmentKey< curve::BN254 > bn254_commitment_key=CommitmentKey< curve::BN254 >(), const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
Definition goblin.cpp:20
GoblinProof goblin_proof
Definition goblin.hpp:51
static bool verify(const GoblinProof &proof, const MergeCommitments &merge_commitments, const std::shared_ptr< Transcript > &transcript, const MergeSettings merge_settings=MergeSettings::PREPEND)
Verify a full Goblin proof (ECCVM, Translator, merge)
Definition goblin.cpp:93
std::pair< PairingPoints, RecursiveTableCommitments > recursively_verify_merge(MegaBuilder &builder, const RecursiveMergeCommitments &merge_commitments, const std::shared_ptr< RecursiveTranscript > &transcript, const MergeSettings merge_settings=MergeSettings::PREPEND)
Recursively verify the next merge proof in the merge verification queue.
Definition goblin.cpp:73
void prove_eccvm()
Construct an ECCVM proof and the translation polynomial evaluations.
Definition goblin.cpp:32
fq translation_batching_challenge_v
Definition goblin.hpp:53
void prove_merge(const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >(), const MergeSettings merge_settings=MergeSettings::PREPEND)
Construct a merge proof for the goblin ECC ops in the provided circuit; append the proof to the merge...
Definition goblin.cpp:25
std::shared_ptr< OpQueue > op_queue
Definition goblin.hpp:48
void prove_translator()
Construct a translator proof.
Definition goblin.cpp:43
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
Definition goblin.cpp:52
MergeProver::MergeProof MergeProof
Definition goblin.hpp:36
CommitmentKey< curve::BN254 > commitment_key
Definition goblin.hpp:49
bool avm_mode
Definition goblin.hpp:62
std::deque< MergeProof > merge_verification_queue
Definition goblin.hpp:57
std::shared_ptr< Transcript > transcript
Definition goblin.hpp:55
Prover class for the Goblin ECC op queue transcript merge protocol.
Verifier class for the Goblin ECC op queue transcript merge protocol.
std::pair< bool, TableCommitments > verify_proof(const HonkProof &proof, const InputCommitments &input_commitments)
Verify proper construction of the aggregate Goblin ECC op queue polynomials T_j, j = 1,...
TranslatorCircuitBuilder creates a circuit that evaluates the correctness of the evaluation of EccOpQ...
bool verify_proof(const HonkProof &proof, const uint256_t &evaluation_input_x, const BF &batching_challenge_v)
This function verifies a TranslatorFlavor Honk proof for given program settings.
bool verify_translation(const TranslationEvaluations &translation_evaluations, const BF &translation_masking_term_eval)
bool verify_consistency_with_final_merge(const std::array< Commitment, TranslatorFlavor::NUM_OP_QUEUE_WIRES > &merge_commitments)
Checks that translator and merge protocol operate on the same EccOpQueue data.
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:19
std::pair< PairingPoints, TableCommitments > verify_proof(const stdlib::Proof< CircuitBuilder > &proof, const InputCommitments &input_commitments)
Computes inputs to a pairing check that, if verified, establishes proper construction of the aggregat...
#define vinfo(...)
Definition log.hpp:79
void info(Args... args)
Definition log.hpp:74
AluTraceBuilder builder
Definition alu.test.cpp:123
Entry point for Barretenberg command-line interface.
MergeSettings
The MergeSettings define whether an current subtable will be added at the beginning (PREPEND) or at t...
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
ECCVMProof eccvm_proof
Definition types.hpp:22
HonkProof merge_proof
Definition types.hpp:21
HonkProof translator_proof
Definition types.hpp:23