47 static constexpr size_t COMBINER_QUOTIENT_LENGTH = BATCHED_EXTENDED_LENGTH - NUM_INSTANCES;
50 run_oink_verifier_on_each_incomplete_instance(proof);
52 const std::shared_ptr<VerifierInstance>& accumulator = insts_to_fold[0];
55 const std::vector<FF> deltas = transcript->template get_powers_of_challenge<FF>(
"delta", CONST_PG_LOG_N);
59 std::vector<FF> perturbator_coeffs(CONST_PG_LOG_N + 1, 0);
60 perturbator_coeffs[0] = accumulator->target_sum;
61 for (
size_t idx = 1; idx <= CONST_PG_LOG_N; idx++) {
62 perturbator_coeffs[idx] = transcript->template receive_from_prover<FF>(
"perturbator_" +
std::to_string(idx));
66 const FF perturbator_challenge = transcript->template get_challenge<FF>(
"perturbator_challenge");
69 const FF perturbator_evaluation = evaluate_perturbator(perturbator_coeffs, perturbator_challenge);
73 for (
size_t idx = 0; idx < COMBINER_QUOTIENT_LENGTH; idx++) {
74 combiner_quotient_evals[idx] =
75 transcript->template receive_from_prover<FF>(
"combiner_quotient_" +
std::to_string(idx + NUM_INSTANCES));
79 const FF combiner_challenge = transcript->template get_challenge<FF>(
"combiner_quotient_challenge");
88 const FF combiner_quotient_at_challenge = combiner_quotient.
evaluate(combiner_challenge);
91 const FF vanishing_polynomial_at_challenge = combiner_challenge * (combiner_challenge -
FF(1));
94 const std::vector<FF> lagranges = {
FF(1) - combiner_challenge, combiner_challenge };
128 std::vector<Commitment> accumulator_commitments;
129 std::vector<Commitment> instance_commitments;
130 for (
const auto& precomputed : get_data_to_fold<FOLDING_DATA::PRECOMPUTED_COMMITMENTS>()) {
131 accumulator_commitments.emplace_back(precomputed[0]);
132 instance_commitments.emplace_back(precomputed[1]);
134 for (
const auto& witness : get_data_to_fold<FOLDING_DATA::WITNESS_COMMITMENTS>()) {
135 accumulator_commitments.emplace_back(witness[0]);
136 instance_commitments.emplace_back(witness[1]);
140 std::vector<Commitment> output_commitments;
141 for (
size_t i = 0; i < accumulator_commitments.size(); ++i) {
143 const auto lhs_scalar = lagranges[0].get_value();
144 const auto rhs_scalar = lagranges[1].get_value();
145 const auto lhs = accumulator_commitments[i].get_value();
146 const auto rhs = instance_commitments[i].get_value();
148 lhs * lhs_scalar + rhs * rhs_scalar;
150 output_commitments.emplace_back(Commitment::from_witness(
builder, output));
153 output_commitments[i]);
159 args[idx] =
"accumulator_combination_challenges_" +
std::to_string(idx);
162 batch_mul_transcript.template get_challenges<FF>(args);
163 std::vector<FF> scalars(folding_challenges.begin(), folding_challenges.end());
169 Commitment accumulator_sum = Commitment::batch_mul(accumulator_commitments,
175 Commitment instance_sum = Commitment::batch_mul(instance_commitments,
181 Commitment output_sum = Commitment::batch_mul(output_commitments,
186 Commitment folded_sum = Commitment::batch_mul({ accumulator_sum, instance_sum },
192 output_sum.incomplete_assert_equal(folded_sum);
195 accumulator->target_sum =
196 perturbator_evaluation * lagranges[0] + vanishing_polynomial_at_challenge * combiner_quotient_at_challenge;
199 accumulator->gate_challenges =
update_gate_challenges(perturbator_challenge, accumulator->gate_challenges, deltas);
205 FF virtual_log_n = FF::from_witness(
builder, CONST_PG_LOG_N);
206 virtual_log_n.fix_witness();
207 accumulator->vk_and_hash->vk->log_circuit_size = virtual_log_n;
210 for (
auto [combination, to_combine] :
zip_view(accumulator->alphas, get_data_to_fold<FOLDING_DATA::ALPHAS>())) {
211 combination = to_combine[0] + combiner_challenge * (to_combine[1] - to_combine[0]);
215 for (
auto [combination, to_combine] :
zip_view(accumulator->relation_parameters.get_to_fold(),
216 get_data_to_fold<FOLDING_DATA::RELATION_PARAMETERS>())) {
217 combination = to_combine[0] + combiner_challenge * (to_combine[1] - to_combine[0]);
221 auto accumulator_vkey = accumulator->vk_and_hash->vk->get_all();
223 accumulator_vkey[i] = output_commitments[i];
227 auto accumulator_witnesses = accumulator->witness_commitments.get_all();
229 accumulator_witnesses[i] = output_commitments[i + accumulator_vkey.size()];