Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
crs_factory.test.cpp
Go to the documentation of this file.
13#include <fstream>
14#include <gtest/gtest.h>
15#include <span>
16#include <utility>
17
18using namespace bb;
19using namespace bb::srs::factories;
20using namespace bb::curve;
21namespace fs = std::filesystem;
22
23namespace {
24// BN254 consistency checker
25void check_bn254_consistency(const fs::path& crs_download_path, size_t num_points, bool allow_download)
26{
27 NativeBn254CrsFactory file_crs(crs_download_path, allow_download);
28
29 // read G1
30 std::vector<g1::affine_element> g1_points(num_points);
31 auto g1_buf = read_file(bb::srs::bb_crs_path() / "bn254_g1.dat", num_points * sizeof(g1::affine_element));
32 for (size_t i = 0; i < num_points; ++i) {
33 g1_points[i] = from_buffer<g1::affine_element>(g1_buf, i * sizeof(g1::affine_element));
34 }
35
36 // read G2
37 auto g2_buf = read_file(bb::srs::bb_crs_path() / "bn254_g2.dat", sizeof(g2::affine_element));
38 auto g2_point = from_buffer<g2::affine_element>(g2_buf);
39
40 // build in-memory CRS
41 MemBn254CrsFactory mem_crs(g1_points, g2_point);
42
43 // prover CRS
44 auto f_prover = file_crs.get_crs(num_points);
45 auto m_prover = mem_crs.get_crs(num_points);
46 EXPECT_EQ(m_prover->get_monomial_size(), f_prover->get_monomial_size());
47 for (size_t i = 0; i < num_points; ++i) {
48 EXPECT_EQ(std::make_pair(i, m_prover->get_monomial_points()[i]),
49 std::make_pair(i, f_prover->get_monomial_points()[i]));
50 }
51 // verifier CRS
52 auto f_ver = file_crs.get_verifier_crs();
53 auto m_ver = mem_crs.get_verifier_crs();
54 EXPECT_EQ(m_ver->get_g2x(), f_ver->get_g2x());
55 EXPECT_EQ(0,
56 memcmp(m_ver->get_precomputed_g2_lines(),
57 f_ver->get_precomputed_g2_lines(),
58 sizeof(pairing::miller_lines) * 2));
59}
60
61// Grumpkin consistency checker
62void check_grumpkin_consistency(const fs::path& crs_download_path, size_t num_points, bool allow_download)
63{
64 NativeGrumpkinCrsFactory file_crs(crs_download_path, allow_download);
65
66 // read G1
67 std::vector<Grumpkin::AffineElement> points(num_points);
68 auto data =
69 read_file(bb::srs::bb_crs_path() / "grumpkin_g1.flat.dat", num_points * sizeof(Grumpkin::AffineElement));
70
71 for (size_t i = 0; i < num_points; ++i) {
72 points[i] = from_buffer<Grumpkin::AffineElement>(data, i * sizeof(g1::affine_element));
73 }
74 MemGrumpkinCrsFactory mem_crs(points);
75
76 // prover CRS
77 auto f_prover = file_crs.get_crs(num_points);
78 auto m_prover = mem_crs.get_crs(num_points);
79 EXPECT_EQ(m_prover->get_monomial_size(), f_prover->get_monomial_size());
80 for (size_t i = 0; i < num_points; ++i) {
81 EXPECT_EQ(std::make_pair(i, m_prover->get_monomial_points()[i]),
82 std::make_pair(i, f_prover->get_monomial_points()[i]));
83 }
84}
85} // namespace
86
88{
89 check_bn254_consistency(bb::srs::bb_crs_path(), 1024, /*allow_download=*/false);
90 const std::filesystem::path& temp_crs_path = "barretenberg_srs_test_crs_bn254";
91 fs::remove_all(temp_crs_path);
92 fs::create_directories(temp_crs_path);
93 // Tiny download check to test the 'net CRS' path
94 ASSERT_ANY_THROW(check_bn254_consistency(temp_crs_path, 1, /*allow_download=*/false));
95 check_bn254_consistency(temp_crs_path, 1, /*allow_download=*/true);
96}
97
98TEST(CrsFactory, grumpkin)
99{
100 check_grumpkin_consistency(bb::srs::bb_crs_path(), 1024, /*allow_download=*/false);
101 const std::filesystem::path& temp_crs_path = "barretenberg_srs_test_crs_grumpkin";
102 fs::remove_all(temp_crs_path);
103 fs::create_directories(temp_crs_path);
104 // Tiny download check to test the 'net CRS' path
105 ASSERT_ANY_THROW(check_grumpkin_consistency(temp_crs_path, 1, /*allow_download=*/false));
106 check_grumpkin_consistency(temp_crs_path, 1, /*allow_download=*/true);
107}
108
109TEST(CrsFactory, Bn254Fallback)
110{
111 // Test that fallback works when primary URL fails
112 const std::filesystem::path& temp_crs_path = "barretenberg_srs_test_crs_bn254_fallback";
113 fs::remove_all(temp_crs_path);
114 fs::create_directories(temp_crs_path);
115
116 // Use a bad primary URL that will fail, forcing fallback to the real S3 URL
117 std::string bad_primary = "http://nonexistent.invalid/g1.dat";
118 std::string good_fallback = "http://crs.aztec-labs.com/g1.dat";
119
120 // This should succeed by falling back to the working URL
121 auto points = bb::get_bn254_g1_data(temp_crs_path, 1, /*allow_download=*/true, bad_primary, good_fallback);
122 EXPECT_EQ(points.size(), 1);
123 // Verify the downloaded point matches the expected first element
124 EXPECT_EQ(points[0], bb::srs::BN254_G1_FIRST_ELEMENT);
125
126 fs::remove_all(temp_crs_path);
127}
128
129TEST(CrsFactory, Bn254ChunkHashFirstChunk)
130{
131 // Verify that the first 8MB chunk of the cached CRS matches the embedded hash
132 auto data = read_file(bb::srs::bb_crs_path() / "bn254_g1.dat", bb::srs::SRS_CHUNK_SIZE_BYTES);
133 auto chunk = std::span<const uint8_t>(data.data(), data.size());
134 auto hash = bb::crypto::sha256(chunk);
135 EXPECT_EQ(hash, bb::srs::BN254_G1_CHUNK_HASHES[0]);
136}
137
138TEST(CrsFactory, Bn254ChunkHashCorruptionDetected)
139{
140 // Verify that corrupted data fails chunk hash verification
141 auto data = read_file(bb::srs::bb_crs_path() / "bn254_g1.dat", bb::srs::SRS_CHUNK_SIZE_BYTES);
142
143 // Corrupt a byte in the middle of the chunk
144 data[bb::srs::SRS_CHUNK_SIZE_BYTES / 2] ^= 0xFF;
145 auto chunk = std::span<const uint8_t>(data.data(), data.size());
146 auto hash = bb::crypto::sha256(chunk);
147 EXPECT_NE(hash, bb::srs::BN254_G1_CHUNK_HASHES[0]);
148}
typename Group::affine_element AffineElement
Definition grumpkin.hpp:65
const std::vector< MemoryValue > data
Sha256Hash sha256(const ByteContainer &input)
SHA-256 hash function (FIPS 180-4)
Definition sha256.cpp:150
const size_t num_points
std::filesystem::path bb_crs_path()
constexpr g1::affine_element BN254_G1_FIRST_ELEMENT
Expected first G1 element from BN254 CRS.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< g1::affine_element > get_bn254_g1_data(const std::filesystem::path &path, size_t num_points, bool allow_download, const std::string &primary_url, const std::string &fallback_url)
std::vector< uint8_t > read_file(const std::string &filename, size_t bytes=0)
Definition file_io.hpp:29
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13