43 static constexpr size_t BATCHED_EXTENDED_LENGTH = DeciderVerificationKeys::BATCHED_EXTENDED_LENGTH;
44 static constexpr size_t NUM_KEYS = DeciderVerificationKeys::NUM;
47 static constexpr size_t COMBINER_LENGTH = BATCHED_EXTENDED_LENGTH -
NUM_KEYS;
49 run_oink_verifier_on_each_incomplete_key(proof);
51 const std::shared_ptr<DeciderVK>& accumulator = keys_to_fold[0];
54 const std::vector<FF> deltas = transcript->template get_powers_of_challenge<FF>(
"delta", CONST_PG_LOG_N);
55 std::vector<FF> perturbator_coeffs(CONST_PG_LOG_N + 1, 0);
56 for (
size_t idx = 1; idx <= CONST_PG_LOG_N; idx++) {
57 perturbator_coeffs[idx] = transcript->template receive_from_prover<FF>(
"perturbator_" +
std::to_string(idx));
59 const FF perturbator_challenge = transcript->template get_challenge<FF>(
"perturbator_challenge");
62 perturbator_coeffs[0] = accumulator->target_sum;
63 const FF perturbator_evaluation = evaluate_perturbator(perturbator_coeffs, perturbator_challenge);
66 for (
size_t idx = 0; idx < COMBINER_LENGTH; idx++) {
67 combiner_quotient_evals[idx] =
72 const FF combiner_challenge = transcript->template get_challenge<FF>(
"combiner_quotient_challenge");
74 const FF combiner_quotient_at_challenge = combiner_quotient.
evaluate(combiner_challenge);
76 const FF vanishing_polynomial_at_challenge = combiner_challenge * (combiner_challenge -
FF(1));
77 const std::vector<FF> lagranges = {
FF(1) - combiner_challenge, combiner_challenge };
113 std::vector<Commitment> accumulator_commitments;
114 std::vector<Commitment> instance_commitments;
115 for (
const auto& precomputed : keys_to_fold.get_precomputed_commitments()) {
117 accumulator_commitments.emplace_back(precomputed[0]);
118 instance_commitments.emplace_back(precomputed[1]);
120 for (
const auto& witness : keys_to_fold.get_witness_commitments()) {
122 accumulator_commitments.emplace_back(witness[0]);
123 instance_commitments.emplace_back(witness[1]);
127 std::vector<Commitment> output_commitments;
128 for (
size_t i = 0; i < accumulator_commitments.size(); ++i) {
129 const auto lhs_scalar = (
FF(1) - combiner_challenge).get_value();
130 const auto rhs_scalar = combiner_challenge.get_value();
132 const auto lhs = accumulator_commitments[i].get_value();
134 const auto rhs = instance_commitments[i].get_value();
135 const auto output = lhs * lhs_scalar + rhs * rhs_scalar;
136 output_commitments.emplace_back(Commitment::from_witness(
builder, output));
139 output_commitments[i]);
144 args[idx] =
"accumulator_combination_challenges" +
std::to_string(idx);
147 batch_mul_transcript.template get_challenges<FF>(args);
148 std::vector<FF> scalars(folding_challenges.begin(), folding_challenges.end());
150 Commitment accumulator_sum = Commitment::batch_mul(accumulator_commitments,
155 Commitment instance_sum = Commitment::batch_mul(instance_commitments,
160 Commitment output_sum = Commitment::batch_mul(output_commitments,
165 Commitment folded_sum = Commitment::batch_mul({ accumulator_sum, instance_sum },
170 output_sum.x.assert_equal(folded_sum.x);
171 output_sum.y.assert_equal(folded_sum.y);
174 accumulator->target_sum =
175 perturbator_evaluation * lagranges[0] + vanishing_polynomial_at_challenge * combiner_quotient_at_challenge;
177 accumulator->gate_challenges =
update_gate_challenges(perturbator_challenge, accumulator->gate_challenges, deltas);
180 FF virtual_log_n = FF::from_witness(
builder, CONST_PG_LOG_N);
181 virtual_log_n.fix_witness();
182 accumulator->vk_and_hash->vk->log_circuit_size = virtual_log_n;
185 for (
auto [combination, to_combine] :
zip_view(accumulator->alphas, keys_to_fold.get_alphas())) {
186 combination = linear_combination(to_combine, lagranges);
189 for (
auto [combination, to_combine] :
190 zip_view(accumulator->relation_parameters.get_to_fold(), keys_to_fold.get_relation_parameters())) {
191 combination = linear_combination(to_combine, lagranges);
194 auto accumulator_vkey = accumulator->vk_and_hash->vk->get_all();
196 accumulator_vkey[i] = output_commitments[i];
199 auto accumulator_witnesses = accumulator->witness_commitments.get_all();
201 accumulator_witnesses[i] = output_commitments[i + accumulator_vkey.size()];