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
19#include <utility>
20
21namespace bb {
22
23Goblin::Goblin(CommitmentKey<curve::BN254> bn254_commitment_key, const std::shared_ptr<Transcript>& transcript)
24 : commitment_key(std::move(bn254_commitment_key))
25 , transcript(transcript)
26{}
27
28void Goblin::prove_merge(const std::shared_ptr<Transcript>& transcript, const MergeSettings merge_settings)
29{
30 BB_BENCH_NAME("Goblin::prove_merge");
31 MergeProver merge_prover{ op_queue, merge_settings, commitment_key, transcript };
32 merge_verification_queue.push_back(merge_prover.construct_proof());
33}
34
36{
37 BB_BENCH_NAME("Goblin::prove_eccvm");
38 ECCVMBuilder eccvm_builder(op_queue);
39 ECCVMProver eccvm_prover(eccvm_builder, transcript);
40 auto [eccvm_proof, opening_claim] = eccvm_prover.construct_proof();
41 goblin_proof.eccvm_proof = std::move(eccvm_proof);
42
43 // Compute IPA proof for the opening claim
44 auto ipa_transcript = std::make_shared<NativeTranscript>();
45 ECCVMFlavor::PCS::compute_opening_proof(eccvm_prover.key->commitment_key, opening_claim, ipa_transcript);
46 goblin_proof.ipa_proof = ipa_transcript->export_proof();
47
50}
51
53{
54 BB_BENCH_NAME("Goblin::prove_translator");
56 auto translator_key = std::make_shared<TranslatorProvingKey>(translator_builder, commitment_key);
57 TranslatorProver translator_prover(translator_key, transcript);
58 goblin_proof.translator_proof = translator_prover.construct_proof();
59}
60
62{
63 BB_BENCH_NAME("Goblin::prove");
64
65 prove_merge(transcript, merge_settings); // Use shared transcript for merge proving
66 info("Goblin: num ultra ops = ", op_queue->get_ultra_ops_count());
67
69 1U,
70 "Goblin::prove: merge_verification_queue should contain only a single proof at this stage.");
72
73 vinfo("prove eccvm...");
75 vinfo("finished eccvm proving.");
76 vinfo("prove translator...");
78 vinfo("finished translator proving.");
79 return goblin_proof;
80}
81
84 const RecursiveMergeCommitments& merge_commitments,
86 const MergeSettings merge_settings)
87{
89 // Recursively verify the next merge proof in the verification queue in a FIFO manner
90 const MergeProof& merge_proof = merge_verification_queue.front();
91 const stdlib::Proof<MegaBuilder> stdlib_merge_proof(builder, merge_proof);
92
93 MergeRecursiveVerifier merge_verifier{ merge_settings, transcript };
94 auto [pairing_points, merged_table_commitments, degree_check_passed, concatenation_check_passed] =
95 merge_verifier.verify_proof(stdlib_merge_proof, merge_commitments);
96
97 merge_verification_queue.pop_front(); // remove the processed proof from the queue
98
99 return { pairing_points, merged_table_commitments };
100}
101
102bool Goblin::verify(const GoblinProof& proof,
103 const MergeCommitments& merge_commitments,
104 const std::shared_ptr<Transcript>& transcript,
105 const MergeSettings merge_settings)
106{
107 MergeVerifier merge_verifier(merge_settings, transcript);
108 auto [merge_pairing_points, merged_table_commitments, degree_check_passed, concatenation_check_passed] =
109 merge_verifier.verify_proof(proof.merge_proof, merge_commitments);
110 bool merge_verified = merge_pairing_points.check() && degree_check_passed && concatenation_check_passed;
111
113 auto opening_claim = eccvm_verifier.verify_proof();
114
115 // Verify IPA opening
116 auto ipa_transcript = std::make_shared<NativeTranscript>(proof.ipa_proof);
117 bool ipa_verified =
118 ECCVMFlavor::PCS::reduce_verify(eccvm_verifier.key->pcs_verification_key, opening_claim, ipa_transcript);
119
120 vinfo("eccvm ipa verified?: ", ipa_verified);
121 bool eccvm_verified = ipa_verified && eccvm_verifier.sumcheck_verified && eccvm_verifier.consistency_checked &&
123
124 TranslatorVerifier translator_verifier(transcript);
125
126 // Get translation data from ECCVM verifier to pass to Translator verifier
127 TranslatorInputData translator_input = eccvm_verifier.get_translator_input_data();
128 // Pass merge commitments as op queue wire commitments (they represent the same data)
129 bool translator_verified = translator_verifier.verify_proof(proof.translator_proof,
130 translator_input.evaluation_challenge_x,
131 translator_input.batching_challenge_v,
132 translator_input.accumulated_result,
133 merged_table_commitments);
134
135 vinfo("merge verified?: ", merge_verified);
136 vinfo("eccvm verified?: ", eccvm_verified);
137 vinfo("translator verified?: ", translator_verified);
138
139 return merge_verified && eccvm_verified && translator_verified;
140}
141
143{
144 BB_ASSERT_EQ(avm_mode, true, "ensure_well_formed_op_queue should only be called for avm");
145 // Add Ultra ops for the Translator (no-op + 3 random ops as prefix for translator accumulation)
146 builder.queue_ecc_no_op();
147 builder.queue_ecc_random_op();
148 builder.queue_ecc_random_op();
149 builder.queue_ecc_random_op();
150 // In the AVM Recursive Verifier case, we don't need ZK; so we place a deterministic non-op as a "hiding_op", it
151 // does not contribute to the actual MSM circuit.
153 builder.queue_ecc_hiding_op(Fq(0), Fq(0));
154}
155
156} // namespace bb
#define BB_ASSERT(expression,...)
Definition assert.hpp:67
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:77
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:219
CommitmentKey object over a pairing group 𝔾₁.
std::pair< Proof, OpeningClaim > construct_proof()
std::shared_ptr< ProvingKey > key
Unified ECCVM verifier class for both native and recursive verification.
bool translation_masking_consistency_checked
std::shared_ptr< VerificationKey > key
OpeningClaim< Curve > verify_proof()
Verifies an ECCVM Honk proof for given program settings.
TranslatorInputData get_translator_input_data() const
Get the data required by the TranslatorVerifier.
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:142
Goblin(CommitmentKey< curve::BN254 > bn254_commitment_key=CommitmentKey< curve::BN254 >(), const std::shared_ptr< Transcript > &transcript=std::make_shared< Transcript >())
Definition goblin.cpp:23
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:102
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:82
void prove_eccvm()
Construct an ECCVM proof and the translation polynomial evaluations.
Definition goblin.cpp:35
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:28
std::shared_ptr< OpQueue > op_queue
Definition goblin.hpp:48
void prove_translator()
Construct a translator proof.
Definition goblin.cpp:52
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
Definition goblin.cpp:61
MergeProver::MergeProof MergeProof
Definition goblin.hpp:35
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.
Unified verifier class for the Goblin ECC op queue transcript merge protocol.
VerificationResult verify_proof(const Proof &proof, const InputCommitments &input_commitments)
Verify the merge proof.
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, const uint256_t &accumulated_result, const std::array< Commitment, TranslatorFlavor::NUM_OP_QUEUE_WIRES > &op_queue_wire_commitments)
This function verifies a TranslatorFlavor Honk proof for given program settings.
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:19
#define vinfo(...)
Definition log.hpp:80
void info(Args... args)
Definition log.hpp:75
AluTraceBuilder builder
Definition alu.test.cpp:124
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
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
HonkProof eccvm_proof
Definition types.hpp:23
HonkProof ipa_proof
Definition types.hpp:24
HonkProof merge_proof
Definition types.hpp:22
HonkProof translator_proof
Definition types.hpp:25
Data passed from ECCVM Verifier to Translator Verifier for verification.
curve::BN254::BaseField Fq