50 static constexpr size_t evals_after_op = 3;
51 const size_t op_eval_idx = eccvm_proof.size() - evals_after_op;
54 eccvm_proof[op_eval_idx] +=
FF(1);
67 goblin.
op_queue->construct_zk_columns();
70 auto goblin_proof = goblin.
prove();
73 auto t_current = goblin.
op_queue->construct_current_ultra_ops_subtable_columns();
74 auto T_prev = goblin.
op_queue->construct_table_columns_up_to_tail();
83 if (outer_builder !=
nullptr) {
85 recursive_merge_commitments.t_commitments[idx] =
86 RecursiveCommitment::from_witness(outer_builder, merge_commitments.
t_commitments[idx]);
87 recursive_merge_commitments.T_prev_commitments[idx] =
88 RecursiveCommitment::from_witness(outer_builder, merge_commitments.
T_prev_commitments[idx]);
91 recursive_merge_commitments.t_commitments[idx].unset_free_witness_tag();
92 recursive_merge_commitments.T_prev_commitments[idx].unset_free_witness_tag();
97 return { goblin_proof, merge_commitments, recursive_merge_commitments };
107 auto [proof, merge_commitments, _] = create_goblin_prover_output();
115 auto accumulator =
result.triple_ipa_opening.reduce_to_accumulator();
118 EXPECT_TRUE(
result.all_checks_passed);
119 EXPECT_TRUE(
result.translator_pairing_points.check());
120 EXPECT_TRUE(ipa_verified);
125 auto [proof, merge_commitments, _] = create_goblin_prover_output();
126 ASSERT_FALSE(proof.ipa_proof.empty());
127 proof.ipa_proof[0] +=
bb::fr(1);
135 auto accumulator =
result.triple_ipa_opening.reduce_to_accumulator();
138 EXPECT_TRUE(
result.all_checks_passed);
139 EXPECT_TRUE(
result.translator_pairing_points.check());
140 EXPECT_FALSE(ipa_verified);
151 auto [proof, merge_commitments, recursive_merge_commitments] = create_goblin_prover_output(&
builder);
156 auto output = verifier.reduce_to_pairing_check_and_triple_ipa_opening();
159 output.translator_pairing_points.aggregate(output.merge_pairing_points);
163 auto [ipa_claim, ipa_proof] =
167 inputs.pairing_inputs = output.translator_pairing_points;
168 inputs.ipa_claim = ipa_claim;
173 info(
"Recursive Verifier: num gates = ",
builder.num_gates());
182 auto verification_key =
185 OuterProver prover(prover_instance, verification_key);
186 OuterVerifier verifier(vk_and_hash);
187 auto proof = prover.construct_proof();
188 bool verified = verifier.verify_proof(proof).result;
190 ASSERT_TRUE(verified);
198 auto get_blocks = [](
size_t inner_size)
202 auto [proof, merge_commitments, recursive_merge_commitments] =
203 create_goblin_prover_output(&
builder, inner_size);
208 auto output = verifier.reduce_to_pairing_check_and_triple_ipa_opening();
211 output.translator_pairing_points.aggregate(output.merge_pairing_points);
215 auto [ipa_claim, ipa_proof] =
219 inputs.pairing_inputs = output.translator_pairing_points;
220 inputs.ipa_claim = ipa_claim;
225 info(
"Recursive Verifier: num gates = ",
builder.num_gates());
229 auto outer_verification_key =
232 OuterProver prover(prover_instance, outer_verification_key);
233 OuterVerifier outer_verifier(vk_and_hash);
234 return {
builder.blocks, outer_verification_key };
237 auto [blocks_5, verification_key_5] = get_blocks(5);
238 auto [blocks_6, verification_key_6] = get_blocks(6);
240 compare_ultra_blocks_and_verification_keys<OuterFlavor>({ blocks_5, blocks_6 },
241 { verification_key_5, verification_key_6 });
251 auto [proof, merge_commitments, _] = create_goblin_prover_output();
254 MergeCommitments tampered_merge_commitments = merge_commitments;
255 tamper_with_op_commitment(tampered_merge_commitments);
258 RecursiveMergeCommitments recursive_merge_commitments;
260 recursive_merge_commitments.t_commitments[idx] =
261 RecursiveCommitment::from_witness(&
builder, tampered_merge_commitments.t_commitments[idx]);
262 recursive_merge_commitments.T_prev_commitments[idx] =
263 RecursiveCommitment::from_witness(&
builder, tampered_merge_commitments.T_prev_commitments[idx]);
264 recursive_merge_commitments.t_commitments[idx].fix_witness();
265 recursive_merge_commitments.T_prev_commitments[idx].fix_witness();
271 auto goblin_rec_verifier_output = verifier.reduce_to_pairing_check_and_triple_ipa_opening();
274 goblin_rec_verifier_output.translator_pairing_points.aggregate(goblin_rec_verifier_output.merge_pairing_points);
281 goblin_rec_verifier_output.translator_pairing_points.P0().get_value(),
282 goblin_rec_verifier_output.translator_pairing_points.P1().get_value());
283 bool pairing_result = native_pairing_points.
check();
284 EXPECT_FALSE(pairing_result);
297 auto [proof, merge_commitments, recursive_merge_commitments] = create_goblin_prover_output(&
builder);
300 tamper_with_eccvm_op_eval(proof.eccvm_proof);
305 [[maybe_unused]]
auto goblin_rec_verifier_output = verifier.reduce_to_pairing_check_and_triple_ipa_opening();
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
CommitmentKey object over a pairing group ๐พโ.
Commitment commit(PolynomialSpan< const Fr > polynomial, bool has_duplicates_hint=false) const
Uses the ProverSRS to create a commitment to p(X)
static constexpr size_t ECCVM_FIXED_SIZE
static bool verify_accumulator(const TripleIpaAccumulator &accumulator)
Simple verification key class for fixed-size circuits (ECCVM, Translator, AVM).
TranslatorFlavor::VerificationKey TranslatorVerificationKey
GoblinProof prove()
Constuct a full Goblin proof (ECCVM, Translator, merge)
std::shared_ptr< OpQueue > op_queue
ECCVMFlavor::VerificationKey ECCVMVerificationKey
static void construct_and_merge_mock_circuits(Goblin &goblin, const size_t num_circuits=3)
Unified Goblin verifier for both native and recursive verification.
ReductionResult reduce_to_pairing_check_and_triple_ipa_opening()
Reduce Goblin proof to pairing checks and a TripleIPA claim.
IPA (inner product argument) commitment scheme class.
static constexpr size_t NUM_WIRES
typename Curve::AffineElement Commitment
An object storing two EC points that represent the inputs to a pairing check.
bool check() const
Verify the pairing equation e(P0, [1]โ) ยท e(P1, [x]โ) = 1.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
static constexpr size_t ZK_ULTRA_OPS
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
static ProverOutput create_goblin_prover_output(Builder *outer_builder=nullptr, const size_t num_circuits=5)
Create a goblin proof and the VM verification keys needed by the goblin recursive verifier.
bb::GoblinRecursiveVerifier::MergeVerifier::InputCommitments RecursiveMergeCommitments
MergeVerifier::Commitment Commitment
bb::GoblinRecursiveVerifier::MergeVerifier::Commitment RecursiveCommitment
static void SetUpTestSuite()
static void tamper_with_op_commitment(MergeCommitments &merge_commitments)
static void tamper_with_eccvm_op_eval(HonkProof &eccvm_proof)
The data that is propagated on the public inputs of a rollup circuit.
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
Construct and check a goblin recursive verification circuit.
std::vector< fr > HonkProof
UltraVerifier_< UltraFlavor, RollupIO > UltraRollupVerifier
field< Bn254FrParams > fr
BaseTranscript< stdlib::StdlibCodec< stdlib::field_t< UltraCircuitBuilder > >, stdlib::poseidon2< UltraCircuitBuilder > > UltraStdlibTranscript
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
PairingPoints translator_pairing_points
MergeCommitments merge_commitments
RecursiveMergeCommitments recursive_merge_commitments