48 for (
size_t idx = 0; idx < NUM_CIRCUITS - 1; ++idx) {
64 auto t_current = goblin_final.
op_queue->construct_current_ultra_ops_subtable_columns();
65 auto T_prev = goblin_final.
op_queue->construct_previous_ultra_ops_table_columns();
73 if (outer_builder !=
nullptr) {
76 RecursiveCommitment::from_witness(outer_builder, merge_commitments.
t_commitments[idx]);
78 RecursiveCommitment::from_witness(outer_builder, merge_commitments.
T_prev_commitments[idx]);
83 return { goblin_final.
prove(),
86 recursive_merge_commitments };
96 auto [proof, verifier_input, merge_commitments, _] = create_goblin_prover_output();
100 EXPECT_TRUE(
Goblin::verify(proof, merge_commitments, verifier_transcript));
111 auto [proof, verifier_input, merge_commitments, recursive_merge_commitments] =
112 create_goblin_prover_output(&
builder);
118 info(
"Recursive Verifier: num gates = ",
builder.num_gates);
128 OuterProver prover(proving_key, verification_key);
129 OuterVerifier verifier(verification_key);
130 auto proof = prover.construct_proof();
131 bool verified = verifier.template verify_proof<bb::DefaultIO>(proof).result;
133 ASSERT_TRUE(verified);
141 auto get_blocks = [](
size_t inner_size)
145 auto [proof, verifier_input, merge_commitments, recursive_merge_commitments] =
146 create_goblin_prover_output(&
builder, inner_size);
152 info(
"Recursive Verifier: num gates = ",
builder.num_gates);
156 auto outer_verification_key =
158 OuterProver prover(proving_key, outer_verification_key);
159 OuterVerifier outer_verifier(outer_verification_key);
160 return {
builder.blocks, outer_verification_key };
163 auto [blocks_2, verification_key_2] = get_blocks(2);
164 auto [blocks_4, verification_key_4] = get_blocks(4);
166 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_2, blocks_4 },
167 { verification_key_2, verification_key_4 });
178 auto [proof, verifier_input, merge_commitments, recursive_merge_commitments] =
179 create_goblin_prover_output(&
builder);
182 for (
auto& val : proof.eccvm_proof.pre_ipa_proof) {
197 auto native_ipa_proof = goblin_rec_verifier_output.
ipa_proof.get_value();
198 native_ipa_transcript->load_proof(native_ipa_proof);
202 ".*IPA verification fails.*");
211 auto [proof, verifier_input, merge_commitments, _] = create_goblin_prover_output();
225 RecursiveMergeCommitments recursive_merge_commitments;
227 recursive_merge_commitments.t_commitments[idx] =
228 RecursiveCommitment::from_witness(&
builder, merge_commitments.t_commitments[idx]);
229 recursive_merge_commitments.T_prev_commitments[idx] =
230 RecursiveCommitment::from_witness(&
builder, merge_commitments.T_prev_commitments[idx]);
234 [[maybe_unused]]
auto goblin_rec_verifier_output = verifier.
verify(tampered_proof, recursive_merge_commitments);
239 auto tampered_proof = proof;
241 for (
auto& val : tampered_proof.translator_proof) {
252 RecursiveMergeCommitments recursive_merge_commitments;
254 recursive_merge_commitments.t_commitments[idx] =
255 RecursiveCommitment::from_witness(&
builder, merge_commitments.t_commitments[idx]);
256 recursive_merge_commitments.T_prev_commitments[idx] =
257 RecursiveCommitment::from_witness(&
builder, merge_commitments.T_prev_commitments[idx]);
261 [[maybe_unused]]
auto goblin_rec_verifier_output = verifier.
verify(tampered_proof, recursive_merge_commitments);
274 auto [proof, verifier_input, merge_commitments, recursive_merge_commitments] =
275 create_goblin_prover_output(&
builder);
280 const size_t op_limb_index = 593;
281 proof.eccvm_proof.pre_ipa_proof[op_limb_index] += 1;
284 [[maybe_unused]]
auto goblin_rec_verifier_output = verifier.
verify(proof, recursive_merge_commitments);
303 auto [proof, verifier_input, merge_commitments, recursive_merge_commitments] =
304 create_goblin_prover_output(&
builder);
309 EXPECT_TRUE(
Goblin::verify(proof, merge_commitments, verifier_transcript));
314 auto tamper_with_op_commitment = [](
HonkProof& translator_proof) {
316 static constexpr size_t num_frs_comm = bb::field_conversion::calc_num_bn254_frs<Commitment>();
319 static constexpr size_t offset = bb::field_conversion::calc_num_bn254_frs<BF>();
321 auto element_frs = std::span{ translator_proof }.subspan(
offset, num_frs_comm);
322 auto op_commitment = NativeTranscriptParams::template deserialize<Commitment>(element_frs);
324 op_commitment = op_commitment *
FF(2);
327 std::copy(op_commitment_reserialized.begin(),
328 op_commitment_reserialized.end(),
332 tamper_with_op_commitment(proof.translator_proof);
336 [[maybe_unused]]
auto goblin_rec_verifier_output = verifier.
verify(proof, recursive_merge_commitments);
#define EXPECT_THROW_OR_ABORT(statement, matcher)
CommitmentKey object over a pairing group 𝔾₁.
Commitment commit(PolynomialSpan< const Fr > polynomial) const
Uses the ProverSRS to create a commitment to p(X)
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
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)
TranslatorFlavor::VerificationKey TranslatorVerificationKey
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...
std::shared_ptr< OpQueue > op_queue
GoblinProof prove(const MergeSettings merge_settings=MergeSettings::PREPEND)
Constuct a full Goblin proof (ECCVM, Translator, merge)
ECCVMFlavor::VerificationKey ECCVMVerificationKey
static void construct_simple_circuit(MegaBuilder &builder, bool last_circuit=false)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
IPA (inner product argument) commitment scheme class.
static constexpr size_t NUM_WIRES
typename Curve::AffineElement Commitment
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
Curve::AffineElement Commitment
ExecutionTrace_ ExecutionTrace
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Curve::Element Commitment
UltraCircuitBuilder Builder
GoblinRecursiveVerifierOutput verify(const GoblinProof &, const MergeCommitments &merge_commitments, const MergeSettings merge_settings=MergeSettings::PREPEND)
Creates a circuit that executes the ECCVM, Translator and Merge verifiers.
GoblinRecursiveVerifier::MergeVerifier::Commitment RecursiveCommitment
MergeVerifier::Commitment Commitment
static void SetUpTestSuite()
static ProverOutput create_goblin_prover_output(Builder *outer_builder=nullptr, const size_t NUM_CIRCUITS=3)
Create a goblin proof and the VM verification keys needed by the goblin recursive verifier.
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
std::shared_ptr< factories::CrsFactory< curve::Grumpkin > > get_grumpkin_crs_factory()
TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
Construct and check a goblin recursive verification circuit.
std::vector< fr > HonkProof
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
HonkProof translator_proof
static std::vector< DataType > serialize(const T &element)
uint32_t set_public()
Set the witness indices for the limbs of the pairing points to public.
OpeningClaim< Curve > opening_claim
stdlib::Proof< Builder > ipa_proof
PairingAccumulator points_accumulator
Goblin::VerificationKey verifier_input
MergeCommitments merge_commitments
RecursiveMergeCommitments recursive_merge_commitments