34 const BF& batching_challenge_v,
35 const BF& accumulated_result)
38 const auto compute_four_limbs = [](
const BF& in) {
39 return std::array<FF, 4>{
FF(in.binary_basis_limbs[0].element),
40 FF(in.binary_basis_limbs[1].element),
41 FF(in.binary_basis_limbs[2].element),
42 FF(in.binary_basis_limbs[3].element) };
45 const auto compute_five_limbs = [](
const BF& in) {
47 FF(in.binary_basis_limbs[1].element),
48 FF(in.binary_basis_limbs[2].element),
49 FF(in.binary_basis_limbs[3].element),
50 FF(in.prime_basis_limb) };
55 BF batching_challenge_v_power = batching_challenge_v;
56 for (
size_t i = 0; i < 4; i++) {
58 batching_challenge_v_power = batching_challenge_v_power * batching_challenge_v;
91 const BF& evaluation_input_x,
92 const BF& batching_challenge_v)
101 using ClaimBatch = ClaimBatcher::Batch;
102 using InterleavedBatch = ClaimBatcher::InterleavedBatch;
109 vinfo(
"Translator vk hash in recursive verifier: ",
vk_hash);
111 VerifierCommitments commitments{
key };
112 CommitmentLabels commitment_labels;
114 const BF accumulated_result =
transcript->template receive_from_prover<BF>(
"accumulated_result");
117 accumulated_result.get_context()->update_used_witnesses(accumulated_result.prime_basis_limb.witness_index);
122 for (
auto [comm, label] :
zip_view(commitments.get_wires_and_ordered_range_constraints(),
123 commitment_labels.get_wires_and_ordered_range_constraints())) {
124 comm =
transcript->template receive_from_prover<Commitment>(label);
126 op_queue_commitments = { commitments.op, commitments.x_lo_y_hi, commitments.x_hi_z_1, commitments.y_lo_z_2 };
129 FF beta =
transcript->template get_challenge<FF>(
"beta");
130 FF gamma =
transcript->template get_challenge<FF>(
"gamma");
136 commitments.z_perm =
transcript->template receive_from_prover<Commitment>(commitment_labels.z_perm);
141 const FF alpha =
transcript->template get_challenge<FF>(
"Sumcheck:alpha");
146 for (
size_t idx = 0; idx < gate_challenges.size(); idx++) {
151 libra_commitments[0] =
transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
157 std::ranges::fill(padding_indicator_array, one);
159 auto sumcheck_output = sumcheck.verify(
relation_parameters, gate_challenges, padding_indicator_array);
161 libra_commitments[1] =
transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
162 libra_commitments[2] =
transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
165 bool consistency_checked =
true;
166 ClaimBatcher claim_batcher{
167 .unshifted = ClaimBatch{ commitments.get_unshifted_without_interleaved(),
168 sumcheck_output.claimed_evaluations.get_unshifted_without_interleaved() },
169 .shifted = ClaimBatch{ commitments.get_to_be_shifted(), sumcheck_output.claimed_evaluations.get_shifted() },
170 .interleaved = InterleavedBatch{ .commitments_groups = commitments.get_groups_to_be_interleaved(),
171 .evaluations = sumcheck_output.claimed_evaluations.get_interleaved() }
174 Shplemini::compute_batch_opening_claim(padding_indicator_array,
176 sumcheck_output.challenge,
181 &consistency_checked,
183 sumcheck_output.claimed_libra_evaluation);
185 auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim,
transcript);
187 return { pairing_points[0], pairing_points[1] };
191 const BF& translation_masking_term_eval)
193 const auto reconstruct_from_array = [&](
const auto& arr) {
194 return BF::construct_from_limbs(arr[0], arr[1], arr[2], arr[3]);
203 const BF& op = translation_evaluations.
op;
204 const BF& Px = translation_evaluations.
Px;
205 const BF& Py = translation_evaluations.
Py;
206 const BF& z1 = translation_evaluations.
z1;
207 const BF& z2 = translation_evaluations.
z2;
209 const BF eccvm_opening = (op + (v1 * Px) + (v2 * Py) + (v3 * z1) + (v4 * z2)) - translation_masking_term_eval;
211 eccvm_opening.assert_equal(x * accumulated_result);
215 const std::array<Commitment, TranslatorFlavor::NUM_OP_QUEUE_WIRES>& merge_commitments)
222 bool consistency_check_failed = (merge_commitment.y.get_value() != translator_commitment.y.get_value()) ||
223 (merge_commitment.y.get_value() != translator_commitment.y.get_value()) ||
224 (merge_commitment.is_point_at_infinity().get_value() !=
225 translator_commitment.is_point_at_infinity().get_value());
227 if (consistency_check_failed) {
228 vinfo(
"translator commitments are inconsistent with the final merge commitments");
231 merge_commitment.x.assert_equal(translator_commitment.x);
232 merge_commitment.y.assert_equal(translator_commitment.y);
233 merge_commitment.is_point_at_infinity().assert_equal(translator_commitment.is_point_at_infinity());