48 const size_t shift_idx = 0;
49 const size_t m_commitment_idx = 1;
50 const size_t l_eval_idx = 34;
52 switch (tampering_mode) {
55 merge_proof[shift_idx] += 1;
59 Commitment m_commitment = FrCodec::deserialize_from_fields<Commitment>(
60 std::span{ merge_proof }.subspan(m_commitment_idx, FrCodec::calc_num_fields<Commitment>()));
61 m_commitment = m_commitment + Commitment::one();
62 auto m_commitment_frs = FrCodec::serialize_to_fields<Commitment>(m_commitment);
63 for (
size_t idx = 0; idx < 4; ++idx) {
64 merge_proof[m_commitment_idx + idx] = m_commitment_frs[idx];
70 merge_proof[l_eval_idx] -=
FF(1);
81 const bool expected =
true)
83 RecursiveBuilder outer_circuit;
92 auto t_current = op_queue->construct_current_ultra_ops_subtable_columns();
93 auto T_prev = op_queue->construct_previous_ultra_ops_table_columns();
95 merge_commitments.
t_commitments[idx] = merge_prover.pcs_commitment_key.commit(t_current[idx]);
96 merge_commitments.
T_prev_commitments[idx] = merge_prover.pcs_commitment_key.commit(T_prev[idx]);
98 RecursiveMergeVerifier::Commitment::from_witness(&outer_circuit, merge_commitments.
t_commitments[idx]);
99 recursive_merge_commitments.
T_prev_commitments[idx] = RecursiveMergeVerifier::Commitment::from_witness(
103 recursive_merge_commitments.
t_commitments[idx].unset_free_witness_tag();
111 auto [pairing_points, recursive_merged_table_commitments] =
112 verifier.verify_proof(stdlib_merge_proof, recursive_merge_commitments);
115 EXPECT_EQ(outer_circuit.failed(), !expected) << outer_circuit.err();
120 native_verifier.
transcript->enable_manifest();
121 auto [verified_native, merged_table_commitments] = native_verifier.verify_proof(merge_proof, merge_commitments);
123 bool verified_recursive =
124 pcs_verification_key.
pairing_check(pairing_points.P0.get_value(), pairing_points.P1.get_value());
125 EXPECT_EQ(verified_native, verified_recursive);
126 EXPECT_EQ(verified_recursive, expected);
130 auto recursive_manifest = verifier.transcript->get_manifest();
131 auto native_manifest = native_verifier.transcript->get_manifest();
132 for (
size_t i = 0; i < recursive_manifest.size(); ++i) {
133 EXPECT_EQ(recursive_manifest[i], native_manifest[i]);