25 const auto EXPECT_PROVER_STATE = [](
const TestTranscript& transcript,
size_t start,
size_t written) {
29 const auto EXPECT_VERIFIER_STATE =
32 if (proof_size != 0) {
40 EXPECT_PROVER_STATE(prover_transcript, 0, 0);
43 EXPECT_PROVER_STATE(prover_transcript, 0, 1);
47 EXPECT_PROVER_STATE(prover_transcript, 1, 0);
49 EXPECT_VERIFIER_STATE(verifier_transcript, 0);
52 EXPECT_VERIFIER_STATE(verifier_transcript, 1, prover_transcript.
size_proof_data());
53 EXPECT_EQ(received_a, elt_a);
58 EXPECT_PROVER_STATE(prover_transcript, 1, 2);
60 EXPECT_PROVER_STATE(prover_transcript, 3, 0);
62 EXPECT_VERIFIER_STATE(verifier_transcript, 1);
64 EXPECT_VERIFIER_STATE(verifier_transcript, 3, prover_transcript.
size_proof_data());
65 EXPECT_EQ(received_b, elt_b);
70 EXPECT_PROVER_STATE(prover_transcript, 3, 1);
72 EXPECT_PROVER_STATE(prover_transcript, 4, 0);
73 EXPECT_VERIFIER_STATE(verifier_transcript, 3);
75 EXPECT_VERIFIER_STATE(verifier_transcript, 4, prover_transcript.
size_proof_data());
76 EXPECT_EQ(received_c, elt_c);
81 EXPECT_PROVER_STATE(prover_transcript, 4, 4);
83 EXPECT_PROVER_STATE(prover_transcript, 8, 0);
85 EXPECT_VERIFIER_STATE(verifier_transcript, 8, prover_transcript.
size_proof_data());
86 EXPECT_EQ(received_d, elt_d);
91 EXPECT_PROVER_STATE(prover_transcript, 8, 5);
93 EXPECT_PROVER_STATE(prover_transcript, 13, 0);
95 EXPECT_VERIFIER_STATE(verifier_transcript, 13);
96 EXPECT_EQ(received_e, elt_e);
101 EXPECT_PROVER_STATE(prover_transcript, 13, 14);
103 EXPECT_PROVER_STATE(prover_transcript, 27, 0);
105 EXPECT_VERIFIER_STATE(verifier_transcript, 27);
106 EXPECT_EQ(received_f, elt_f);
111 EXPECT_PROVER_STATE(prover_transcript, 27, 4);
113 EXPECT_PROVER_STATE(prover_transcript, 31, 0);
115 EXPECT_VERIFIER_STATE(verifier_transcript, 31);
116 EXPECT_EQ(received_g, elt_g);
121 EXPECT_PROVER_STATE(prover_transcript, 31, 6);
123 EXPECT_PROVER_STATE(prover_transcript, 37, 0);
125 EXPECT_VERIFIER_STATE(verifier_transcript, 37);
126 EXPECT_EQ(received_h, elt_h);
131 EXPECT_PROVER_STATE(prover_transcript, 37, 2);
133 EXPECT_PROVER_STATE(prover_transcript, 39, 0);
135 EXPECT_VERIFIER_STATE(verifier_transcript, 39);
136 EXPECT_EQ(received_i, elt_i);
142 EXPECT_PROVER_STATE(prover_transcript, 39, 2);
144 EXPECT_PROVER_STATE(prover_transcript, 41, 0);
146 EXPECT_VERIFIER_STATE(verifier_transcript, 41);
147 EXPECT_TRUE(received_j.is_point_at_infinity());
148 EXPECT_EQ(received_j, elt_j);
154 EXPECT_PROVER_STATE(prover_transcript, 41, 4);
156 EXPECT_PROVER_STATE(prover_transcript, 45, 0);
158 EXPECT_VERIFIER_STATE(verifier_transcript, 45);
159 EXPECT_TRUE(received_k.is_point_at_infinity());
160 EXPECT_EQ(received_k, elt_k);
187 auto simulate_transcript_interaction_with_multiple_provers = [](
const size_t num_proof_exports,
190 bool tampered_transcript =
false) {
191 for (
size_t idx = 0; idx < num_proof_exports; idx++) {
194 prover_transcript.add_to_hash_buffer(
"vk_field",
Fr(1));
195 prover_transcript.send_to_verifier<uint32_t>(
"integer", 5);
197 if (tampered_transcript) {
199 prover_transcript.tamper_proof_data();
203 prover_transcript.send_to_verifier(
"random_Grumpkin_point",
204 curve::Grumpkin::AffineElement::random_element());
205 prover_transcript.send_to_verifier(
"random_bn254_point", curve::BN254::AffineElement::random_element());
207 const Fr prover_challenge = prover_transcript.get_challenge<
Fr>(
"alpha");
210 verifier_transcript.load_proof(prover_transcript.export_proof());
211 verifier_transcript.add_to_hash_buffer(
"vk_field",
Fr(1));
212 verifier_transcript.receive_from_prover<
Fr>(
"random_field_element");
213 verifier_transcript.receive_from_prover<uint32_t>(
"integer");
214 const Fr verifier_challenge = verifier_transcript.get_challenge<
Fr>(
"alpha");
219 EXPECT_FALSE(prover_challenge == verifier_challenge);
224 for (
size_t num_proof_exports = 2; num_proof_exports < 5; num_proof_exports++) {
227 simulate_transcript_interaction_with_multiple_provers(
228 num_proof_exports, prover_transcript, verifier_transcript);
234 simulate_transcript_interaction_with_multiple_provers(
235 2, prover_transcript, verifier_transcript,
true);