13#include <gtest/gtest.h>
21template <
typename Codec,
typename HashFunction>
class TranscriptTest :
public ::testing::Test {
24 using FF =
typename Codec::fr;
25 using BF =
typename Codec::fq;
32 template <
typename C,
typename =
void>
struct GetBuilder {
35 template <
typename C>
struct GetBuilder<
C,
std::void_t<typename C::Builder>> {
36 using type =
typename C::Builder;
56 GTEST_SKIP() << reason;
63 GTEST_SKIP() << reason;
84 template <
typename T>
auto to_native(
const T& val)
const
87 return val.get_value();
101 auto received = verifier.template receive_from_prover<FF>(
"scalar");
115 auto received = verifier.template receive_from_prover<BF>(
"basefield");
124 auto commitment = curve::BN254::AffineElement::random_element();
129 auto received = verifier.template receive_from_prover<bn254_commitment>(
"commitment");
138 auto commitment = curve::Grumpkin::AffineElement::random_element();
143 auto received = verifier.template receive_from_prover<grumpkin_commitment>(
"commitment");
153 for (
auto& val : array_value) {
160 auto received = verifier.template receive_from_prover<std::array<FF, SIZE>>(
"array");
162 for (
size_t i = 0; i < SIZE; ++i) {
172 for (
auto& val : array_value) {
181 auto received = verifier.template receive_from_prover<std::array<BF, SIZE>>(
"grumpkin_array");
182 for (
size_t i = 0; i < SIZE; ++i) {
194 for (
auto& eval : evals) {
202 auto received = verifier.template receive_from_prover<bb::Univariate<FF, LENGTH>>(
"univariate");
204 for (
size_t i = 0; i < LENGTH; ++i) {
214 for (
auto& eval : evals) {
224 auto received = verifier.template receive_from_prover<bb::Univariate<BF, LENGTH>>(
"grumpkin_univariate");
225 for (
size_t i = 0; i < LENGTH; ++i) {
226 grumpkin::fr received_value(received.evaluations[i].get_value());
231 verifier.template receive_from_prover<bb::Univariate<grumpkin::fr, LENGTH>>(
"grumpkin_univariate");
232 for (
size_t i = 0; i < LENGTH; ++i) {
242 auto infinity = curve::BN254::AffineElement::infinity();
247 auto received = verifier.template receive_from_prover<bn254_commitment>(
"infinity");
250 EXPECT_TRUE(received.is_point_at_infinity().get_value());
252 EXPECT_TRUE(received.is_point_at_infinity());
261 auto infinity = curve::Grumpkin::AffineElement::infinity();
266 auto received = verifier.template receive_from_prover<grumpkin_commitment>(
"infinity");
269 EXPECT_TRUE(received.is_point_at_infinity().get_value());
271 EXPECT_TRUE(received.is_point_at_infinity());
284 auto prover_alpha = prover.template get_challenge<bb::fr>(
"alpha");
288 auto commitment = curve::BN254::AffineElement::random_element();
292 auto [prover_beta, prover_gamma] = prover.template get_challenges<bb::fr>(challenge_labels);
299 [[maybe_unused]]
auto data_recv = verifier.template receive_from_prover<FF>(
"data");
300 auto verifier_alpha = verifier.template get_challenge<FF>(
"alpha");
303 auto recv_scalar = verifier.template receive_from_prover<FF>(
"scalar");
304 auto recv_commitment = verifier.template receive_from_prover<bn254_commitment>(
"commitment");
305 auto [verifier_beta, verifier_gamma] = verifier.template get_challenges<FF>(challenge_labels);
323 prover.template get_challenge<bb::fr>(
"alpha");
324 prover.
send_to_verifier(
"commitment", curve::BN254::AffineElement::random_element());
326 prover.template get_challenges<bb::fr>(challenge_labels);
330 verifier.template receive_from_prover<FF>(
"scalar");
331 verifier.template get_challenge<FF>(
"alpha");
332 verifier.template receive_from_prover<bn254_commitment>(
"commitment");
333 verifier.template get_challenges<FF>(challenge_labels);
345 auto challenge1 = prover.template get_challenge<bb::fr>(
"alpha");
346 auto challenge2 = prover.template get_challenge<bb::fr>(
"beta");
347 auto challenge3 = prover.template get_challenge<bb::fr>(
"gamma");
362 one.convert_constant_to_fixed_witness(&
builder);
365 auto prover_chal = prover.template get_challenge<bb::fr>(
"alpha");
366 auto verifier_chal = verifier.template get_challenge<FF>(
"alpha");
377 prover_transcript->send_to_verifier(
"a", elt_a);
378 [[maybe_unused]]
auto proof1 = prover_transcript->export_proof();
381 prover_transcript->send_to_verifier(
"b", elt_b);
382 [[maybe_unused]]
auto proof2 = prover_transcript->export_proof();
384 auto verifier_transcript =
387 BB_ASSERT_EQ(verifier_transcript->test_get_proof_start(), 0);
388 BB_ASSERT_EQ(prover_transcript->template get_challenge<bb::fr>(
"test_challenge"),
389 verifier_transcript->template get_challenge<bb::fr>(
"test_challenge"));
396 void tamper_proof_data() { proof_data[0] += 1; }
399 TamperableTranscript prover;
402 prover.enable_manifest();
405 prover.add_to_hash_buffer(
"vk_field",
bb::fr(1));
408 prover.send_to_verifier(
"random_grumpkin", curve::Grumpkin::AffineElement::random_element());
409 prover.send_to_verifier(
"random_bn254", curve::BN254::AffineElement::random_element());
411 auto prover_challenge = prover.template get_challenge<bb::fr>(
"alpha");
413 prover.tamper_proof_data();
417 one.convert_constant_to_fixed_witness(&
builder);
421 verifier.template receive_from_prover<FF>(
"random_field");
422 verifier.template receive_from_prover<grumpkin_commitment>(
"random_grumpkin");
423 verifier.template receive_from_prover<bn254_commitment>(
"random_bn254");
424 auto verifier_challenge = verifier.template get_challenge<FF>(
"alpha");
426 EXPECT_EQ(prover.get_manifest(), verifier.
get_manifest());
#define BB_ASSERT_NEQ(actual, expected,...)
#define BB_ASSERT_EQ(actual, expected,...)
static constexpr bool in_circuit
std::vector< DataType > export_proof()
Return the proof data starting at proof_start.
void add_to_hash_buffer(const std::string &label, const T &element)
Adds an element to the transcript.
void send_to_verifier(const std::string &label, const T &element)
Adds a prover message to the transcript, only intended to be used by the prover.
void load_proof(const std::vector< DataType > &proof)
Verifier-specific method. The verifier needs to load a proof or its segment before the verification.
TranscriptManifest get_manifest() const
static std::shared_ptr< BaseTranscript > convert_prover_transcript_to_verifier_transcript(const std::shared_ptr< BaseTranscript > &prover_transcript)
Convert a prover transcript to a verifier transcript.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
A univariate polynomial represented by its values on {0, 1,..., domain_end - 1}.
A simple wrapper around a vector of stdlib field elements representing a proof.
stdlib class that evaluates in-circuit poseidon2 hashes, consistent with behavior in crypto::poseidon...
void test_hash_buffer_consistency()
auto export_proof(NativeTranscript &prover)
void test_manifest_consistency()
void skip_if_stdlib(const char *reason)
void test_basefield_send_receive()
void test_grumpkin_univariate_send_receive()
static constexpr bool IsStdlib
void test_prover_to_verifier_conversion()
void test_array_send_receive()
void test_bn254_infinity_handling()
void test_scalar_send_receive()
typename GetBuilder< Codec >::type BuilderType
void test_grumpkin_field_array_send_receive()
auto to_native(const T &val) const
typename Codec::grumpkin_commitment grumpkin_commitment
void test_grumpkin_infinity_handling()
typename Codec::bn254_commitment bn254_commitment
void test_bn254_commitment_send_receive()
void test_multi_round_protocol()
void skip_if_native(const char *reason)
void test_tampering_detection()
void test_univariate_send_receive()
void test_challenges_are_nonzero()
void test_grumpkin_commitment_send_receive()
const std::vector< MemoryValue > data
::testing::Types< std::pair< NativeCodec, NativeHash >, std::pair< UltraCodec, UltraHash >, std::pair< MegaCodec, MegaHash > > TranscriptTypes
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()