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
15#include <utility>
16
17namespace bb {
18
19Goblin::Goblin(CommitmentKey<curve::BN254> bn254_commitment_key, const std::shared_ptr<Transcript>& transcript)
20 : commitment_key(std::move(bn254_commitment_key))
21 , transcript(transcript)
22{}
23
24void Goblin::prove_merge(const std::shared_ptr<Transcript>& transcript, const MergeSettings merge_settings)
25{
26 PROFILE_THIS_NAME("Goblin::merge");
27 MergeProver merge_prover{ op_queue, merge_settings, commitment_key, transcript };
28 merge_verification_queue.push_back(merge_prover.construct_proof());
29}
30
32{
33 ECCVMBuilder eccvm_builder(op_queue);
34 ECCVMProver eccvm_prover(eccvm_builder, transcript);
36
39}
40
42{
43 PROFILE_THIS_NAME("Create TranslatorBuilder and TranslatorProver");
45 auto translator_key = std::make_shared<TranslatorProvingKey>(translator_builder, commitment_key);
46 TranslatorProver translator_prover(translator_key, transcript);
47 goblin_proof.translator_proof = translator_prover.construct_proof();
48}
49
51{
52 PROFILE_THIS_NAME("Goblin::prove");
53
54 prove_merge(transcript, merge_settings); // Use shared transcript for merge proving
55 info("Constructing a Goblin proof with num ultra ops = ", op_queue->get_ultra_ops_table_num_rows());
56
58 1U,
59 "Goblin::prove: merge_verification_queue should contain only a single proof at this stage.");
61
62 {
63 PROFILE_THIS_NAME("prove_eccvm");
64 vinfo("prove eccvm...");
66 vinfo("finished eccvm proving.");
67 }
68 {
69 PROFILE_THIS_NAME("prove_translator");
70 vinfo("prove translator...");
72 vinfo("finished translator proving.");
73 }
74 return goblin_proof;
75}
76
79 const RecursiveMergeCommitments& merge_commitments,
81 const MergeSettings merge_settings)
82{
84 // Recursively verify the next merge proof in the verification queue in a FIFO manner
85 const MergeProof& merge_proof = merge_verification_queue.front();
86 const stdlib::Proof<MegaBuilder> stdlib_merge_proof(builder, merge_proof);
87
88 MergeRecursiveVerifier merge_verifier{ &builder, merge_settings, transcript };
89 auto [pairing_points, merged_table_commitments] =
90 merge_verifier.verify_proof(stdlib_merge_proof, merge_commitments);
91
92 merge_verification_queue.pop_front(); // remove the processed proof from the queue
93
94 return { pairing_points, merged_table_commitments };
95}
96
97bool Goblin::verify(const GoblinProof& proof,
98 const MergeCommitments& merge_commitments,
99 const std::shared_ptr<Transcript>& transcript,
100 const MergeSettings merge_settings)
101{
102 MergeVerifier merge_verifier(merge_settings, transcript);
103 auto [merge_verified, merged_table_commitments] = merge_verifier.verify_proof(proof.merge_proof, merge_commitments);
104
105 ECCVMVerifier eccvm_verifier(transcript);
106 bool eccvm_verified = eccvm_verifier.verify_proof(proof.eccvm_proof);
107
108 TranslatorVerifier translator_verifier(transcript);
109
110 bool accumulator_construction_verified = translator_verifier.verify_proof(
111 proof.translator_proof, eccvm_verifier.evaluation_challenge_x, eccvm_verifier.batching_challenge_v);
112
113 bool translation_verified = translator_verifier.verify_translation(eccvm_verifier.translation_evaluations,
114 eccvm_verifier.translation_masking_term_eval);
115
116 // Verify the consistency between the commitments to polynomials representing the op queue received by translator
117 // and final merge verifier
118 bool op_queue_consistency_verified =
119 translator_verifier.verify_consistency_with_final_merge(merged_table_commitments);
120
121 vinfo("merge verified?: ", merge_verified);
122 vinfo("eccvm verified?: ", eccvm_verified);
123 vinfo("accumulator construction_verified?: ", accumulator_construction_verified);
124 vinfo("translation verified?: ", translation_verified);
125 vinfo("consistency verified?: ", op_queue_consistency_verified);
126
127 return merge_verified && eccvm_verified && accumulator_construction_verified && translation_verified &&
128 op_queue_consistency_verified;
129}
130
131} // namespace bb
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
#define ASSERT(expression,...)
Definition assert.hpp:49
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
Goblin(CommitmentKey< curve::BN254 > bn254_commitment_key=CommitmentKey< curve::BN254 >(), const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
Definition goblin.cpp:19
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:97
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:77
void prove_eccvm()
Construct an ECCVM proof and the translation polynomial evaluations.
Definition goblin.cpp:31
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:24
std::shared_ptr< OpQueue > op_queue
Definition goblin.hpp:48
void prove_translator()
Construct a translator proof.
Definition goblin.cpp:41
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
Definition goblin.cpp:50
MergeProver::MergeProof MergeProof
Definition goblin.hpp:36
CommitmentKey< curve::BN254 > commitment_key
Definition goblin.hpp:49
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...
void vinfo(Args... args)
Definition log.hpp:76
void info(Args... args)
Definition log.hpp:70
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
#define PROFILE_THIS_NAME(name)
Definition op_count.hpp:16
ECCVMProof eccvm_proof
Definition types.hpp:22
HonkProof merge_proof
Definition types.hpp:21
HonkProof translator_proof
Definition types.hpp:23