33 using NativeCurve =
typename Curve::NativeCurve;
35 using NativeCurve =
typename Curve::NativeCurve;
44 using ClaimBatch = ClaimBatcher::Batch;
49 auto run_shplemini = [](
size_t log_circuit_size) {
50 size_t N = 1 << log_circuit_size;
51 const std::vector<Fr> padding_indicator_array(CONST_PROOF_SIZE_LOG_N, 1);
52 constexpr size_t NUM_POLYS = 5;
53 constexpr size_t NUM_SHIFTED = 2;
54 constexpr size_t NUM_RIGHT_SHIFTED_BY_K = 0;
59 u_challenge.reserve(CONST_PROOF_SIZE_LOG_N);
60 for (
size_t idx = 0; idx < CONST_PROOF_SIZE_LOG_N; idx++) {
65 MockClaimGen mock_claims(N, NUM_POLYS, NUM_SHIFTED, NUM_RIGHT_SHIFTED_BY_K, u_challenge, commitment_key);
69 auto prover_opening_claims =
70 ShpleminiProver::prove(N, mock_claims.polynomial_batcher, u_challenge, commitment_key, prover_transcript);
73 StdlibProof stdlib_proof(
builder, prover_transcript->export_proof());
75 stdlib_verifier_transcript->load_proof(stdlib_proof);
76 [[maybe_unused]]
auto _ = stdlib_verifier_transcript->template receive_from_prover<Fr>(
"Init");
79 const auto commitments_to_witnesses = [&
builder](
const auto& commitments) {
80 std::vector<Commitment> commitments_in_biggroup(commitments.size());
81 std::transform(commitments.begin(),
83 commitments_in_biggroup.begin(),
84 [&
builder](
const auto& native_commitment) {
85 auto comm = Commitment::from_witness(&builder, native_commitment);
88 comm.unset_free_witness_tag();
91 return commitments_in_biggroup;
93 const auto elements_to_witness = [&](
const auto& elements) {
94 std::vector<Fr> elements_in_circuit(elements.size());
96 elements.begin(), elements.end(), elements_in_circuit.begin(), [&
builder](
const auto& native_element) {
97 auto element = Fr::from_witness(&builder, native_element);
100 element.unset_free_witness_tag();
103 return elements_in_circuit;
105 auto stdlib_unshifted_commitments =
106 commitments_to_witnesses(mock_claims.claim_batcher.get_unshifted().commitments);
107 auto stdlib_to_be_shifted_commitments =
108 commitments_to_witnesses(mock_claims.claim_batcher.get_shifted().commitments);
109 auto stdlib_to_be_right_shifted_commitments =
110 commitments_to_witnesses(mock_claims.claim_batcher.get_right_shifted_by_k().commitments);
111 auto stdlib_unshifted_evaluations = elements_to_witness(mock_claims.claim_batcher.get_unshifted().evaluations);
112 auto stdlib_shifted_evaluations = elements_to_witness(mock_claims.claim_batcher.get_shifted().evaluations);
113 auto stdlib_right_shifted_evaluations =
114 elements_to_witness(mock_claims.claim_batcher.get_right_shifted_by_k().evaluations);
116 std::vector<Fr> u_challenge_in_circuit;
117 u_challenge_in_circuit.reserve(CONST_PROOF_SIZE_LOG_N);
119 for (
auto u : u_challenge) {
120 u_challenge_in_circuit.emplace_back(Fr::from_witness(&
builder, u));
123 u_challenge_in_circuit.back().unset_free_witness_tag();
126 ClaimBatcher claim_batcher{
127 .unshifted = ClaimBatch{
RefVector(stdlib_unshifted_commitments),
RefVector(stdlib_unshifted_evaluations) },
128 .shifted = ClaimBatch{
RefVector(stdlib_to_be_shifted_commitments),
RefVector(stdlib_shifted_evaluations) },
129 .right_shifted_by_k = ClaimBatch{
RefVector(stdlib_to_be_right_shifted_commitments),
130 RefVector(stdlib_right_shifted_evaluations) },
131 .k_shift_magnitude = MockClaimGen::k_magnitude
134 const auto opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
136 u_challenge_in_circuit,
138 stdlib_verifier_transcript);
143 EXPECT_EQ(
vk.pairing_check(pairing_points[0].get_value(), pairing_points[1].get_value()),
true);
149 size_t num_gates_6 = run_shplemini(6);
150 size_t num_gates_13 = run_shplemini(13);
151 EXPECT_EQ(num_gates_6, num_gates_13);