66 auto [proof1, vk1] = generate_chonk_proof();
67 auto [proof2, vk2] = generate_chonk_proof();
69 ResultCollector collector;
79 collector.wait_for(2);
82 ASSERT_EQ(collector.results.size(), 2);
83 for (
auto& r : collector.results) {
84 EXPECT_TRUE(r.verified()) <<
"request_id=" << r.request_id <<
" error=" << r.error_message;
85 EXPECT_GT(r.time_in_verify_ms, 0);
92 auto [proof,
vk] = generate_chonk_proof();
94 ResultCollector collector;
104 ASSERT_EQ(collector.results.size(), 1);
105 EXPECT_TRUE(collector.results[0].verified());
106 EXPECT_EQ(collector.results[0].request_id, 42);
113 auto [good_proof, vk1] = generate_chonk_proof();
114 auto [bad_proof, vk2] = generate_chonk_proof();
117 ASSERT_FALSE(bad_proof.ipa_proof.empty());
118 bad_proof.ipa_proof[0] = bad_proof.ipa_proof[0] +
bb::fr(1);
120 ResultCollector collector;
129 collector.wait_for(2);
132 ASSERT_EQ(collector.results.size(), 2);
137 for (
auto& r : collector.results) {
138 if (r.request_id == 1) {
141 if (r.request_id == 2) {
146 ASSERT_NE(good,
nullptr);
147 ASSERT_NE(bad,
nullptr);
149 EXPECT_FALSE(bad->
verified()) <<
"bad proof should fail";
162 auto [good_proof_template,
vk] = generate_chonk_proof();
173 { 42, 16, 0, 16, 4 },
175 { 8080, 30, 1, 30, 4 },
176 { 2025, 30, 10, 30, 4 },
177 { 6174, 30, 15, 30, 4 },
178 { 9999, 30, 29, 30, 4 },
179 { 1337, 30, 7, 8, 4 },
180 { 314, 12, 3, 12, 1 },
184 for (
const auto& [seed, total, num_bad, batch_size, num_cores] : cases) {
189 std::vector<size_t> indices(total);
190 std::iota(indices.begin(), indices.end(), 0);
192 for (
size_t i = total - 1; i > 0; --i) {
194 std::swap(indices[i], indices[dist(rng)]);
196 std::set<size_t> bad_indices(indices.begin(), indices.begin() +
static_cast<ptrdiff_t
>(num_bad));
200 proofs.reserve(total);
201 for (
size_t i = 0; i < total; ++i) {
202 proofs.push_back(good_proof_template);
203 if (bad_indices.count(i)) {
204 proofs.back().ipa_proof[0] = proofs.back().ipa_proof[0] +
bb::fr(1);
208 ResultCollector collector;
212 for (
size_t i = 0; i < total; ++i) {
217 collector.wait_for(total, std::chrono::seconds(300));
220 ASSERT_EQ(collector.results.size(), total);
221 std::sort(collector.results.begin(), collector.results.end(), [](
auto&
a,
auto&
b) {
222 return a.request_id < b.request_id;
224 for (
size_t i = 0; i < total; ++i) {
225 EXPECT_EQ(collector.results[i].request_id, i);
226 if (bad_indices.count(i)) {
227 EXPECT_FALSE(collector.results[i].verified()) <<
"proof " << i <<
" should fail";
229 EXPECT_TRUE(collector.results[i].verified()) <<
"proof " << i <<
" should pass";
237 auto [proof,
vk] = generate_chonk_proof();
239 ResultCollector collector;
248 collector.wait_for(1);
251 ASSERT_EQ(collector.results.size(), 1);
252 EXPECT_FALSE(collector.results[0].verified());
253 EXPECT_EQ(collector.results[0].request_id, 7);
254 EXPECT_NE(collector.results[0].error_message.find(
"invalid vk_index"), std::string::npos);
void start(std::vector< std::shared_ptr< MegaZKFlavor::VKAndHash > > vks, uint32_t num_cores, uint32_t batch_size, ResultCallback on_result)
Start the coordinator thread.