2#include <gmock/gmock.h>
3#include <gtest/gtest.h>
35using ::testing::Return;
36using ::testing::StrictMock;
38using tracegen::EccTraceBuilder;
39using tracegen::TestTraceContainer;
40using tracegen::ToRadixTraceBuilder;
47using EccSimulator = simulation::Ecc;
48using ToRadixSimulator = simulation::ToRadix;
50using simulation::EccAddEvent;
51using simulation::EccAddMemoryEvent;
52using simulation::EventEmitter;
53using simulation::MemoryStore;
54using simulation::MockExecutionIdManager;
55using simulation::MockGreaterThan;
56using simulation::MockMemory;
57using simulation::NoopEventEmitter;
58using simulation::PureGreaterThan;
59using simulation::PureToRadix;
60using simulation::ScalarMulEvent;
61using simulation::ToRadixEvent;
62using simulation::ToRadixMemoryEvent;
65FF p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
66FF p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
69FF q_x(
"0x009242167ec31949c00cbe441cd36757607406e87844fa2c8c4364a4403e66d7");
70FF q_y(
"0x0fe3016d64cfa8045609f375284b6b739b5fa282e4cbb75cc7f1687ecc7420e3");
73TEST(EccAddConstrainingTest, EccEmptyRow)
78TEST(EccAddConstrainingTest, EccAdd)
81 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
82 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
85 auto trace = TestTraceContainer({ {
87 { C::ecc_double_op, 0 },
90 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
91 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
93 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
96 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
97 { C::ecc_p_x, p.x() },
98 { C::ecc_p_y, p.y() },
101 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
102 { C::ecc_q_x, q.x() },
103 { C::ecc_q_y, q.y() },
106 { C::ecc_r_x, r.x() },
107 { C::ecc_r_y, r.y() },
109 { C::ecc_result_infinity, 0 },
112 { C::ecc_use_computed_result, 1 },
113 { C::ecc_x_match, 0 },
114 { C::ecc_y_match, 0 },
118 check_relation<ecc>(trace);
121TEST(EccAddConstrainingTest, EccDouble)
124 FF r_x(
"0x088b996194bb5e6e8e5e49733bb671c3e660cf77254f743f366cc8e33534ee3b");
125 FF r_y(
"0x2807ffa01c0f522d0be1e1acfb6914ac8eabf1acf420c0629d37beee992e9a0e");
128 auto trace = TestTraceContainer({ {
129 { C::ecc_add_op, 0 },
130 { C::ecc_double_op, 1 },
132 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
136 { C::ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2) },
139 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
140 { C::ecc_p_x, p.x() },
141 { C::ecc_p_y, p.y() },
144 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
145 { C::ecc_q_x, p.x() },
146 { C::ecc_q_y, p.y() },
149 { C::ecc_r_x, r.x() },
150 { C::ecc_r_y, r.y() },
152 { C::ecc_result_infinity, 0 },
155 { C::ecc_use_computed_result, 1 },
156 { C::ecc_x_match, 1 },
157 { C::ecc_y_match, 1 },
161 check_relation<ecc>(trace);
170TEST(EccAddConstrainingTest, EccAddSameYDifferentX)
173 FF local_p_x(
"0x04c95d1b26d63d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
174 FF local_p_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
179 FF local_q_x(
"0x14dd39aa19e1c8b29e0c530a28106a7d64d2213486baba3c86dce51bdddf75bb");
180 FF local_q_y(
"0x035b6dd9e63c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
184 ASSERT_NE(local_p.x(), local_q.x());
185 ASSERT_EQ(local_p.y(), local_q.y());
188 FF local_r_x(
"0x16bdb7ada0799a3088b9dd3faade12c3f79dbfe9cb1234783a1a7add546398dc");
189 FF local_r_y(
"0x2d08e098faf58cb97223d13f2a1b87dd6614173f3cefe87ca6a74e3034c244a1");
193 EventEmitter<EccAddEvent> ecc_add_event_emitter;
194 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
195 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
199 PureToRadix to_radix_simulator;
203 ecc_add_event_emitter,
204 scalar_mul_event_emitter,
205 ecc_add_memory_event_emitter);
209 ASSERT_EQ(
result, local_r) <<
"Simulation produced wrong result";
212 TestTraceContainer
trace;
214 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
217 check_relation<ecc>(trace);
220TEST(EccAddConstrainingTest, EccAddResultingInInfinity)
226 auto trace = TestTraceContainer({ {
227 { C::ecc_add_op, 0 },
228 { C::ecc_double_op, 0 },
232 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
234 { C::ecc_lambda, 0 },
237 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
238 { C::ecc_p_x, p.x() },
239 { C::ecc_p_y, p.y() },
242 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
243 { C::ecc_q_x, q.x() },
244 { C::ecc_q_y, q.y() },
247 { C::ecc_r_x, r.x() },
248 { C::ecc_r_y, r.y() },
250 { C::ecc_result_infinity, 1 },
253 { C::ecc_x_match, 1 },
254 { C::ecc_y_match, 0 },
257 check_relation<ecc>(trace);
260TEST(EccAddConstrainingTest, EccAddingToInfinity)
268 auto trace = TestTraceContainer({ {
269 { C::ecc_add_op, 1 },
270 { C::ecc_double_op, 0 },
273 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
274 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
276 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
279 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
280 { C::ecc_p_x, p.x() },
281 { C::ecc_p_y, p.y() },
284 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
285 { C::ecc_q_x, q.x() },
286 { C::ecc_q_y, q.y() },
289 { C::ecc_r_x, r.x() },
290 { C::ecc_r_y, r.y() },
292 { C::ecc_result_infinity, 0 },
295 { C::ecc_x_match, 0 },
296 { C::ecc_y_match, 0 },
299 check_relation<ecc>(trace);
302TEST(EccAddConstrainingTest, EccAddingInfinity)
309 auto trace = TestTraceContainer({ {
310 { C::ecc_add_op, 1 },
311 { C::ecc_double_op, 0 },
313 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
314 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
315 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
317 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
320 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
321 { C::ecc_p_x, p.x() },
322 { C::ecc_p_y, p.y() },
325 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
326 { C::ecc_q_x, q.x() },
327 { C::ecc_q_y, q.y() },
330 { C::ecc_r_x, r.x() },
331 { C::ecc_r_y, r.y() },
333 { C::ecc_result_infinity, 0 },
336 { C::ecc_x_match, 0 },
337 { C::ecc_y_match, 0 },
341 check_relation<ecc>(trace);
344TEST(EccAddConstrainingTest, EccDoublingInf)
351 auto trace = TestTraceContainer({ {
352 { C::ecc_add_op, 0 },
353 { C::ecc_double_op, 1 },
362 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
363 { C::ecc_p_x, p.x() },
364 { C::ecc_p_y, p.y() },
367 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
368 { C::ecc_q_x, p.x() },
369 { C::ecc_q_y, p.y() },
372 { C::ecc_r_x, r.x() },
373 { C::ecc_r_y, r.y() },
375 { C::ecc_result_infinity, 1 },
378 { C::ecc_x_match, 1 },
379 { C::ecc_y_match, 1 },
383 check_relation<ecc>(trace);
386TEST(EccAddConstrainingTest, EccTwoOps)
391 auto trace = TestTraceContainer({ {
392 { C::ecc_add_op, 1 },
393 { C::ecc_double_op, 0 },
396 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
397 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
399 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
402 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
403 { C::ecc_p_x, p.x() },
404 { C::ecc_p_y, p.y() },
407 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
408 { C::ecc_q_x, q.x() },
409 { C::ecc_q_y, q.y() },
412 { C::ecc_r_x, r1.x() },
413 { C::ecc_r_y, r1.y() },
415 { C::ecc_result_infinity, 0 },
418 { C::ecc_use_computed_result, 1 },
419 { C::ecc_x_match, 0 },
420 { C::ecc_y_match, 0 },
424 { C::ecc_add_op, 0 },
425 { C::ecc_double_op, 1 },
427 { C::ecc_inv_2_p_y, (r1.y() * 2).invert() },
431 { C::ecc_lambda, (r1.x() * r1.x() * 3) / (r1.y() * 2) },
434 { C::ecc_p_is_inf,
static_cast<int>(r1.is_infinity()) },
435 { C::ecc_p_x, r1.x() },
436 { C::ecc_p_y, r1.y() },
439 { C::ecc_q_is_inf,
static_cast<int>(r1.is_infinity()) },
440 { C::ecc_q_x, r1.x() },
441 { C::ecc_q_y, r1.y() },
444 { C::ecc_r_x, r2.x() },
445 { C::ecc_r_y, r2.y() },
447 { C::ecc_result_infinity, 0 },
450 { C::ecc_use_computed_result, 1 },
451 { C::ecc_x_match, 1 },
452 { C::ecc_y_match, 1 },
456 check_relation<ecc>(trace);
459TEST(EccAddConstrainingTest, EccNegativeBadAdd)
463 FF r_x(
"0x20f096ae3de9aea007e0b94a0274b2443d6682d1901f6909f284ec967bc169be");
464 FF r_y(
"0x27948713833bb314e828f2b6f45f408da6564a3ac03b9e430a9c6634bb849ef2");
467 auto trace = TestTraceContainer({ {
468 { C::ecc_add_op, 1 },
469 { C::ecc_double_op, 0 },
472 { C::ecc_inv_x_diff, (q.x() - p.x()).invert() },
473 { C::ecc_inv_y_diff, (q.y() - p.y()).invert() },
475 { C::ecc_lambda, (q.y() - p.y()) / (q.x() - p.x()) },
478 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
479 { C::ecc_p_x, p.x() },
480 { C::ecc_p_y, p.y() },
483 { C::ecc_q_is_inf,
static_cast<int>(q.is_infinity()) },
484 { C::ecc_q_x, q.x() },
485 { C::ecc_q_y, q.y() },
488 { C::ecc_r_x, r.x() },
489 { C::ecc_r_y, r.y() },
491 { C::ecc_result_infinity, 0 },
494 { C::ecc_x_match, 0 },
495 { C::ecc_y_match, 0 },
503TEST(EccAddConstrainingTest, EccNegativeBadDouble)
507 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
508 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
511 auto trace = TestTraceContainer({ {
512 { C::ecc_add_op, 0 },
513 { C::ecc_double_op, 1 },
515 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
519 { C::ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2) },
522 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
523 { C::ecc_p_x, p.x() },
524 { C::ecc_p_y, p.y() },
527 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
528 { C::ecc_q_x, p.x() },
529 { C::ecc_q_y, p.y() },
532 { C::ecc_r_x, r.x() },
533 { C::ecc_r_y, r.y() },
535 { C::ecc_result_infinity, 0 },
538 { C::ecc_x_match, 1 },
539 { C::ecc_y_match, 1 },
547TEST(ScalarMulConstrainingTest, ScalarMulEmptyRow)
552TEST(ScalarMulConstrainingTest, MulByOne)
556 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
557 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
558 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
561 StrictMock<MockGreaterThan>
gt;
562 PureToRadix to_radix_simulator = PureToRadix();
566 ecc_add_event_emitter,
567 scalar_mul_event_emitter,
568 ecc_add_memory_event_emitter);
571 ecc_simulator.scalar_mul(p, scalar);
573 TestTraceContainer
trace({
574 { { C::precomputed_first_row, 1 } },
577 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
579 check_relation<scalar_mul>(trace);
582TEST(ScalarMulConstrainingTest, BasicMul)
586 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
587 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
588 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
591 StrictMock<MockGreaterThan>
gt;
592 PureToRadix to_radix_simulator = PureToRadix();
596 ecc_add_event_emitter,
597 scalar_mul_event_emitter,
598 ecc_add_memory_event_emitter);
600 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
601 ecc_simulator.scalar_mul(p, scalar);
603 TestTraceContainer
trace({
604 { { C::precomputed_first_row, 1 } },
607 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
609 check_relation<scalar_mul>(trace);
613TEST(ScalarMulConstrainingTest, MulByZero)
617 EventEmitter<EccAddEvent> ecc_add_event_emitter;
618 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
619 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
622 StrictMock<MockGreaterThan>
gt;
623 PureToRadix to_radix_simulator = PureToRadix();
627 ecc_add_event_emitter,
628 scalar_mul_event_emitter,
629 ecc_add_memory_event_emitter);
636 ASSERT_TRUE(
result.is_infinity());
638 TestTraceContainer
trace({
639 { { C::precomputed_first_row, 1 } },
642 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
643 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
646 check_relation<scalar_mul>(trace);
647 check_relation<ecc>(trace);
651TEST(ScalarMulConstrainingTest, MulByLargeScalar)
655 EventEmitter<EccAddEvent> ecc_add_event_emitter;
656 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
657 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
660 StrictMock<MockGreaterThan>
gt;
661 PureToRadix to_radix_simulator = PureToRadix();
665 ecc_add_event_emitter,
666 scalar_mul_event_emitter,
667 ecc_add_memory_event_emitter);
671 FF scalar =
FF(
"0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff");
679 TestTraceContainer
trace({
680 { { C::precomputed_first_row, 1 } },
683 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
684 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
687 check_relation<scalar_mul>(trace);
688 check_relation<ecc>(trace);
691TEST(ScalarMulConstrainingTest, MultipleInvocations)
695 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
696 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
697 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
700 StrictMock<MockGreaterThan>
gt;
701 PureToRadix to_radix_simulator = PureToRadix();
705 ecc_add_event_emitter,
706 scalar_mul_event_emitter,
707 ecc_add_memory_event_emitter);
709 ecc_simulator.scalar_mul(p,
FF(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6"));
710 ecc_simulator.scalar_mul(q,
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09"));
712 TestTraceContainer
trace({
713 { { C::precomputed_first_row, 1 } },
716 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
718 check_relation<scalar_mul>(trace);
721TEST(ScalarMulConstrainingTest, MulInteractions)
725 EventEmitter<EccAddEvent> ecc_add_event_emitter;
726 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
727 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
728 EventEmitter<ToRadixEvent> to_radix_event_emitter;
729 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
732 StrictMock<MockGreaterThan>
gt;
733 ToRadixSimulator to_radix_simulator(
execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
737 ecc_add_event_emitter,
738 scalar_mul_event_emitter,
739 ecc_add_memory_event_emitter);
741 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
742 ecc_simulator.scalar_mul(p, scalar);
744 TestTraceContainer
trace({
745 { { C::precomputed_first_row, 1 } },
748 ToRadixTraceBuilder to_radix_builder;
749 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
750 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
751 to_radix_builder.
process(to_radix_event_emitter.dump_events(), trace);
759TEST(ScalarMulConstrainingTest, MulAddInteractionsInfinity)
763 EventEmitter<EccAddEvent> ecc_add_event_emitter;
764 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
765 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
768 StrictMock<MockGreaterThan>
gt;
769 PureToRadix to_radix_simulator = PureToRadix();
773 ecc_add_event_emitter,
774 scalar_mul_event_emitter,
775 ecc_add_memory_event_emitter);
782 ASSERT_TRUE(
result.is_infinity());
783 EXPECT_EQ(
result.x(), inf.x());
784 EXPECT_EQ(
result.y(), inf.y());
786 TestTraceContainer
trace({
787 { { C::precomputed_first_row, 1 } },
790 auto scalar_mul_events = scalar_mul_event_emitter.dump_events();
792 for (
auto&
event : scalar_mul_events) {
793 EXPECT_EQ(
event.point.x(), inf.x());
794 EXPECT_EQ(
event.point.y(), inf.y());
797 builder.process_scalar_mul(scalar_mul_events, trace);
798 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
800 check_interaction<EccTraceBuilder, lookup_scalar_mul_double_settings, lookup_scalar_mul_add_settings>(trace);
802 check_relation<scalar_mul>(trace);
803 check_relation<ecc>(trace);
806TEST(ScalarMulConstrainingTest, NegativeMulAddInteractions)
810 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
811 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
812 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
815 StrictMock<MockGreaterThan>
gt;
816 PureToRadix to_radix_simulator = PureToRadix();
820 ecc_add_event_emitter,
821 scalar_mul_event_emitter,
822 ecc_add_memory_event_emitter);
824 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
825 ecc_simulator.scalar_mul(p, scalar);
827 TestTraceContainer
trace({
828 { { C::precomputed_first_row, 1 } },
831 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
834 "Failed.*SCALAR_MUL_DOUBLE. Could not find tuple in destination.");
836 "Failed.*SCALAR_MUL_ADD. Could not find tuple in destination.");
839TEST(ScalarMulConstrainingTest, NegativeMulRadixInteractions)
843 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
844 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
845 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
848 StrictMock<MockGreaterThan>
gt;
849 PureToRadix to_radix_simulator = PureToRadix();
853 ecc_add_event_emitter,
854 scalar_mul_event_emitter,
855 ecc_add_memory_event_emitter);
857 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
858 ecc_simulator.scalar_mul(p, scalar);
860 TestTraceContainer
trace({
861 { { C::precomputed_first_row, 1 } },
864 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
867 "Failed.*SCALAR_MUL_TO_RADIX. Could not find tuple in destination.");
869 check_relation<scalar_mul>(trace);
872TEST(ScalarMulConstrainingTest, NegativeDisableSel)
876 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
877 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
878 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
881 StrictMock<MockGreaterThan>
gt;
882 PureToRadix to_radix_simulator = PureToRadix();
886 ecc_add_event_emitter,
887 scalar_mul_event_emitter,
888 ecc_add_memory_event_emitter);
890 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
891 ecc_simulator.scalar_mul(p, scalar);
893 TestTraceContainer
trace({
894 { { C::precomputed_first_row, 1 } },
897 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
899 trace.
set(Column::scalar_mul_sel, 5, 0);
904TEST(ScalarMulConstrainingTest, NegativeEnableStartFirstRow)
908 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
909 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
910 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
913 StrictMock<MockGreaterThan>
gt;
914 PureToRadix to_radix_simulator = PureToRadix();
918 ecc_add_event_emitter,
919 scalar_mul_event_emitter,
920 ecc_add_memory_event_emitter);
922 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
923 ecc_simulator.scalar_mul(p, scalar);
925 TestTraceContainer
trace({
926 { { C::precomputed_first_row, 1 } },
929 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
931 trace.
set(Column::scalar_mul_start, 0, 1);
936TEST(ScalarMulConstrainingTest, NegativeMutateScalarOnEnd)
940 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
941 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
942 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
945 StrictMock<MockGreaterThan>
gt;
946 PureToRadix to_radix_simulator = PureToRadix();
950 ecc_add_event_emitter,
951 scalar_mul_event_emitter,
952 ecc_add_memory_event_emitter);
954 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
955 ecc_simulator.scalar_mul(p, scalar);
957 TestTraceContainer
trace({
958 { { C::precomputed_first_row, 1 } },
961 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
963 trace.
set(Column::scalar_mul_scalar, 254, 27);
968TEST(ScalarMulConstrainingTest, NegativeMutatePointXOnEnd)
972 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
973 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
974 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
977 StrictMock<MockGreaterThan>
gt;
978 PureToRadix to_radix_simulator = PureToRadix();
982 ecc_add_event_emitter,
983 scalar_mul_event_emitter,
984 ecc_add_memory_event_emitter);
986 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
987 ecc_simulator.scalar_mul(p, scalar);
989 TestTraceContainer
trace({
990 { { C::precomputed_first_row, 1 } },
993 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
995 trace.
set(Column::scalar_mul_point_x, 254, q.x());
1001TEST(ScalarMulConstrainingTest, NegativeMutatePointYOnEnd)
1005 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
1006 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1007 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1010 StrictMock<MockGreaterThan>
gt;
1011 PureToRadix to_radix_simulator = PureToRadix();
1015 ecc_add_event_emitter,
1016 scalar_mul_event_emitter,
1017 ecc_add_memory_event_emitter);
1019 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
1020 ecc_simulator.scalar_mul(p, scalar);
1022 TestTraceContainer
trace({
1023 { { C::precomputed_first_row, 1 } },
1026 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
1028 trace.
set(Column::scalar_mul_point_y, 254, q.y());
1034TEST(ScalarMulConstrainingTest, NegativeMutatePointInfOnEnd)
1038 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
1039 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1040 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1043 StrictMock<MockGreaterThan>
gt;
1044 PureToRadix to_radix_simulator = PureToRadix();
1048 ecc_add_event_emitter,
1049 scalar_mul_event_emitter,
1050 ecc_add_memory_event_emitter);
1052 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
1053 ecc_simulator.scalar_mul(p, scalar);
1055 TestTraceContainer
trace({
1056 { { C::precomputed_first_row, 1 } },
1059 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
1061 trace.
set(Column::scalar_mul_point_inf, 254, 1);
1071TEST(EccAddMemoryConstrainingTest, EccAddMemoryEmptyRow)
1076TEST(EccAddMemoryConstrainingTest, EccAddMemory)
1078 TestTraceContainer
trace;
1082 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1083 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1084 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1085 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1089 .WillRepeatedly(Return(0));
1091 PureToRadix to_radix_simulator = PureToRadix();
1095 ecc_add_event_emitter,
1096 scalar_mul_event_emitter,
1097 ecc_add_memory_event_emitter);
1101 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1102 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
1104 check_relation<mem_aware_ecc>(trace);
1107TEST(EccAddMemoryConstrainingTest, EccAddMemoryInteractions)
1115 .WillRepeatedly(Return(0));
1117 PureToRadix to_radix_simulator = PureToRadix();
1119 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1120 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1121 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1122 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1126 ecc_add_event_emitter,
1127 scalar_mul_event_emitter,
1128 ecc_add_memory_event_emitter);
1134 TestTraceContainer
trace = TestTraceContainer({
1138 { C::execution_sel, 1 },
1139 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1141 { C::execution_register_0_, p.x() },
1142 { C::execution_register_1_, p.y() },
1143 { C::execution_register_2_, q.x() },
1144 { C::execution_register_3_, q.y() },
1148 { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS },
1152 { C::memory_value,
result.x() },
1153 { C::memory_sel, 1 },
1154 { C::memory_rw, 1 },
1160 { C::memory_value,
result.y() },
1161 { C::memory_sel, 1 },
1162 { C::memory_rw, 1 },
1169 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1170 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
1172 check_all_interactions<EccTraceBuilder>(trace);
1173 check_relation<mem_aware_ecc>(trace);
1176TEST(EccAddMemoryConstrainingTest, EccAddMemoryInvalidDstRange)
1182 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1183 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1184 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1185 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1189 .WillRepeatedly(Return(0));
1191 PureToRadix to_radix_simulator = PureToRadix();
1196 ecc_add_event_emitter,
1197 scalar_mul_event_emitter,
1198 ecc_add_memory_event_emitter);
1202 TestTraceContainer
trace = TestTraceContainer({
1206 { C::execution_sel, 1 },
1207 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1209 { C::execution_register_0_, p.x() },
1210 { C::execution_register_1_, p.y() },
1211 { C::execution_register_2_, q.x() },
1212 { C::execution_register_3_, q.y() },
1213 { C::execution_sel_opcode_error, 1 },
1216 { C::gt_input_a,
static_cast<uint64_t
>(
dst_address) + 1 },
1217 { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS },
1224 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1225 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1227 check_all_interactions<EccTraceBuilder>(trace);
1228 check_relation<mem_aware_ecc>(trace);
1231TEST(EccAddMemoryConstrainingTest, EccAddMemoryPointError)
1236 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1237 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1238 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1242 .WillRepeatedly(Return(0));
1244 PureToRadix to_radix_simulator = PureToRadix();
1249 ecc_add_event_emitter,
1250 scalar_mul_event_emitter,
1251 ecc_add_memory_event_emitter);
1254 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
1255 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
1262 TestTraceContainer
trace = TestTraceContainer({
1266 { C::execution_sel, 1 },
1267 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1269 { C::execution_register_0_, p.x() },
1270 { C::execution_register_1_, p.y() },
1271 { C::execution_register_2_, q.x() },
1272 { C::execution_register_3_, q.y() },
1273 { C::execution_sel_opcode_error, 1 },
1277 { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS },
1282 EXPECT_THROW(ecc_simulator.add(memory, p, q,
dst_address), simulation::EccException);
1284 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1286 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1288 check_all_interactions<EccTraceBuilder>(trace);
1289 check_relation<mem_aware_ecc>(trace);
1292TEST(EccAddMemoryConstrainingTest, InfinityRepresentations)
1297 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1298 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1299 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1303 .WillRepeatedly(Return(0));
1305 PureToRadix to_radix_simulator = PureToRadix();
1309 ecc_add_event_emitter,
1310 scalar_mul_event_emitter,
1311 ecc_add_memory_event_emitter);
1319 EXPECT_EQ(inf_bb, inf);
1320 TestTraceContainer
trace;
1323 ecc_simulator.add(memory, inf, inf_bb,
dst_address);
1325 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
1326 check_relation<ecc>(trace);
1327 EXPECT_EQ(
trace.
get(C::ecc_double_op, 0), 1);
1329 ecc_simulator.add(memory, inf, inf_bb,
dst_address);
1334 { C::execution_sel, 1 },
1335 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1337 { C::execution_register_0_, inf.x() },
1338 { C::execution_register_1_, inf.y() },
1339 { C::execution_register_2_, inf_bb.x() },
1340 { C::execution_register_3_, inf_bb.y() },
1344 { C::gt_input_b, AVM_HIGHEST_MEM_ADDRESS },
1345 { C::gt_res, 0 } } });
1347 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1350 trace.
set(C::ecc_add_mem_p_is_inf, 0, 0);
1352 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_P_CURVE_EQN));
1355 trace.
set(C::ecc_add_mem_q_x, 0, 1);
1356 trace.
set(C::ecc_add_mem_q_y, 0, 2);
1358 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_Q_INF_X_CHECK));
1360 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_Q_INF_Y_CHECK));
1367TEST(EccAddMemoryConstrainingTest, EccAddMemoryNotInfCheckHappyPath)
1372 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1373 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1374 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1379 PureToRadix to_radix_simulator = PureToRadix();
1383 ecc_add_event_emitter,
1384 scalar_mul_event_emitter,
1385 ecc_add_memory_event_emitter);
1395 TestTraceContainer
trace;
1396 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1398 check_relation<mem_aware_ecc>(trace, mem_aware_ecc::SR_P_NOT_INF_CHECK);
1399 check_relation<mem_aware_ecc>(trace, mem_aware_ecc::SR_Q_NOT_INF_CHECK);
1407TEST(EccAddMemoryConstrainingTest, EccAddMemoryNegativeClaimInfPIsNotInf)
1412 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1413 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1414 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1419 PureToRadix to_radix_simulator = PureToRadix();
1423 ecc_add_event_emitter,
1424 scalar_mul_event_emitter,
1425 ecc_add_memory_event_emitter);
1431 TestTraceContainer
trace;
1432 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1435 check_relation<mem_aware_ecc>(trace, mem_aware_ecc::SR_P_NOT_INF_CHECK);
1438 trace.
set(C::ecc_add_mem_p_is_inf, 0, 0);
1440 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_P_NOT_INF_CHECK));
1444 trace.
set(C::ecc_add_mem_p_x_inf_diff_inv, 0,
FF(123));
1445 trace.
set(C::ecc_add_mem_p_y_inf_diff_inv, 0,
FF(456));
1447 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_P_NOT_INF_CHECK));
1450TEST(EccAddMemoryConstrainingTest, EccAddMemoryNegativeClaimInfQIsNotInf)
1455 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1456 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1457 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1462 PureToRadix to_radix_simulator = PureToRadix();
1466 ecc_add_event_emitter,
1467 scalar_mul_event_emitter,
1468 ecc_add_memory_event_emitter);
1474 TestTraceContainer
trace;
1475 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1477 check_relation<mem_aware_ecc>(trace, mem_aware_ecc::SR_Q_NOT_INF_CHECK);
1479 trace.
set(C::ecc_add_mem_q_is_inf, 0, 0);
1481 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_Q_NOT_INF_CHECK));
1483 trace.
set(C::ecc_add_mem_q_x_inf_diff_inv, 0,
FF(123));
1484 trace.
set(C::ecc_add_mem_q_y_inf_diff_inv, 0,
FF(456));
1486 mem_aware_ecc::get_subrelation_label(mem_aware_ecc::SR_Q_NOT_INF_CHECK));
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
static const StandardAffinePoint & infinity()
static constexpr size_t SR_OUTPUT_X_COORD
static std::string get_subrelation_label(size_t index)
static std::string get_subrelation_label(size_t index)
static constexpr size_t SR_INPUT_CONSISTENCY_X
static constexpr size_t SR_TRACE_CONTINUITY
static constexpr size_t SR_INPUT_CONSISTENCY_INF
static constexpr size_t SR_INPUT_CONSISTENCY_Y
static constexpr size_t SR_SEL_ON_START_OR_END
static constexpr size_t SR_INPUT_CONSISTENCY_SCALAR
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
const FF & get(Column col, uint32_t row) const
uint32_t get_num_rows() const
void set(Column col, uint32_t row, const FF &value, bool use_atomic_limbs=false)
static constexpr affine_element infinity()
ExecutionIdManager execution_id_manager
void check_interaction(tracegen::TestTraceContainer &trace)
TEST(AvmFixedVKTests, FixedVKCommitments)
Test that the fixed VK commitments agree with the ones computed from precomputed columns.
TestTraceContainer empty_trace()
lookup_settings< lookup_scalar_mul_double_settings_ > lookup_scalar_mul_double_settings
StandardAffinePoint< AvmFlavorSettings::EmbeddedCurve::AffineElement > EmbeddedCurvePoint
AvmFlavorSettings::G1::Fq Fq
lookup_settings< lookup_scalar_mul_to_radix_settings_ > lookup_scalar_mul_to_radix_settings
lookup_settings< lookup_scalar_mul_add_settings_ > lookup_scalar_mul_add_settings
simulation::PublicDataTreeReadWriteEvent event
static constexpr field zero()