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 },
502TEST(EccAddConstrainingTest, EccNegativeBadDouble)
506 FF r_x(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6");
507 FF r_y(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
510 auto trace = TestTraceContainer({ {
511 { C::ecc_add_op, 0 },
512 { C::ecc_double_op, 1 },
514 { C::ecc_inv_2_p_y, (p.y() * 2).invert() },
518 { C::ecc_lambda, (p.x() * p.x() * 3) / (p.y() * 2) },
521 { C::ecc_p_is_inf,
static_cast<int>(p.is_infinity()) },
522 { C::ecc_p_x, p.x() },
523 { C::ecc_p_y, p.y() },
526 { C::ecc_q_is_inf,
static_cast<int>(p.is_infinity()) },
527 { C::ecc_q_x, p.x() },
528 { C::ecc_q_y, p.y() },
531 { C::ecc_r_x, r.x() },
532 { C::ecc_r_y, r.y() },
534 { C::ecc_result_infinity, 0 },
537 { C::ecc_x_match, 1 },
538 { C::ecc_y_match, 1 },
545TEST(ScalarMulConstrainingTest, ScalarMulEmptyRow)
550TEST(ScalarMulConstrainingTest, MulByOne)
554 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
555 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
556 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
559 StrictMock<MockGreaterThan>
gt;
560 PureToRadix to_radix_simulator = PureToRadix();
564 ecc_add_event_emitter,
565 scalar_mul_event_emitter,
566 ecc_add_memory_event_emitter);
569 ecc_simulator.scalar_mul(p, scalar);
571 TestTraceContainer
trace({
572 { { C::precomputed_first_row, 1 } },
575 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
577 check_relation<scalar_mul>(trace);
580TEST(ScalarMulConstrainingTest, BasicMul)
584 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
585 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
586 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
589 StrictMock<MockGreaterThan>
gt;
590 PureToRadix to_radix_simulator = PureToRadix();
594 ecc_add_event_emitter,
595 scalar_mul_event_emitter,
596 ecc_add_memory_event_emitter);
598 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
599 ecc_simulator.scalar_mul(p, scalar);
601 TestTraceContainer
trace({
602 { { C::precomputed_first_row, 1 } },
605 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
607 check_relation<scalar_mul>(trace);
611TEST(ScalarMulConstrainingTest, MulByZero)
615 EventEmitter<EccAddEvent> ecc_add_event_emitter;
616 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
617 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
620 StrictMock<MockGreaterThan>
gt;
621 PureToRadix to_radix_simulator = PureToRadix();
625 ecc_add_event_emitter,
626 scalar_mul_event_emitter,
627 ecc_add_memory_event_emitter);
634 ASSERT_TRUE(result.is_infinity());
636 TestTraceContainer
trace({
637 { { C::precomputed_first_row, 1 } },
640 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
641 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
644 check_relation<scalar_mul>(trace);
645 check_relation<ecc>(trace);
649TEST(ScalarMulConstrainingTest, MulByLargeScalar)
653 EventEmitter<EccAddEvent> ecc_add_event_emitter;
654 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
655 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
658 StrictMock<MockGreaterThan>
gt;
659 PureToRadix to_radix_simulator = PureToRadix();
663 ecc_add_event_emitter,
664 scalar_mul_event_emitter,
665 ecc_add_memory_event_emitter);
669 FF scalar =
FF(
"0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593efffffff");
677 TestTraceContainer
trace({
678 { { C::precomputed_first_row, 1 } },
681 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
682 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
685 check_relation<scalar_mul>(trace);
686 check_relation<ecc>(trace);
689TEST(ScalarMulConstrainingTest, MultipleInvocations)
693 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
694 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
695 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
698 StrictMock<MockGreaterThan>
gt;
699 PureToRadix to_radix_simulator = PureToRadix();
703 ecc_add_event_emitter,
704 scalar_mul_event_emitter,
705 ecc_add_memory_event_emitter);
707 ecc_simulator.scalar_mul(p,
FF(
"0x2b01df0ef6d941a826bea23bece8243cbcdc159d5e97fbaa2171f028e05ba9b6"));
708 ecc_simulator.scalar_mul(q,
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09"));
710 TestTraceContainer
trace({
711 { { C::precomputed_first_row, 1 } },
714 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
716 check_relation<scalar_mul>(trace);
719TEST(ScalarMulConstrainingTest, MulInteractions)
723 EventEmitter<EccAddEvent> ecc_add_event_emitter;
724 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
725 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
726 EventEmitter<ToRadixEvent> to_radix_event_emitter;
727 NoopEventEmitter<ToRadixMemoryEvent> to_radix_mem_event_emitter;
730 StrictMock<MockGreaterThan>
gt;
731 ToRadixSimulator to_radix_simulator(
execution_id_manager, gt, to_radix_event_emitter, to_radix_mem_event_emitter);
735 ecc_add_event_emitter,
736 scalar_mul_event_emitter,
737 ecc_add_memory_event_emitter);
739 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
740 ecc_simulator.scalar_mul(p, scalar);
742 TestTraceContainer
trace({
743 { { C::precomputed_first_row, 1 } },
746 ToRadixTraceBuilder to_radix_builder;
747 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
748 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
749 to_radix_builder.
process(to_radix_event_emitter.dump_events(), trace);
757TEST(ScalarMulConstrainingTest, MulAddInteractionsInfinity)
761 EventEmitter<EccAddEvent> ecc_add_event_emitter;
762 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
763 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
766 StrictMock<MockGreaterThan>
gt;
767 PureToRadix to_radix_simulator = PureToRadix();
771 ecc_add_event_emitter,
772 scalar_mul_event_emitter,
773 ecc_add_memory_event_emitter);
780 ASSERT_TRUE(result.is_infinity());
781 EXPECT_EQ(result.x(), inf.x());
782 EXPECT_EQ(result.y(), inf.y());
784 TestTraceContainer
trace({
785 { { C::precomputed_first_row, 1 } },
788 auto scalar_mul_events = scalar_mul_event_emitter.dump_events();
790 for (
auto&
event : scalar_mul_events) {
791 EXPECT_EQ(
event.point.x(), inf.x());
792 EXPECT_EQ(
event.point.y(), inf.y());
795 builder.process_scalar_mul(scalar_mul_events, trace);
796 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
798 check_interaction<EccTraceBuilder, lookup_scalar_mul_double_settings, lookup_scalar_mul_add_settings>(trace);
800 check_relation<scalar_mul>(trace);
801 check_relation<ecc>(trace);
804TEST(ScalarMulConstrainingTest, NegativeMulAddInteractions)
808 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
809 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
810 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
813 StrictMock<MockGreaterThan>
gt;
814 PureToRadix to_radix_simulator = PureToRadix();
818 ecc_add_event_emitter,
819 scalar_mul_event_emitter,
820 ecc_add_memory_event_emitter);
822 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
823 ecc_simulator.scalar_mul(p, scalar);
825 TestTraceContainer
trace({
826 { { C::precomputed_first_row, 1 } },
829 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
832 "Failed.*SCALAR_MUL_DOUBLE. Could not find tuple in destination.");
834 "Failed.*SCALAR_MUL_ADD. Could not find tuple in destination.");
837TEST(ScalarMulConstrainingTest, NegativeMulRadixInteractions)
841 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
842 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
843 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
846 StrictMock<MockGreaterThan>
gt;
847 PureToRadix to_radix_simulator = PureToRadix();
851 ecc_add_event_emitter,
852 scalar_mul_event_emitter,
853 ecc_add_memory_event_emitter);
855 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
856 ecc_simulator.scalar_mul(p, scalar);
858 TestTraceContainer
trace({
859 { { C::precomputed_first_row, 1 } },
862 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
865 "Failed.*SCALAR_MUL_TO_RADIX. Could not find tuple in destination.");
867 check_relation<scalar_mul>(trace);
870TEST(ScalarMulConstrainingTest, NegativeDisableSel)
874 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
875 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
876 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
879 StrictMock<MockGreaterThan>
gt;
880 PureToRadix to_radix_simulator = PureToRadix();
884 ecc_add_event_emitter,
885 scalar_mul_event_emitter,
886 ecc_add_memory_event_emitter);
888 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
889 ecc_simulator.scalar_mul(p, scalar);
891 TestTraceContainer
trace({
892 { { C::precomputed_first_row, 1 } },
895 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
897 trace.
set(Column::scalar_mul_sel, 5, 0);
901TEST(ScalarMulConstrainingTest, NegativeEnableStartFirstRow)
905 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
906 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
907 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
910 StrictMock<MockGreaterThan>
gt;
911 PureToRadix to_radix_simulator = PureToRadix();
915 ecc_add_event_emitter,
916 scalar_mul_event_emitter,
917 ecc_add_memory_event_emitter);
919 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
920 ecc_simulator.scalar_mul(p, scalar);
922 TestTraceContainer
trace({
923 { { C::precomputed_first_row, 1 } },
926 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
928 trace.
set(Column::scalar_mul_start, 0, 1);
930 "SEL_ON_START_OR_END");
933TEST(ScalarMulConstrainingTest, NegativeMutateScalarOnEnd)
937 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
938 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
939 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
942 StrictMock<MockGreaterThan>
gt;
943 PureToRadix to_radix_simulator = PureToRadix();
947 ecc_add_event_emitter,
948 scalar_mul_event_emitter,
949 ecc_add_memory_event_emitter);
951 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
952 ecc_simulator.scalar_mul(p, scalar);
954 TestTraceContainer
trace({
955 { { C::precomputed_first_row, 1 } },
958 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
960 trace.
set(Column::scalar_mul_scalar, 254, 27);
962 "INPUT_CONSISTENCY_SCALAR");
965TEST(ScalarMulConstrainingTest, NegativeMutatePointXOnEnd)
969 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
970 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
971 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
974 StrictMock<MockGreaterThan>
gt;
975 PureToRadix to_radix_simulator = PureToRadix();
979 ecc_add_event_emitter,
980 scalar_mul_event_emitter,
981 ecc_add_memory_event_emitter);
983 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
984 ecc_simulator.scalar_mul(p, scalar);
986 TestTraceContainer
trace({
987 { { C::precomputed_first_row, 1 } },
990 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
992 trace.
set(Column::scalar_mul_point_x, 254, q.x());
995 "INPUT_CONSISTENCY_X");
998TEST(ScalarMulConstrainingTest, NegativeMutatePointYOnEnd)
1002 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
1003 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1004 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1007 StrictMock<MockGreaterThan>
gt;
1008 PureToRadix to_radix_simulator = PureToRadix();
1012 ecc_add_event_emitter,
1013 scalar_mul_event_emitter,
1014 ecc_add_memory_event_emitter);
1016 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
1017 ecc_simulator.scalar_mul(p, scalar);
1019 TestTraceContainer
trace({
1020 { { C::precomputed_first_row, 1 } },
1023 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
1025 trace.
set(Column::scalar_mul_point_y, 254, q.y());
1028 "INPUT_CONSISTENCY_Y");
1031TEST(ScalarMulConstrainingTest, NegativeMutatePointInfOnEnd)
1035 NoopEventEmitter<EccAddEvent> ecc_add_event_emitter;
1036 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1037 NoopEventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1040 StrictMock<MockGreaterThan>
gt;
1041 PureToRadix to_radix_simulator = PureToRadix();
1045 ecc_add_event_emitter,
1046 scalar_mul_event_emitter,
1047 ecc_add_memory_event_emitter);
1049 FF scalar =
FF(
"0x0cc4c71e882bc62b7b3d1964a8540cb5211339dfcddd2e095fd444bf1aed4f09");
1050 ecc_simulator.scalar_mul(p, scalar);
1052 TestTraceContainer
trace({
1053 { { C::precomputed_first_row, 1 } },
1056 builder.process_scalar_mul(scalar_mul_event_emitter.dump_events(), trace);
1058 trace.
set(Column::scalar_mul_point_inf, 254, 1);
1061 "INPUT_CONSISTENCY_INF");
1068TEST(EccAddMemoryConstrainingTest, EccAddMemoryEmptyRow)
1073TEST(EccAddMemoryConstrainingTest, EccAddMemory)
1075 TestTraceContainer
trace;
1079 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1080 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1081 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1082 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1086 .WillRepeatedly(Return(0));
1088 PureToRadix to_radix_simulator = PureToRadix();
1092 ecc_add_event_emitter,
1093 scalar_mul_event_emitter,
1094 ecc_add_memory_event_emitter);
1098 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1099 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
1101 check_relation<mem_aware_ecc>(trace);
1104TEST(EccAddMemoryConstrainingTest, EccAddMemoryInteractions)
1112 .WillRepeatedly(Return(0));
1114 PureToRadix to_radix_simulator = PureToRadix();
1116 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1117 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1118 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1119 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1123 ecc_add_event_emitter,
1124 scalar_mul_event_emitter,
1125 ecc_add_memory_event_emitter);
1131 TestTraceContainer
trace = TestTraceContainer({
1135 { C::execution_sel, 1 },
1136 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1138 { C::execution_register_0_, p.x() },
1139 { C::execution_register_1_, p.y() },
1140 { C::execution_register_2_, q.x() },
1141 { C::execution_register_3_, q.y() },
1149 { C::memory_value, result.x() },
1150 { C::memory_sel, 1 },
1151 { C::memory_rw, 1 },
1157 { C::memory_value, result.y() },
1158 { C::memory_sel, 1 },
1159 { C::memory_rw, 1 },
1166 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1167 builder.process_add(ecc_add_event_emitter.dump_events(),
trace);
1169 check_all_interactions<EccTraceBuilder>(trace);
1170 check_relation<mem_aware_ecc>(trace);
1173TEST(EccAddMemoryConstrainingTest, EccAddMemoryInvalidDstRange)
1179 NoopEventEmitter<ToRadixEvent> to_radix_event_emitter;
1180 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1181 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1182 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1186 .WillRepeatedly(Return(0));
1188 PureToRadix to_radix_simulator = PureToRadix();
1193 ecc_add_event_emitter,
1194 scalar_mul_event_emitter,
1195 ecc_add_memory_event_emitter);
1199 TestTraceContainer
trace = TestTraceContainer({
1203 { C::execution_sel, 1 },
1204 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1206 { C::execution_register_0_, p.x() },
1207 { C::execution_register_1_, p.y() },
1208 { C::execution_register_2_, q.x() },
1209 { C::execution_register_3_, q.y() },
1210 { C::execution_sel_opcode_error, 1 },
1213 { C::gt_input_a,
static_cast<uint64_t
>(
dst_address) + 1 },
1221 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1222 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1224 check_all_interactions<EccTraceBuilder>(trace);
1225 check_relation<mem_aware_ecc>(trace);
1228TEST(EccAddMemoryConstrainingTest, EccAddMemoryPointError)
1233 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1234 NoopEventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1235 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1239 .WillRepeatedly(Return(0));
1241 PureToRadix to_radix_simulator = PureToRadix();
1246 ecc_add_event_emitter,
1247 scalar_mul_event_emitter,
1248 ecc_add_memory_event_emitter);
1251 FF p_x(
"0x0000000000063d46918a156cae92db1bcbc4072a27ec81dc82ea959abdbcf16a");
1252 FF p_y(
"0x00000000000c1370462c74775765d07fc21fd1093cc988149d3aa763bb3dbb60");
1259 TestTraceContainer
trace = TestTraceContainer({
1263 { C::execution_sel, 1 },
1264 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1266 { C::execution_register_0_, p.x() },
1267 { C::execution_register_1_, p.y() },
1268 { C::execution_register_2_, q.x() },
1269 { C::execution_register_3_, q.y() },
1270 { C::execution_sel_opcode_error, 1 },
1279 EXPECT_THROW(ecc_simulator.add(memory, p, q,
dst_address), simulation::EccException);
1281 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(), trace);
1283 EXPECT_EQ(ecc_add_event_emitter.get_events().size(), 0);
1285 check_all_interactions<EccTraceBuilder>(trace);
1286 check_relation<mem_aware_ecc>(trace);
1289TEST(EccAddMemoryConstrainingTest, InfinityRepresentations)
1294 EventEmitter<EccAddEvent> ecc_add_event_emitter;
1295 EventEmitter<ScalarMulEvent> scalar_mul_event_emitter;
1296 EventEmitter<EccAddMemoryEvent> ecc_add_memory_event_emitter;
1300 .WillRepeatedly(Return(0));
1302 PureToRadix to_radix_simulator = PureToRadix();
1306 ecc_add_event_emitter,
1307 scalar_mul_event_emitter,
1308 ecc_add_memory_event_emitter);
1316 EXPECT_EQ(inf_bb, inf);
1317 TestTraceContainer
trace;
1320 ecc_simulator.add(memory, inf, inf_bb,
dst_address);
1322 builder.process_add(ecc_add_event_emitter.dump_events(), trace);
1323 check_relation<ecc>(trace);
1324 EXPECT_EQ(
trace.
get(C::ecc_double_op, 0), 1);
1326 ecc_simulator.add(memory, inf, inf_bb,
dst_address);
1331 { C::execution_sel, 1 },
1332 { C::execution_sel_exec_dispatch_ecc_add, 1 },
1334 { C::execution_register_0_, inf.x() },
1335 { C::execution_register_1_, inf.y() },
1336 { C::execution_register_2_, inf.is_infinity() ? 1 : 0 },
1337 { C::execution_register_3_, inf_bb.x() },
1338 { C::execution_register_4_, inf_bb.y() },
1339 { C::execution_register_5_, inf_bb.is_infinity() ? 1 : 0 },
1344 { C::gt_res, 0 } } });
1346 builder.process_add_with_memory(ecc_add_memory_event_emitter.dump_events(),
trace);
1349 trace.
set(C::ecc_add_mem_p_is_inf, 0, 0);
1353 trace.
set(C::ecc_add_mem_q_x, 0, 1);
1354 trace.
set(C::ecc_add_mem_q_y, 0, 2);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#define AVM_HIGHEST_MEM_ADDRESS
static const StandardAffinePoint & infinity()
static constexpr size_t SR_OUTPUT_X_COORD
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)
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()